当命令失败时,Chef会通知

时间:2018-02-08 15:02:31

标签: chef chef-recipe

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_ifnot_if警卫,因为我必须运行其他命令,这些命令会向同一作业发出通知。

2 个答案:

答案 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

只是冒号的命令意味着“什么都不做”。需要添加警卫。