Chef recipe 从另一个节点读取属性

tar*_*eld 6 chef

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

例如,在检查应用服务器上的代码的秘籍中,像这样..

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

connect_to_mysql_at_ip = attributes[:ipaddress]
Run Code Online (Sandbox Code Playgroud)

我不确定这是否可以在厨师中轻松完成?正在努力寻找有关它的文档。谢谢!

cjc*_*cjc 7

我假设您已经为 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
Run Code Online (Sandbox Code Playgroud)

然后您的模板将具有以下内容:

<% @dbservers.each do |s| -%>
  connect_to_mysql_at_ip <%= s %>
<% end -%>
Run Code Online (Sandbox Code Playgroud)

使用 Chef 0.10 可能有更好的方法来获取 IP 地址。我认为上面的代码中可能有 Chef 0.9 的遗留问题,但它确实有效。