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

时间:2015-03-06 22:50:46

标签: amazon-ec2 chef chef-recipe test-kitchen

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

我无法动态传递#strong> ip_address_1从食谱#1 (食物1的食谱#1已完成)到食谱#2 (这是服务器2的配置食谱并正在执行)。听取你的建议会很有帮助。

我可以做的一件事就是在我试图配置的每个盒子中明确设置.kitchen.yml中的IP地址,但我很好奇是否有任何方法我可以动态做到,像< strong> Ohai node ['ipaddress'] 属性,但更通用,可能是我的群集中配置的所有服务器IP地址的列表。

食谱#1 - 完成 - server1 已配置,AWS已分配私有 ipaddress1
正在应用食谱#2 - 正在进行 - server2 配置但需要 ipaddress1

提前谢谢你,
梅德

1 个答案:

答案 0 :(得分:0)

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

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

然后迭代结果以访问节点配置。

example,用于填充/etc/hosts。我使用刀-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 %>