我有一个多节点 Web 服务的 Chef 配方,每个节点都需要获取其他节点的主机名和 IP,才能将其放入自己的本地配置中。
代码如下所示。问题是,当 node.set[][] 如图所示在 ruby_block 中进行分配时,当创建依赖它们的模板时,这些值是空的。如果我想创建那个模板,我必须把所有的 ruby_block 代码移到外面,并让它在配方中“松散”。这使得使用 Chefspec 等进行单元测试变得更加困难。
任何厨师大师都可以让我直截了当吗?像这样在 ruby_block 中做 node.set[] 是不可能的吗?如果是这样,为什么在文档中没有这样说?
$cm = { :name => "web", :hostname => "" , :ip_addr => "" }
$ca = { :name => "data", :hostname => "" , :ip_addr => "" }
$cg = { :name => "gateway", :hostname => "" , :ip_addr => "" }
$component_list = [$cm, $ca, $cg]
ruby_block "get host addresses" do
block do
for cmpnt in $component_list
# do REST calls to external service to get cmpnt.hostname, ip_addr
# .......
node.set[cmpnt.name]['name'] = cmpnt.name
node.set[cmpnt.name]['host'] = cmpnt.hostname
node.set[cmpnt.name]['ip'] = cmpnt.ip_addr
end
end
end
template "/etc/app/configuration/config.xml" do
source "config.xml.erb"
variables( :dataHost => node['data']['host'],
:webHost => node['web']['host'],
:gatewayHost => node['gateway']['host'] )
action :create
end
我还添加了
subscribes :create, "ruby_block[get host addresses]", :immediately
到模板定义以确保 ruby_block 在模板创建之前运行。这并没有什么不同。