使用厨师食谱获取实例 public ip

Get instance public ip with chef recepie

我尝试获取实例的 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 @

的正确原因吗

通常,当在 ec2 实例中执行 chef-client 时,ohai will collect the ec2 instance metadata 因此您可以通过访问自动属性来获取实例的 public ip 地址:

node['ec2']['public_ipv4']

如果机器有多个 IP,Chef 有时可以 return 我们不期望的 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

希望对您有所帮助!