chef在用户的主目录中创建文件

时间:2012-10-12 14:37:36

标签: chef vagrant

我正在使用chef来创建文件资源

  file "somefile" do
     action :create_if_missing
  end

我想把它放在用户的主目录中。我有两个问题:

  1. 该文件是相对于/解释的,所以使用〜/最终将文件放在/〜/
  2. 我正在通过流浪汉推出这个厨师食谱,这些文件是由root创建的。因此,即使我能够工作,它也会在root的家中结束。我不想硬编码使用用户名vagrant,因为它并不总是那样(我们也可以与Chef客户端一起运行),而node[:user]似乎是空的。
  3. 有没有办法在非root用户(在本例中为vagrant)主目录中创建文件?

3 个答案:

答案 0 :(得分:19)

线程已经老了,但我刚才遇到了这个问题。

您可以为用户创建属性,例如:default['mycookbook']['user']

然后在你的食谱中:

user = node['mycookbook']['user'] # user set in cookbook attrubute
# user = node['current_user'] # user running chef cookbook (on provisioned host)

home = node['etc']['passwd'][user]['dir'] # Chef DSL
# home = Dir.home(user) # It's Ruby

file "#{home}/somefile" do
  action :create_if_missing
end

答案 1 :(得分:2)

这是因为厨师食谱由root用户运行。这个解决方法怎么样

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

file "/home/#{user}/foo" do
  ..
end

答案 2 :(得分:0)

据我了解厨师的概念 - 每个食谱应该是自包含的。这意味着您应该只能将一个配方(其中任何一个)添加到run_list中,并且应该成功安装在空机器上。

在您的情况下,我认为您的非root用户已经存在于计算机上,这与我之前的声明相矛盾。您的食谱应包含另一个配方,用于配置非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