web-dev-qa-db-ja.com

コマンド出力に基づいてcfengine3クラスを設定する

この質問は cfengine3でコマンドの出力を使用するにはどうすればよいですか と非常に似ていますが、私の場合は答えが当てはまらないと思います。

「gitpull」を介して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が所有していません。

3
gnomie

これを実現する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属性 を使用してクラス本体でこのようなことを実現できる可能性がありますが、モジュールはよりクリーンで表現力豊かに見えます。

6
Diego Zamboni