【问题标题】:Get list of directories mid chef run获取厨师运行中的目录列表
【发布时间】:2020-06-10 16:25:44
【问题描述】:

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

【问题讨论】:

  • 你能不能把它添加到盒子上的 /etc/skel 中,以便它作为添加用户的一部分自动创建?
  • 一个 ruby​​_block 可能是解决方案,是的,一个定义或一个提供者,因为它会在收敛时被调用(因此你的目录已经创建)。以两次通过方式(两个厨师运行)来实现这一目标的另一种方式

标签: chef-infra


【解决方案1】:

你不能在你创建用户的同一个地方(循环内)创建这些模板和链接,或者在这里使用完全相同的循环(我的意思是通过你由厨师安装的用户而不是通过现有的用户)?这对我来说是一个更好的解决方案。

但如果你仍然想这样使用它,你必须使用 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

【讨论】:

  • 我正在使用主厨用户 lwrp 从数据包中添加用户,因此我无法使用循环来处理它。我一直在尝试一些不同的方法来攻击它,但是没有任何运气。由于这不是什么重要的事情,我想我会忍受它需要运行 2 次才能完成所有设置。
  • Chef 资源链接现在是 Chef::Resource::Link.new 而不是 Chef::Resource.Link.new - 学到了很多东西。 ;)
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多