12

シェフを使用してファイル リソースを作成しています

  file "somefile" do
     action :create_if_missing
  end

そして、これをユーザーのホームディレクトリに置きたいです。私は2つの問題を抱えています:

  1. ファイルは / に対して相対的に解釈されるため、~/ を使用するとファイルは /~/ に配置されます。
  2. vagrant を介してこのシェフのレシピを起動しています。これらのファイルはルートによって作成されています。したがって、たとえ ~/ を機能させることができたとしても、それは root のホームになってしまいます。ユーザー名vagrantを使用するようにハードコーディングしたくありません。常にそうであるとは限らず(chefクライアントでもこれらを実行する可能性があります)、node[:user]空に見えるからです。

root 以外のユーザー (この場合は vagrant) のホーム ディレクトリにファイルを作成する方法はありますか?

4

3 に答える 3

2

これは、Chefレシピがrootユーザーによって実行されるためです。この回避策はどうですか

if File.exists? "/vagrant"
  user = "vagrant"
else
  user = "deployer"
end

file "/home/#{user}/foo" do
  ..
end
于 2012-10-12T21:32:21.583 に答える
0

私がシェフの概念を理解しているように、各レシピは自己完結型でなければなりません。つまり、1 つのレシピ (いずれか) を run_list に追加でき、空のマシンに正常にインストールされる必要があります。

あなたの場合、あなたの非ルートユーザーがすでにマシンに存在していると仮定しているように思えますが、これは私の前の声明と矛盾しています。レシピには、root 以外のユーザーを構成する別のレシピを含める必要があります。ユーザーを格納するために data_bag を使用する場合 (およびレシピ 'user::my_user' でユーザーを構成する必要がある場合)、レシピは次のようになります。

include_recipe 'user::my_user'
my_user = data_bag_item('user', 'my_user')

file ::File.join( my_user['home'], 'somefile' ) do
  action :create_if_missing
end
于 2012-10-13T09:56:27.633 に答える