提问者:小点点

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


我使用厨师创建文件资源

  file "somefile" do
     action :create_if_missing
  end

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

  1. 该文件是相对于/进行解释的,因此使用~/最终会将文件放入/~/
  2. 我通过vagrant发布了这个厨师食谱,这些文件是由root用户创建的。所以,即使我能开始工作,它也会在root的家里结束。我不想硬编码来使用用户名vagrant,因为它并不总是这样(我们也可以使用chef client运行它们),而且node[:user]看起来是空的

有没有办法在非root用户(在这种情况下是流浪者)的主目录中创建文件?


共3个答案

匿名用户

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

您可以为用户创建属性,例如: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

匿名用户

这是因为厨师食谱是由根用户运行的。这个变通方法怎么样

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

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

匿名用户

据我所知,厨师的概念——每个食谱都应该是独立的。这意味着你应该能够只添加一个配方(任何一个)到run_list,它应该被成功地安装在一个空的机器上。

在我看来,在您的情况下,您假设您的非root用户已经存在于机器上,这与我之前的陈述相矛盾。您的配方应包括另一个配方,用于配置非root用户。如果您使用一个数据包来存储用户(并且配方“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