如何从 Chef 中已执行的配方中动态获取 IP 地址

How to dynamically get IP address from already executed recipe in Chef

我是 Chef 的新手,我正在尝试使用 kitchen-ec2 测试 2 个数据库服务 + 2 个应用程序服务器的 AWS 集群配置并面临以下问题:

我无法将ip_address_1从配方#1动态传递(服务器1的配方#1已完成)到配方#2(这是 server2 的配置配方,正在执行)。听听您的建议会很有帮助。

我可以做的一件事是在 .kitchen.yml 中为我尝试配置的每个盒子显式设置 IP 地址,但我很好奇是否有任何方法可以即时完成, 类似于 Ohai 节点 ['ipaddress'] 属性但更通用,可能是我集群中配置的所有服务器 IP 地址的列表。

recipe#1 - done - server1 已配置,AWS 分配私有 ip地址1
recipe#2 - 进行中 - server2 配置正在应用,但 需要 ipaddress1

提前谢谢你,
德米特里

我不确定这是否是您要查找的内容,但您可以通过 search 访问配方中的所有服务器配置,例如:

search(:node, 'recipes:"recipe#2"')

然后遍历结果以访问节点配置。

一个example,用于填充/etc/hosts。我正在使用 knife-ec2,我不确定 kitchen-ec2 是否提供所有这些属性。

recipes/default.rb

template "/etc/hosts" do
  source "etc/hosts.erb"
  owner "root"
  group "root"
  mode "0644"
  variables(:servers => search(:node, "chef_environment:#{node.chef_environment}"),
            :region => node['ec2']['placement_availability_zone'].match(/(\w*\-\w*\-\d*).*/)[1])
end

templates/default/etc/hosts.erb

<% @servers.each do |n| %>
   <% if n["ec2"] %>
      <% region = n["ec2"]["placement_availability_zone"].match(/(\w*\-\w*\-\d*).*/)[1] %>
      <% if region == @region && n["ec2"]["local_ipv4"] %>
<%= n["ec2"]["local_ipv4"] -%> <%= n.name -%> <%= n["ec2"]["hostname"] -%>

      <% elsif n["ec2"]["public_ipv4"] %>
<%= n["ec2"]["public_ipv4"] -%> <%= n.name -%> <%= n["ec2"]["public_hostname"] -%>

      <% end %>
   <% end %>
<% end %>