在同一资源中,chef only_if AND not_if

时间:2017-06-27 18:02:41

标签: chef

我对Chef的资源模型中 only_if not_if 的逻辑顺序感到困惑。

在以下示例中,假设一个名为 / tmp / foo 的文件包含单词 bar

execute "rm /tmp/foo" do
    action :run
    only_if "ls /tmp/foo"
    not_if "grep bar /tmp/foo"
end

会发生什么? only_if not_if 是否独占?和?要么?哪个先来?为什么呢?

2 个答案:

答案 0 :(得分:4)

按照代码中给出的顺序运行。每种方法的内部结构基本归结为@guards << Guard.new(*args),因此它们会隐式跟踪顺序。两个条款必须“通过”运行的动作。一般来说,这是一个糟糕的主意,因为如果你必须留下一个非常好的评论,它是非常难以阅读的。

答案 1 :(得分:0)

在一般编程术语中,“only_if”类似于“if”,“not_if”类似于除非(或如果!)

因此,始终建议您在资源中选择其中一个gaurd。

例如:

如果用户不存在,代码下方将创建用户“adam”:

not_if 'grep adam /etc/passwd', :user => 'adam'

以下代码将创建foo.txt,仅当目录“/ tmp”存在时才会出现:

file '/tmp/foo.txt' do
  action :create
  only_if { ::Dir.exist?("/tmp") }
end

另请参阅"Gaurds"的厨师文档以进一步明确。