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

如何使用Ruby块在Chef recipe中分配变量

发布时间:2020-12-16 20:53:01 所属栏目:百科 来源:网络整理
导读:我正在尝试在Chef配方中动态执行Ruby逻辑,并相信实现这一目标的最佳方法是使用块. 我无法将块内分配的变量传输到主厨配方的主代码中.这是我试过的: ruby_block "Create list" do block do to_use ||= [] node['hosts'].each do |host| system( "#{path}/com
我正在尝试在Chef配方中动态执行Ruby逻辑,并相信实现这一目标的最佳方法是使用块.

我无法将块内分配的变量传输到主厨配方的主代码中.这是我试过的:

ruby_block "Create list" do
  block do
    to_use ||= []
    node['hosts'].each do |host|
      system( "#{path}/command --all" 
              " | awk '{print $2; print $3}'" 
              " | grep #{host} > /dev/null" )
      unless $? == 0
        to_use << host
      end
    end
    node['hosts'] = to_use.join(',')
  end
  action :create
end

execute "Enable on hosts" do
  command "#{path}/command --enable -N #{node['hosts']}"
end

我试图在块中创建新变量,但仍然无法在execute语句中找到访问它们的方法,而不是尝试重新分配chef属性.

我最初使用的是类和调用方法,但它是在配方之前编译的,我真的需要在运行时,在配方中执行逻辑.

解决方法

您的问题是 compile time versus converge time.您的块将在收敛时运行,但此时已经评估了执行资源中的节点[‘host’].

在这种情况下,最好的解决方案是使用lazy evaluation,这样当资源收敛而不是编译时,变量将被扩展:

execute "Enable on hosts" do
  command lazy { "#{path}/command --enable -N #{node['hosts']}" }
end

这里有一点警告,懒惰的操作符必须包含完整的命令属性文本,而不仅仅是变量,它只能作为属性名后面的第一个关键字.

(编辑:李大同)

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

    推荐文章
      热点阅读