3

私はシェフに比較的慣れていないので、非常に基本的なものを見逃している可能性があります. 多くの検索を行った後、必要なものが見つからないため、次のようになります。

Chef では、競合する役割があります。roleB のサーバーを除いて、特定のタイプのすべてのサーバーに roleA が必要です。

それを説明するために私が考えることができる最良の方法は、例を使用することです:

syslog1、syslog2

web1、web2、web3

db1、db2

メール1、メール2

この環境 (数十) 内のすべてのサーバーには、syslog_server の役割が必要な syslog1 と syslog2 を除いて、syslog_client と呼ばれる役割があります。

syslog-server と syslog-client の役割は、同じソフトウェアの構成が異なるため、競合します。

実際にはいくつかのレシピが含まれているため、これらはレシピではなくロールです。

私はこのようなことを考えました:

ロール/base.rb:

name "base"
description "base configuration"
override_attributes(
)
default_attributes(
)
run_list(
  "recipe[one]",
  "recipe[two]",
  "recipe[three]",
  "role[uno]"
)

unless node[:roles].include?('syslog_server')
  run_list('role[syslog_client]')
end

問題は、この時点でノード オブジェクトが存在しないことです。レシピに移すことも考えましたが、そちらでもいい方法が思いつきませんでした。これをベースレシピで使用できました:

unless node[:roles].include?('syslog_server')
  node[:roles]+=['syslog_client']
end

これにより、syslog_client がロール属性に正しく追加されます (または追加されません) が、実際には syslog_client ロールが実行されることはありません。

ロールではなく自己完結型のレシピに syslog_client を移動し、ロール属性を環境に移動することを検討しました。を呼び出すだけなので、これは機能しますinclude_recipe "syslog::client"。問題は、事実上すべてのレシピが (他のレシピからではなく) ロールから割り当てられていることです。この変更を行うと、追跡が困難な 1 回限りのものが作成されるのではないかと心配しています。その上、すでに述べたように、これらは実際にはいくつかのレシピであるため、単一のレシピとして追加することは理想的ではありません.

現在作業している環境にはさまざまなサーバーの種類/役割があり、それらに役割 [syslog_client] を追加することは可能ですが、理想的ではありません。複数の人がこれに取り組んでいるため、誰かがレシピを新しいロールに追加するのを忘れる可能性が高いようです.

理想的な世界では、私の最初のソリューションのようなものが可能になるでしょう。それによって、環境を可能な限り一貫した状態に保つことができるからです。しかし、私は他のオプションを受け入れています。

まとめとして、私が必要としているのは、次の方法を教えてくれる人だと思います。

  1. 最初のソリューションを機能させます。別の役割が存在しない場合にのみ実行リストに役割を追加する
  2. #1 を持てない場合は、私がリストした方法または私が考えもしなかった他のアイデアを使用して、これを達成するための最良の方法について意見を求めます。

役立つシェフのセットアップに関する詳細が不足している場合はお知らせください。

免責事項:上記の例は、私が実際に達成しようとしているものの非常に単純化されたバージョンです。私は syslog を扱っているわけではありませんが、対象となる会社はセキュリティを非常に重視しており、環境の詳細が公開されることに満足していません。何かを省略し、さらに情報を追加する必要がある場合は、可能な限り詳細に説明します.

4

1 に答える 1

1

上記の内容を拡張すると、2 つの役割を作成する際の問題が何であるか。クライアントとサーバー

クライアント ロールには、基本ロールとクライアント機能が含まれます。「ベース」への参照を他のすべてのロールのこのロールに置き換えることで、すべてのサーバーに適用されます。つまり、これらのロールは引き続きベースになりますが、クライアントも取得します。

サーバーは、これらのサーバーにのみ適用されるスタンドアロンの役割であり、基本の役割とサーバーの役割がありますか?

このようにして、クライアントとサーバーの両方が、基本ロールの定義を複製することなく、それらに適用される基本ロールを取得します。その基本ロールは引き続き必要に応じて管理しますが、ロールの作成には集約を使用しますか?

新しいロールが作成されると、ユーザーはベースを追加することから始めませんが、代わりにベースも与える syslog_client ロールを追加します。

私には、Chef が役割の作成を促している方法のように感じます。私たちが持っているのは、すべてのサーバーに適用される 1 つのロールです。一部はサーバーの 1 つのサブタイプに適用されますが、別のサブタイプには適用されません。このようにして、適用されるリーフ ロールは、実際には 4 つまたは 5 つの他のロールで構成されます。内部にロジックを必要とせずに共有できる方法でモデル化されている一般的なものは何ですか?

もう 1 つのオプションは、すべてのノードにクライアント レシピを追加することです。最初の実行ステップは、ノードの役割を確認することです。サーバーが基本的にレシピの実行をスキップすると言う場合は、レシピを追加するために使用したいロジックと同じものはどれですか?ただし、レシピ内に存在し、実行を制御しますか?

unless node[:roles].include?('syslog_server')
   #Do your client install
end
于 2012-11-13T10:46:35.433 に答える