Chef Recipes – 在ruby_block中设置节点属性
发布时间:2020-12-17 03:31:05 所属栏目:百科 来源:网络整理
导读:我有一个多节点Web服务的Chef配方,每个节点都需要获取其他节点的主机名和IP,以将其置于自己的本地配置中. 代码如下所示.问题是,当如图所示在ruby_block中进行node.set [] []赋值时,当创建依赖于它们的模板时,这些值为空.如果我想创建该模板,我必须将所有ruby
我有一个多节点Web服务的Chef配方,每个节点都需要获取其他节点的主机名和IP,以将其置于自己的本地配置中.
代码如下所示.问题是,当如图所示在ruby_block中进行node.set [] []赋值时,当创建依赖于它们的模板时,这些值为空.如果我想创建该模板,我必须将所有ruby_block代码移到外面,并在配方中“松散”.这使得使用Chefspec等进行单元测试变得更加困难. 任何厨师大师都可以让我直截了当吗?在ruby_block中这样做node.set []是不是不可能吗?如果是这样,为什么不在docs?中这样说 $cm = { :name => "web",:hostname => "",:ip_addr => "" } $ca = { :name => "data",:ip_addr => "" } $cg = { :name => "gateway",: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.这没有什么区别. 解决方法
我意识到这是一个老帖子,但是为了将来的参考,我只是跑过
this gist,这给出了Compile vs. Converge阶段中节点变量赋值的一个很好的例子.要使gist适应您的示例,您需要在ruby_block中添加如下代码:
template_r = run_context.resource_collection.find(:template => "/etc/app/configuration/config.xml") template_r.content node['data']['host'] template_r.content node['web']['host'] template_r.content node['gateway']['host'] 对于11号厨师,也见Lazy Attribute Evaluation. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |