1

それぞれ cfengine3 を実行している 2 つの異なるバージョンの linux/unix があります。クライアントの OS に基づいて異なるファイルをコピーする両方のマシンに配置できる 1 つの promises.cf ファイルを持つことは可能ですか? 私は数時間インターネットを検索してきましたが、まだ有用なものは見つかりませんでした.

4

1 に答える 1

4

これにはいくつかの方法があります。最も単純な方法として、次のようにオペレーティング システムに応じてさまざまなファイルを使用できます。

files:
  ubuntu_10::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.ubuntu_10");
  suse_9::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.suse_9");
  redhat_5::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.redhat_5");
  windows_7::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.windows_7");

この例は、組み込みの CFEngine 変数 $(sys.flavor) にオペレーティング システムのタイプとバージョンが含まれていることを理解することで簡単に簡略化できるため、この例を次のように書き直すことができます。

"/etc/hosts"
    copy_from => mycopy("$(repository)/etc.$(sys.flavor)");

このタスクを実現するためのより柔軟な方法は、CFEngine 用語で「階層コピー」として知られています。このパターンでは、ファイルを区別するための変数の任意のリストと、最も具体的なものから最も一般的なものまで考慮すべき順序を指定します。copy promise が実行されると、見つかった最も具体的なファイルがコピーされます。

このパターンの実装は非常に簡単です。

# Use single copy for all files
body agent control
{
   files_single_copy => { ".*" };
}

bundle agent test
{
vars:
  "suffixes"   slist => { ".$(sys.fqhost)", ".$(sys.uqhost)", ".$(sys.domain)",
                          ".$(sys.flavor)", ".$(sys.ostype)", "" };
files:
  "/etc/hosts"
    copy_from => local_dcp("$(repository)/etc/hosts$(suffixes)");
}

ご覧のとおり、ファイルを区別する基準を含む $(suffixes) というリスト変数を定義しています。このリストに含まれるすべての変数は、CFEngine によって自動的に定義されますが、任意の CFEngine 変数を使用できます。次に、単にその変数をスカラーとして copy_from パラメータに含めます。CFEngine は自動リスト展開を行うため、各変数を順番に試行し、copy promise を複数回 (リスト内の値ごとに 1 回) 実行し、存在する最初のファイルをコピーします。たとえば、superman.justiceleague.com という名前の Linux SuSE 11 マシンの場合、@(suffixes) 変数には次の値が含まれます。

{ ".superman.justiceleague.com", ".superman", ".justiceleague.com", ".suse_11",
  ".linux", "" }

ファイル コピーの promise が実行されると、暗黙的なループにより、これらの文字列が "$(repository)/etc/hosts" に順番に追加されるため、次のファイル名が順番に試行されます: hosts.superman.justiceleague.com, hosts.justiceleague.com、hosts.suse_11、hosts.linux、およびホスト。最初に存在するものはクライアントの /etc/hosts にコピーされ、残りはスキップされます。

この手法を機能させるには、処理するすべてのファイルで「単一コピー」を有効にする必要があります。これは、各ファイルを最大 1 回コピーするように CFEngine に指示する構成パラメーターであり、同じ宛先ファイルに対する連続するコピー操作は無視されます。エージェント コントロール本体の files_single_copy パラメータは、シングル コピーが適用されるファイル名に一致する正規表現のリストを指定します。に設定すると、".*"すべてのファイル名が一致します。

既存のファイルのいずれにも一致しないホストの場合、リストの最後の項目 (空の文字列) により、汎用ホスト ファイルがコピーされます。最後の要素を除いて、各ファイル名のドットは $(suffixes) に含まれていることに注意してください。

これが役立つことを願っています。

(ps と恥知らずなプラグイン: これは、O'Reilly から出版された近刊の本「 Learning CFEngine 3 」からの引用です)

于 2012-01-24T06:56:06.893 に答える