私はシェフに比較的慣れていないので、非常に基本的なものを見逃している可能性があります. 多くの検索を行った後、必要なものが見つからないため、次のようになります。
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 を持てない場合は、私がリストした方法または私が考えもしなかった他のアイデアを使用して、これを達成するための最良の方法について意見を求めます。
役立つシェフのセットアップに関する詳細が不足している場合はお知らせください。
免責事項:上記の例は、私が実際に達成しようとしているものの非常に単純化されたバージョンです。私は syslog を扱っているわけではありませんが、対象となる会社はセキュリティを非常に重視しており、環境の詳細が公開されることに満足していません。何かを省略し、さらに情報を追加する必要がある場合は、可能な限り詳細に説明します.