我正在编写一个非常简单的 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
请参阅在食谱中使用搜索部分。