我有一个多节点Web服务的厨师食谱,其中的每个节点需要获取其他节点的主机名和IP,以将其放入其自己的本地配置中。厨师食谱 - 在ruby_block中设置节点属性
代码如下所示。问题在于,如图所示,在ruby_block中进行node.set [] []赋值时,创建依赖于它们的模板时,值为空。如果我想创建这个模板,我必须将所有的ruby_block代码移到外面,并且让它在配方中“松散”。这使得用Chefspec等进行单元测试变得更加困难。
任何厨师大师都可以让我变直吗?在ruby_block中,像这样做node.set []是不可能的吗?如果是这样,为什么没有在docs?
$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跑。这没有什么区别。