Chef 菜谱从另一个节点读取属性

Chef 菜谱从另一个节点读取属性

我正在编写一个非常简单的 Chef 手册来管理 Web 应用程序的部署,并且我有一个用于数据库服务器的 Chef 管理节点,并且想要将该数据库服务器的 IP 地址(和一些其他属性)引入到在应用服务器上运行的配方中...

例如,在应用服务器上检查代码的配方中,是这样的......

hostname = node[:myapp][:dbserver_hostname]
attributes = chef_get_attributes_for_hostname(hostname)

connect_to_mysql_at_ip = attributes[:ipaddress]

我不确定这是否是你能在 Chef 中轻松完成的事情?很难找到相关文档。谢谢!

答案1

我假设您已经为 Web 服务器、数据库服务器等设置了角色。

应用服务器配方中的内容如下:

dbservers = Array.new

search(:node, "role:database_server") do |n|
  n["network"]["interfaces"]["eth0"]["addresses"].each_pair do |address,value|
    dbservers << address if value.has_key?("broadcast")
  end if n["network"]["interfaces"]["eth1"]
end

template "/path/to/app/config/appserver.conf" do
  source 'appserver.conf.erb'
  owner 'foo'
  group 'bar'
  mode 0644
  variables :dbservers => dbservers
end

然后你的模板将有类似如下的内容:

<% @dbservers.each do |s| -%>
  connect_to_mysql_at_ip <%= s %>
<% end -%>

使用 Chef 0.10 可能有一个更好的方法来获取 IP 地址。我认为上面的代码可能包含 Chef 0.9 的遗留内容,但它确实有效。

答案2

http://wiki.opscode.com/display/chef/Search

请参阅在食谱中使用搜索部分。

相关内容