【问题标题】:Get instance public ip with chef recepie使用厨师食谱获取实例公共 IP
【发布时间】:2019-05-14 09:30:53
【问题描述】:
我尝试获取实例的 IP 地址并创建我的 cron 作业:
command "curl --silent \"http://#{instance['public_ip']}/module.php/cron/cron.php?key=TPUmg16HBBZ8G2LgyySulHHuC2fGdIjf&tag=hourly\" > /dev/null 2>&1"
但是当实例启动并列出 cron 作业时,我发现 {instance['public_ip']}= 错误的 IP 地址。
有人能帮我吗 ?这就是获取ip的正确原因吗@
【问题讨论】:
标签:
amazon-web-services
chef-infra
cookbook
【解决方案1】:
如果机器有多个 IP,Chef 有时会返回我们不期望的 IP。为了找到所需的 IP,Chef 支持建议覆盖 Ohai,这最终为我们工作。
创建一个属性以正则表达式匹配预期的 IP:
default['ohai']['override']['ip_matcher'] = '/^10\.\d+\.\d+\.4\d+/'
然后我们必须通过编写一个以 Z 命名的文件来覆盖 Ohai,这样它就会保存我们最后想要的 IP 地址。
# dynamically grab the path name
ohai_path = ::File.join(Ohai.config[:plugin_path][0], '/windows')
template "#{ohai_path}/zeta.rb" do
# keep this template named zeta so it runs last.
source 'zeta.rb.erb'
variables(
ip_matcher: node['ohai']['override']['ip_matcher']
)
end
模板文件如下所示(由 Chef 支持人员提供):
Ohai.plugin(:Zeta) do
provides 'ipaddress'
depends 'ipaddress', 'network/interfaces'
collect_data do
network['interfaces'].each do | interf |
network['interfaces']["#{interf[0]}"]['addresses'].each do | ip |
if ip[0] =~ <%= @ip_matcher %>
ipaddress ip[0]
end
end
end
end
end
希望这会有所帮助!