web-dev-qa-db-ja.com

一意のChefを設定するためのベストプラクティスNode属性

Chefを使用して新しい仮想マシンを管理しようとしています。私は専用のChefサーバーを使用しており、このすべての作業を別のワークステーションvmから実行しています。

私が現在行っている方法は、ベースvmイメージのクローンを作成し、knife bootstrapを使用してChefをインストールし、vmを一貫性のある状態にすることです。

Vmの環境または実行リストを指定できます。環境内の特定の設定を上書きできます。テスト環境の「overrides」ブロックに chef-client 間隔があり、テスト中に60ごとにクライアントを実行するように設定されているため、毎回手動でchef-clientを実行する必要はありません。 。

たとえば、私のワークフローは次のとおりです。

  • vmテンプレートのクローンを作成し、vmを起動します

  • ホスト名を手動で設定し(/ etc/hostnameと/ etc/hostsを更新)、再起動します

  • 初期レシピでノードをブートストラップします

    ナイフbootstrap chef-test1 -r'recipe [ntp]、recipe [chef-client] '

  • 新しい環境を反映するようにノードを編集します

私が抱えている問題は、ノードごとの属性の設定です。 hostname クックブックを使用してノードのホスト名を設定したいのですが、これをロールに設定すると、各サーバーで新しいロールを作成する必要があります。しかし、bootstrapを実行してこのロールを含めると、エラーが発生します。

chef-test1   * log[Please set the set_fqdn attribute to desired hostname] action write[2013-12-09T16:26:56-07:00] WARN: Please set the set_fqdn attribute to desired hostname

そのレシピなしでbootstrapで、ノードを編集して「set_fqdn」属性を設定しようとすると、属性を保存できません。例:次のjson:

{
  "name": "chef-test1",
  "set_fqdn": "chef-test1.local.fqdn",
  "chef_environment": "test-dev1",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [
    "recipe[ntp]",
    "recipe[chef-client]",
    "recipe[hostname]"
  ]
}

エディターを終了すると、knifeは次のように指示します。

Node not updated, skipping node save

Chef guiでこの属性を編集しようとしましたが、属性が保存されません。

私は見つけました この男 /etc/chef/chef.jsonでjsonを作成していて、基本的に私が期待することをしていますが、/ etc/chef /chef.jsonがどのように入るのかわかりませんplay(新しいノードごとに更新しますか?私はchef-soloを使用していないので、おそらくそれが私の混乱です)。

このメールスレッド によると、ナイフノード編集でデフォルトの属性をオーバーライドすることはできませんが、「set_fqdn」はデフォルトではありません。ノードごとに役割を作成することは避けたいので、ホスト名クックブックを使用して、次のようにホスト名を手動で設定する必要性を軽減できると思います。

ナイフbootstrap saucy64 -r'recipe [ntp]、recipe [chef-client]、recipe [hostname] '--json' "{set_fqdn": "chef-test1.local.tld" 、 "chef_client":{"interval": "600"} '

ナイフbootstrap Fedora19 -r'recipe [ntp]、recipe [chef-client]、recipe [hostname] '--json' "{set_fqdn": "chef-test2.local.tld" 、 "chef_client":{"interval": "60"} '

私は援助に感謝します。

11
user1106405

いくつかの問題があります。

  • knife node editの間、属性をfqdnなどの隣の最上位属性として設定することはできません。normalの下に配置する必要があります。これは、defaultoverrideの間の階層です。 属性の優先順位 を参照してください
  • knife node editを使用するとにおいがします。私はむしろこれをしたくありません(ホスト名には問題ないかもしれませんが、他のすべての場合、バージョン管理のそのような変更を追跡することは不可能です)。代わりに、hostnameクックブックを実行してみてください。
  • chef.jsonファイルへの属性の書き込みも私見では避けてください。あなたの論理はあなたの料理本の中にあるべきです
  • すべてのノードが持つ些細なこと(basechef-client、ホスト名など)を含むntpロール/クックブックなどが必要です。
  • bootstrapping-E myenvの間に環境を直接設定することもできます(しかし、はい、なぜこれが文書化されていないのか疑問に思います)
  • ブートストラップ中にノード名を設定することもできます:-N NAMEまたは--node-name NAME
6
StephenKing

bootstrap node、I wrote one これは元のchef-hostnameのフォークであるときに定義されたnode.nameに基づいてホスト名を設定するレシピはどうですか?クックブック。

2
user1106405

これは機能します:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}'

knife help bootstrapヘルプも読んでいます)

このstackoverflowの回答 同様の構文を使用します。

編集:まあ、ほとんど、これは2つのノードエントリを作成します。 -Nパラメーターを使用してノード名を指定する必要があります。

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}' -N chef-test2

knife bootstrap 192.168.15.43 --run-list 'recipe[hostname],recipe[ntp],recipe[chef-client]' --json-attributes '{"set_fqdn": "chef-test2"}' --node-name chef-test2
0
user1106405