根据命令输出设置 cfengine3 类

根据命令输出设置 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功能对我来说不是一个好的选择,因为 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 属性,但模块看起来更清晰,更富有表现力。

相关内容