Chef infra 在运行中获取目录列表

Chef infra 在运行中获取目录列表,chef-infra,Chef Infra,我使用Chef来管理Ubuntu服务器。我正在为服务器上的每个用户添加一个控制台工具包,其中大多数是在第一次运行Chef时创建的。第一次运行Chef时,会创建用户,但这段代码不会将符号链接添加到工具箱中,也不会创建正确的.bashrc文件。我认为这是因为rubyDir.open('/home')是在创建用户之前在运行开始时编译的,因为在下一次运行时正确添加了文件 当这个配方实际运行时,我如何获得目录列表以反映系统的当前状态?我认为我需要考虑的可能是ruby_块,但我不确定如何在这里应用它 # L

我使用Chef来管理Ubuntu服务器。我正在为服务器上的每个用户添加一个控制台工具包,其中大多数是在第一次运行Chef时创建的。第一次运行Chef时,会创建用户,但这段代码不会将符号链接添加到工具箱中,也不会创建正确的.bashrc文件。我认为这是因为ruby
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
-辛苦学习过了。)