execute "pear7 install mail" do
command "pear7 install mail"
action :nothing
end
bash "Check if pear/mail was not installed" do
command "! (pear7 info pear/mail > /dev/null 2>&1)"
notifies :run,"execute[pear7 install mail]", :immediately
end
pear7 info pear/mail
在安装软件包时返回0退出代码,在不存在软件包时返回1。我想仅在第二种情况下通知第一个动作,这就是我在命令开头添加否定的原因。
事情是始终执行第一个块。如果仅在未安装软件包的情况下发送通知,如何才能获得结果?
我无法使用only_if
或not_if
警卫,因为我必须运行其他命令,这些命令会向同一作业发出通知。
答案 0 :(得分:1)
这不是通知的工作原理。如果资源被视为“更新”,它们将触发。对于execute
,如果命令运行,则认为它已更新。根本不会查看返回代码以用于通知目的。尽管说你做不到,但正确答案可能是not_if
/ only_if
警卫,否则你需要一些自定义资源并使用shell_out()
并手动排序。
答案 1 :(得分:0)
以下是我处理它的方式。不幸的是,我无法避免看守。
execute "pear7 install mail" do
command "pear7 install mail"
action :nothing
end
Chef::Resource::Bash.send(:include, Chef::Mixin::ShellOut)
bash "Check if pear/mail was not installed" do
command ":"
only_if { shell_out("pear7 info pear/mail > /dev/null 2>&1").exitstatus != 0 }
notifies :run,"execute[pear7 install mail]", :immediately
end
只是冒号的命令意味着“什么都不做”。需要添加警卫。