根据命令输出设置cfengine3类

这个问题与我如何在cfengine3中使用命令的输出非常相似,但我相信这个答案不适用于我的情况。

我想通过“git pull”更新一个git仓库,并根据是否导致更改触发一些后续操作。

简化,如果有像“匹配输出和设置类”通过一些身体if_output_matches我想要使​​用这样的东西:

 bundle agent updateRepo { commands: "/usr/bin/git pull" contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"), classes => if_output_matches("Already up-to-date.","no_update"); reports: no_update:: "nothing updated"; } body contain setuidgiddir_sh(owner,group,folder) { exec_owner => "$(owner)"; exec_group => "$(group)"; useshell => "true"; chdir => "$(folder)"; 

}

那么,是否有可能使用一个 – 可能是昂贵的命令的输出 – 并基于这个决定呢?

execresult函数对我来说不是一个好的select,因为a)pull可能会变得很昂贵(不build议在cfengine3参考之后),b)不允许指定用户,组,工作目录 – 这对我来说很重要。 存储库位于用户空间中,不属于root用户。

一种方法是使用CFEngine支持的模块协议 。 有了这个,你可以从脚本本身设置任意的类和variables。 例如,像这样的脚本(未经testing):

 #!/bin/bash if git pull | grep -q 'Already up-to-date.'; then echo "+no_update" fi 

将它存储在/ var / cfengine / modules / update_git中,然后你可以这样做:

 commands: "update_git" contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"), module => "true"; 

然后像以前那样在no_update

你可能可以通过使用保存/修复/失败返回码属性的类体实现类似这样的事情,但是模块看起来更干净,更有performance力。