如何在 Chef 中循环 bash 例程?

How can I loop through bash routine in Chef?

我在 Chef 中有一个 bash 脚本,它通过 NTP 协议从 3 个实例 运行 NTP 服务器获取时间。目前的代码是

if not node.run_list.roles.include?("ntp_server")
  bash "ntpdate" do
    code <<-EOH
    /usr/sbin/ntpdate -s 10.204.255.15 10.204.251.41 10.204.251.21
    EOH
  end
end

这一直工作得很好。但是,我应该自动执行任务,例如如果其中一个实例被替换,则不需要手动干预来更新上面代码中的 IP。

为了实现这一点,我已经成功地获取了 运行 ntp_server 角色的实例。

ntp_servers = search(:node, 'role:ntp_server')

完成后,我无法将这些 IP 添加到上面代码中 Chef 中的 bash 子例程。

有人可以告诉我我应该如何实现吗?

  1. 您不应该使用 bash 块并为每个厨师 运行 调用 ntpdate。 ntpd 应该负责同步时钟,Chef 对此有 cookbook
  2. 您可以将 IP 地址移动到节点并在代码中使用加入。

    ...
    code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}"
    ...
    
  3. 请使用 ntp 食谱。

我设法解决了我在问题中发布的内容。我这样做的方法是使用模板,然后使用 bash 脚本。食谱代码现在看起来

ntp_servers = search(:node, 'role:ntp_server')

if not node.run_list.roles.include?("ntp_server")
  template "/usr/local/bin/ntpdate.sh" do
    source "ntpdate.sh.erb"
    owner "root"
    group "root"
    mode 0644
    variables(
      :ntp_servers => ntp_servers
    )
  end

  bash "ntpdate" do
    user "root"
    code <<-EOH
      bash /usr/local/bin/ntpdate.sh
    EOH
  end
end

完成后,我在 Chef 中创建了一个具有以下配置的模板

#!/bin/bash
/usr/sbin/ntpdate -s <% @ntp_servers.each do |ntp_server| -%> <%= ntp_server['ipaddress'] %> <% end -%>

这样我就无法动态添加属于角色ntp_server

的服务器的IP地址