我有一个用于多节点Web服务的Chef配方,每个节点都需要获取其他节点的主机名和IP地址,并将其放入自己的本地配置中。
下面是代码。问题在于,当在ruby_block中进行node.set[][]分配时,当依赖它们的模板被创建时,这些值为空。如果我要创建该模板,我必须将所有ruby_block代码移到外部,并将其“松散”放在配方中。这使得使用Chefspec等单元测试变得更加困难。
有没有任何Chef大师可以为我提供指导?在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,可以将ruby_block定义放到模板定义之前。但是这并没有什么区别。