我对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 是否独占?和?要么?哪个先来?为什么呢?
答案 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"的厨师文档以进一步明确。