如何在 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 子例程。
有人可以告诉我我应该如何实现吗?
- 您不应该使用 bash 块并为每个厨师 运行 调用 ntpdate。 ntpd 应该负责同步时钟,Chef 对此有 cookbook。
您可以将 IP 地址移动到节点并在代码中使用加入。
...
code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}"
...
请使用 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地址
我在 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 子例程。
有人可以告诉我我应该如何实现吗?
- 您不应该使用 bash 块并为每个厨师 运行 调用 ntpdate。 ntpd 应该负责同步时钟,Chef 对此有 cookbook。
您可以将 IP 地址移动到节点并在代码中使用加入。
... code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}" ...
请使用 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地址