加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读