【问题标题】:How can I access variables inside a not_if in chef如何在厨师的 not_if 中访问变量
【发布时间】:2021-02-26 19:27:23
【问题描述】:

我是新来的厨师,所以我在这里可能做错了什么。问题是,我如何访问 ruby​​ 块中的LOG_DIR。我想在我的食谱中的很多地方使用LOG_DIR

LOG_DIR = "/var/log/cas"

ruby_block 'check logs' do
   block { ... }
   not_if do
      print(LOG_DIR)
      # The line above does not work.
      # NameError: uninitialized constant #<Class:#<Chef::Recipe:0x0000000003ac5f78>>::RESULT
      result = shell_out("ls #{LOG_DIR} | wc -l").stdout
      result == '0'
   end
end

想到的事情是使用node.run_state 或/和使用惰性块。但我不确定我将如何去做,或者它是否能达到我想要的效果。

如果下面的行有任何问题,评论也会有所帮助。谢谢!

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    not_if 块中使用变量很简单。但它应该用于评估真/假条件。如果not_if { .. } 中传递的条件返回true0,则将跳过 Chef 资源。

    当条件返回true时阻止资源执行。

    我想指出的另一件事是,在 Ruby 中任何以大写字母开头的变量都是constants。所以我要做的第一件事就是将变量设为log_dir

    另外,我不会在not_if 块内进行变量赋值(result =),而是在外面进行。或者更好的是直接创建一个计算结果为truefalse 的表达式。

    例子:

    log_dir = '/var/log/cas'
    
    ruby_block 'check logs' do
      block do
        # some code
      end
      not_if { shell_out("ls #{log_dir} | wc -l").stdout.to_i == 0 }
    end
    

    或者以更 Ruby 的方式:

    log_dir = '/var/log/cas'
    
    ruby_block 'check logs' do
      block do
        # some code
      end
      not_if { Dir.empty?(log_dir) }
    end
    

    【讨论】:

    • 感谢您的回答!得到了相当多的见解,我的问题仍然是,为什么当它看起来清晰初始化时我会得到uninitialized constant 错误? LOG_DIR 对我来说看起来像是一个常量的有效案例,因为它不应该改变。抱歉,我在问题中将其称为变量。你看,Ruby 新手。 :)
    • 其实既然我们用的是Chef,不如避免使用Ruby变量/常量,而使用属性,也就是Chef的变量——比如node['my_cookbook']['log_dir'] = '/var/log/cas'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2021-04-18
    相关资源
    最近更新 更多