Chefのリソースに複数のnot_ifやonly_ifがあった場合、それらは全てor条件で判断され、一つでも合致すると実行されない。
#ブロック書式
##OR条件の例
execute '/usr/local/bin/foo' do
...
not_if { File.file?('/tmp/bar') }
not_if { File.file?('/tmp/baz') }
end
この場合、一つでも対象ファイルがあるとスキップされる
##AND条件の例
ではand条件は?
これは単にブロック内でand条件を使えば実現可能。
...
not_if {
File.file?('/tmp/bar') &&
File.file?('/tmp/baz')
}
...
この場合、両方のファイルがあるときのみスキップされる
#文字列書式
only_ifやnot_ifは、文字列を指定することもでき、その場合、その内容を実行した戻り値が判断に使用される。
##OR条件の例
...
not_if 'test -f /tmp/bar'
not_if 'test -f /tmp/baz'
...
同様に、一つでも対象ファイルがあるとスキップされる。
##AND条件の例
さて、この場合のandはどの様に表すか。。。
not_if '
test -f /tmp/bar &&
test -f /tmp/baz
'
これで行けますね。
#備忘
文字列書式はsystem()でブロック書式に書き換え可能
# これらは同じ意味
not_if 'test -f /tmp/bar'
not_if { system('test -f /tmp/bar') }
#参照
- ChefTips: only_if, not_if は複数使える
- Chef の only_if / not_if でハマった。
- Chef実践入門 ~コードによるインフラ構成の自動化
-
execute
- not_ifなどのGuardsは、:userや:environmentなどを指定可能