chef-infra - 获取 Chef 运行中的目录列表

标签 chef-infra

我正在使用 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/

相关文章:

chef-infra - 如何使用 Chef 自定义资源名称作为变量?

amazon-web-services - AWS、Packer、Vagrant 和 Chef 它们如何协同工作?

chef-infra - 使用 chef (solo) 如何设置 root 用户的密码?

chef-infra - Varnish HAproxy Recipe

json - 在 opsworks 中的自定义 json 中设置环境变量

ruby-on-rails - Chef 和应用程序部署

package - 使用 Chef 安装多个软件包

jenkins - 使用 Chef 自动化部署的最佳方法是什么

ruby - 在 Chef 中递归应用所有者/组

chef-infra - 如何在测试厨房中编写特定于平台的测试?