这个问题与如何在 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
功能对我来说不是一个好的选择,因为 a) 拉取操作有时可能会变得很昂贵(根据 cfengine3 参考,不建议使用)并且 b) 不允许指定用户、组、工作目录 - 这对我来说很重要。存储库位于用户空间中,不属于 root。
答案1
实现此目的的一种方法是使用CFEngine 支持的模块协议。通过这个,您可以从脚本本身设置任意类和变量。例如,像这样的脚本(未经测试):
#!/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
按照之前的方式行事。
您可以使用类主体来实现类似的目的kept/repaired/failed_returncodes 属性,但模块看起来更清晰,更富有表现力。