如何在Chef中循环执行bash例程?

时间:2016-11-01 11:09:49

标签: bash chef-recipe

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

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子例程中。

有人能让我知道我应该如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

  1. 您不应该使用bash块并在每次主厨运行时调用ntpdate。 ntpd应该处理时钟同步,Chef为此cookbook
  2. 您可以将IP地址移动到节点并使用代码中的连接。

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

答案 1 :(得分:0)

我设法解决了我在问题中发布的内容。我这样做的方法是使用模板然后使用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地址