Chef infra 在运行中获取目录列表
我使用Chef来管理Ubuntu服务器。我正在为服务器上的每个用户添加一个控制台工具包,其中大多数是在第一次运行Chef时创建的。第一次运行Chef时,会创建用户,但这段代码不会将符号链接添加到工具箱中,也不会创建正确的.bashrc文件。我认为这是因为rubyChef infra 在运行中获取目录列表,chef-infra,Chef Infra,我使用Chef来管理Ubuntu服务器。我正在为服务器上的每个用户添加一个控制台工具包,其中大多数是在第一次运行Chef时创建的。第一次运行Chef时,会创建用户,但这段代码不会将符号链接添加到工具箱中,也不会创建正确的.bashrc文件。我认为这是因为rubyDir.open('/home')是在创建用户之前在运行开始时编译的,因为在下一次运行时正确添加了文件 当这个配方实际运行时,我如何获得目录列表以反映系统的当前状态?我认为我需要考虑的可能是ruby_块,但我不确定如何在这里应用它 # L
Dir.open('/home')
是在创建用户之前在运行开始时编译的,因为在下一次运行时正确添加了文件
当这个配方实际运行时,我如何获得目录列表以反映系统的当前状态?我认为我需要考虑的可能是ruby_块
,但我不确定如何在这里应用它
# 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_块并动态地声明模板和链接
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
您是否可以将其添加到框中的/etc/skel中,以便在添加用户时自动创建它?ruby_块可能是解决方案是的,它也是一个定义或提供程序,因为在converge时间调用时会编译它(因此您的dir应该已经创建)。以两次通过的方式(两次chef运行)来实现这一点是另一种方法。我使用chef用户lwrp从数据包中添加用户,因此我无法找到循环来处理这一点。我一直在玩一些不同的方法来攻击它,但没有任何运气。因为这并不重要,我想我会接受它,只需要运行两次就可以完成所有设置。厨师资源链接现在是
Chef::Resource::Link.new
而不是Chef::Resource.Link.new
-辛苦学习过了。)