12

我正在使用厨师创建文件资源

  file "somefile" do
     action :create_if_missing
  end

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

  1. 该文件是相对于 / 解释的,因此使用 ~/ 最终将文件放入 /~/
  2. 我正在通过 vagrant 启动这个厨师食谱,这些文件是由 root 创建的。因此,即使我可以让 ~/ 工作,它最终也会在 root 的家中。我不想硬编码以使用用户名 vagrant,因为它并不总是这样(我们也可以使用厨师客户端运行这些),并且node[:user]似乎是空的。

有没有办法在非 root 用户(在本例中为 vagrant)主目录中创建文件?

4

3 回答 3

18

线程很旧,但我刚才遇到了这个问题。

您可以为用户创建属性,例如: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
于 2014-01-15T13:21:39.737 回答
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

据我了解厨师的概念 - 每个食谱都应该是独立的。这意味着您应该只能将一个配方(其中任何一个)添加到 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
于 2012-10-13T09:56:27.633 回答