我在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子例程中。
有人能让我知道我应该如何实现这一目标吗?
答案 0 :(得分:1)
您可以将IP地址移动到节点并使用代码中的连接。
...
code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}"
...
请使用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地址