获取目录列表 mid chef 运行

Get list of directories mid chef run

我正在使用 Chef 来管理 Ubuntu 服务器。我正在为服务器上存在的每个用户添加一个控制台工具包,其中大部分是在第一个 Chef 运行 期间创建的。 运行首次使用 Chef 时,会创建用户,但此代码块不会将符号链接添加到工具包,也不会创建正确的 .bashrc 文件。我认为这是因为在创建用户之前 ruby Dir.open('/home') 在 运行 开始编译,因为文件在下一个 Chef 运行 上正确添加.

当这个食谱实际上是 运行 时,我如何获取目录列表以反映系统的当前状态?我认为 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

您不能在创建用户的同一位置(在循环内)或在此处使用完全相同的循环(我的意思是遍历您已安装的用户)来创建这些模板和 link由厨师而不是通过现有用户)?在我看来,那将是一个更好的解决方案。

但是,如果您仍想那样使用它,则必须使用 ruby_block 并动态声明模板和 link

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