0

私たちの cfengine セットアップでは、ホストのグループで構成されるクラスを定義したいと思っています。短い名前が一意でない 4 部構成のホスト名を持つホストがたくさんあります。ホスト名にドットを使用しないというドキュメントを繰り返し読みましたが、場合によっては、xxx_yyy_domain_com を使用するとうまくいくようです。

ロール ファイルで、一連のマシンを含む配列をネームサーバーとして定義します。

bundle agent tfn_roles {

vars:

# DNS servers
"dns_servers" slist => {
    "hetzner8",     # ns-frk
    "ubiquity1",    # ns-lax
    "ns_ubi3_domain_org",
    "vps001_dfw_domain_org",   # ns-dfw
    "tagadab2",     # ns-lcy
    "atlantic1",    # ns-mco
};

そして bind9.cf promise ファイルで:

bundle agent service_bind9 {

meta:
    "tags" slist => { "autorun" };

classes:
    "dns_servers" or => { "@(tfn_roles.dns_servers)" };

そのクラスの一連の約束は、アンダースコア付きの FQDN を持つ 2 つのホストに対して正しく実行されるようです。

ただし、同じロール ファイル内に、文字列のみで定義される別のクラスがあります。

# Server running the daily tasks - should only be one.
"daily_tasks_server" string => "vps007_dfw_domain_org";

次に、毎日のタスクの約束ファイルで:

bundle agent service_daily_tasks {

meta:
    "tags" slist => { "autorun" };

classes:
    "daily_task_server" expression => "$(tfn_roles.daily_tasks_server)";

そして、これはうまくいかないようです。

誰かがその理由とその回避方法を説明できますか? 代わりに言う必要がありますか:

"daily_task_server" or => "$(tfn_roles.daily_tasks_server)"; 

もしそうなら、なぜですか?いくつかの基本的な cfengine 構文規則を誤解していますか??

更新:いいえ、上記の変更を行ってもまだ機能しません。

(ちなみに、私はすでにCFEngine の Host group を読んでいます。Zamboni氏の本を読まなければならないなどとは言わないでください。時間があればいつか読みたいと思っていますが...)

4

1 に答える 1

1

クラスの約束の「式」属性(「または」属性も)の使用にエラーがあります。を使用しています。これは、例"$(tfn_roles.daily_tasks_server)"では に評価さ"vps007_dfw_domain_org"れます。次に、CFEngine はそれをクラス式として解析し、名前が設定されたクラスがないことを確認し、vps007_dfw_domain_orgクラス式全体を false と評価します。クラス promise の式属性が false と評価されるため ("!any"フードの下を見ると)、クラス"daily_task_server"は設定されていません。

"daily_task_server"正直なところ、クラスで何を期待しているのかよくわかりません。クラスはbooleansであり、文字列をクラスに詰め込もうとしているようです。おそらく、vars promise を使用する必要がありますか? しかし、あなたが最終的に達成しようとしていることを見なければ、私には確信が持てません.

http://www.cfenginetutorial.org/が最近オンラインになりました。CFEngine の構文と用語の定義を明確にするのに役立つ場合があります。(完全な開示: 私は著者と緊密に協力しています。;)


編集:ある特定のサーバーに1つの値が必要で、他のすべてのサーバーに別の(デフォルト)値が必要であるというコメントに基づいて、次のようなコードが必要になります:

bundle agent whatever {
  vars:
    any::
      "myvar"
        string => "Default value to apply to all servers";

      "myvar"
        string => "Value only to apply to host001.mydomain.com",
        ifvarclass => strcmp( "$(sys.fqhost)", "host001.mydomain.com" );
}

使用しているプロミスのタイプは関係ありません。私はパッケージの約束をあまり使用していませんが、クラスを使用せずにifvarclass属性だけで、次のようなことができます。

bundle agent handle_packages {
  packages:
      "apache"
        policy => "present",
        package_module => "yum",
        version => "2.2.22",
        ifvarclass => strcmp( "$(sys.fqhost)", "host001.mydomain.com" ),
        comment => "Only install this on host001";

      "apache"
        policy => "absent",
        package_module => "yum",
        ifvarclass => not( strcmp( "$(sys.fqhost)", "host001.mydomain.com" )),
        comment => "...Remove it everywhere else.";
}

私はまだ 3.6.6 を使用しているので、パッケージの promise をあまり使用していませんが、このifvarclass属性はあらゆる promise タイプで使用できます。

于 2016-02-09T07:53:57.630 に答える