我正在使用 Chef 来管理 Ubuntu 服务器。我正在向服务器上的每个用户添加一个控制台工具包,其中大部分是在第一次 Chef 运行期间创建的。第一次运行 Chef 时,会创建用户,但此代码块不会将符号链接(symbolic link)添加到工具包,也不会创建正确的 .bashrc 文件。我认为这是因为 ruby Dir.open('/home')
正在运行开始时在创建用户之前进行编译,因为文件在下一次 Chef 运行时正确添加。
当这个配方实际运行时,我如何获得目录列表来反射(reflect)系统的当前状态?我认为 ruby_block
可能是我需要查看的内容,但我不确定如何在此处应用它。
# Loop over all user folders
Dir.open('/home').each do |user_dir|
next if user_dir.start_with?('.')
link "/home/#{user_dir}/.bash_it" do
to '/home/.bash_it/'
link_type :symbolic
end
template "/home/#{user_dir}/.bashrc" do
source 'bashrc.erb'
owner user_dir
group user_dir
mode '0644'
end
end
最佳答案
您不能在创建用户的同一位置(循环内)创建这些模板和链接吗?或者在此处使用完全相同的循环(我的意思是通过 Chef 安装的用户,而不是通过现有的用户)用户)?在我看来,这将是一个更好的解决方案。
但是如果你仍然想像这样使用它,你必须使用 ruby_block 并动态声明模板和链接
ruby_block 'Creating link and template' do
block do
Dir.open('/home').each do |user_dir|
next if user_dir.start_with?('.')
link = Chef::Resource::Link.new "/home/#{user_dir}/.bash_it", run_context
link.to '/home/.bash_it/'
link.link_type :symbolic
link.run_action :create
tplt = Chef::Resource::Template.new "/home/#{user_dir}/.bashrc", run_context
tplt.source 'bashrc.erb'
tplt.owner user_dir
tplt.group user_dir
tplt.mode '0644'
tplt.run_action :create
end
end
end
关于chef-infra - 获取 Chef 运行中的目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29651644/