与厨师Recepie获取实例公共IP

时间:2019-05-03 11:58:14

标签: amazon-web-services chef cookbook

我尝试获取实例的IP地址并创建我的cron作业:

<
connection authentication='yes' 
authentication-type='1'
class='hadoophive' 
connection-type='Impala' 
dbname='' 
kerberos-host='xyz.com' 
kerberos-realm='abc.com' 
kerberos-service='impala' 
odbc-connect-string-extras='' 
one-time-sql='' 
port='25003' 
schema='someSchema' 
server='someServer' 
sslcert='' 
sslmode='' 
transport-type='1' 
username='someUser'
>

但是,当实例启动时,当我列出cron作业时,我发现{instance ['public_ip']} =错误的IP地址。 有人能帮我吗 ?这是正确的原因,为什么要获取IP @

2 个答案:

答案 0 :(得分:0)

通常,当在ec2实例中执行Chef-client时,ohai将收集ec2 instance metadata,因此您可以通过访问auto属性来获取实例的公共IP地址:

node['ec2']['public_ipv4']

答案 1 :(得分:0)

如果机器具有多个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

希望这会有所帮助!