web-dev-qa-db-ja.com

シェフのベストプラクティス/質問

私は人形を愛しています。私は新しい会社に引っ越しました、そして彼らはシェフを採用しています。だから私はシェフを習得しようとしていますが、私はまだ人形で考えているので、すべてをまとめるのに苦労しています=)

これらは私の質問です:

  • Ruby DSL、JSON、または管理コンソールからロールをセットアップする方が良いですか?なぜ同じことを行う複数の方法があるのですか?
  • クックブックをサブディレクトリに整理できますか?例:クックブックを作成してそれに貼り付けたいカスタムソフトウェアがあります:chef-repo/cookbooks/ourcompanystuff/customsoftwarecookbookこれは良い方法でしょうか?
  • 役割を指定する役割のタイプごとにクックブックを作成しますか?これらのクックブックには他のクックブックが含まれていますか(つまり、私のwebserverロールのクックブックにはApacheクックブックが含まれています)。クックブックの相互依存関係と継承がどのように処理されるのかわかりません。
  • ノードが自動的に役割を決定するように、Puppetの外部ノード分類子のようなものはありますか?
  • ナイフで、または管理コンソール内で、またはJSONファイルを編集して、何かを構成できるようです。これは、物事を行う方法が非常に多くある理由が非常にわかりにくく、麻痺しています!どちらかを使用する理由はありますか?人形から来て、これらのツールで誤って何かを誤って設定することは簡単だと思われます(つまり、何かを除外します)
  • 開発クラスターでChefを使用してノードを自動的にプロビジョニングするにはどうすればよいですか? Puppetを使用して、VMを起動し、puppermasterに接続してパペットの実行を開始し、それ自体をセットアップします(役割は外部ノード分類子によって決定されます)。Chefでこれを行うにはどうすればよいですか?インストールchefをchefサーバーに結び付けるpem/rbファイルを使用し、ナイフでノードにその役割を手動で伝えるか、管理インターフェースでこれを編集し、それからchef-client実行を開始してセットアップしますか?

入門チュートリアルを完了しましたが、EC2チュートリアルがあるようですが、EC2を使用したことがないので、理解するのが難しいです。この時点でChefの実行をホストしており、単一ノードの構成をいじり始めています。ここからどこへ行くのですか?公開クックブックを見始める必要がありますか?

Opscodeのドキュメントは問題ありませんが、Puppetのドキュメントほど優れていません。検索で見逃されている可能性のある他の優れたChefリソースはありますか?

48
rizen

編集この質問と回答は何年も前のものです。決定的なベストプラクティスは、 Learn Chef Rally Chef Software、Incによって作成されたセルフペーストレーニングモジュールを通じて教えられます。元の回答の大部分は以下のとおりです。

この回答では、「Chef」または「chef-client」は通常、製品であるChef Infraを指します。 Opscode 2013年にChef Software、Incに名前が変更されました2019年4月、Chefはすべての製品についてソースコードを公開しました とともに、一貫したブランド名を作成しました。

Ruby DSL、JSON、または管理コンソールからロールをセットアップする方が良いかどうか不明です?なぜ複数の方法があるのですか?同じことをするのですか?

2019 Update:Policyfilesは、使用するのに最適なワークフローです。ロールは劣ったプラクティスと見なされており、Chef Software、Inc.はPolicyfilesへの移行を推奨しています。

ワークフローは人それぞれ異なるため、同じことを行う方法は複数あります。環境に最適なワークフローを選択します。情報に基づいた決定を下せるように、違いを説明しましょう。

Ruby Roles for DSLは、JSONの構文を知らなくても簡単にロールを記述できるようにするために存在します。これは、ロールを使い始める簡単な方法です。変更を加えたら、ナイフでシェフサーバー。

knife role from file myrole.rb

これにより、ロールがJSONに変換され、サーバーに保存されます。役割が真実のソースとして存在するChefリポジトリーを実施する環境がある場合、これは非常にうまく機能します。

JSONはChef Serverが格納するものであるため、管理コンソールでJSONを直接編集することもできます。 Ruby DSLよりも多くのフィールドが必要です。KnifeがDSLを正しく認識してアップロードできるようにするためです。これらの詳細は、Web UIによってある程度隠されています。

ロールを編集するためにwebui /管理コンソールを使用することの欠点は、サーバーからダウンロードしない限り、ローカルのバージョン管理システムには存在しないことです。あなたはナイフでこれを行うことができます:

knife role show myrole -Fj

-Fjは、「JSON形式で表示する」ようにknifeに指示します。必要に応じて、出力を.jsonファイルにリダイレクトできます。

年前の更新:ローカルchefリポジトリ内のファイルを操作するための追加のknifeコマンドがあります。現在、これらのコマンドはJSON形式のファイルのみをサポートしています。 コミュニティRFC がオープンし、これらのプラグインのRuby DSLのサポートの追加に対処します。ワークフローの簡単な概要を以下に示します。

サーバーとローカルファイルの内容の違いを確認してください。

knife diff roles/myrole.json

JSON形式の役割ファイルをアップロードします。 roles/パスは必須です。これは、サーバー上の同じAPIエンドポイントにマップされます。

knife upload roles/myrole.json

サーバーからコンテンツをダウンロードして、リポジトリ内のファイルのコンテンツを上書きします。

knife download roles/myrole.json

これらのコマンドは、chefクライアントパッケージに組み込まれているknife-essentialsから取得されます。

クックブックをサブディレクトリに整理できますか?たとえば、クックブックを作成し、それに貼り付けたいカスタムソフトウェアがあります。chef-repo/cookbooks/ourcompanystuff/customsoftwarecookbookこれは良い方法でしょうか?

いいえ。Knifeは、APIを使用してクックブックをサーバーにアップロードするため、クックブックがどこにあるかを期待しています。これは、knife.rbcookbook_pathで設定されます。 Chef Infraの以前のバージョンでは、クックブックのパスの配列を指定できましたが、これはより多くのメンテナンスを必要とし、ユーザーを混乱させるため、廃止されました。

慣例により、クックブックのディレクトリに接頭辞を付けて、顧客固有またはサイト固有のクックブックに名前を付けます。あなたの例では、それは:

chef-repo/cookbooks/ourcompany_customsoftware

何をしているのかに応じて、「ourcompany」の複数の異なるクックブックがある場合があります。

さらに参照:

役割のタイプごとにクックブックを作成して、役割を指定しますか?これらのクックブックに他のクックブックが含まれていますか(つまり、私のwebserverロールのクックブックにはApacheクックブックが含まれています)。クックブックの相互依存関係と継承がどのように処理されるかわかりません。

ロールとクックブックの間に直接的な関係や依存関係はありません。

ロールには実行リストがあり、そのロールを持つすべてのノードに適用する必要のあるレシピと他のロールを指定します。ノードには、ロールまたはレシピを含むことができる実行リストがあります。 Chefがノードで実行されると、ノードに含まれるすべてのロールとレシピの実行リストが展開され、必要なクックブックがダウンロードされます。ノード実行リスト:

recipe[Apache2]

ChefはノードのApache2クックブックをダウンロードして、このレシピを適用できるようにします。

インフラストラクチャ内の役割に固有のクックブックがある場合があります。より一般的には、Apache2、mysql、redis、haproxyなどの特定のタイプのサービスを設定するためのクックブックがあります。次に、それらを適切なロールに配置します。役割を果たすために必要なカスタムアプリケーション固有のものがある場合は、これをカスタムクックブック(上で参照したように)に書き込むことができます。

さらに参照:

puppets外部ノード分類子のようなものはありますか?ノードは自動的に役割を決定しますか?

"はい。" Chef Infra Serverはノードデータストレージ(JSON)を自動的に実行し、サーバーはすべてのノードデータに自動的にインデックスを付けて検索します。

さらに参照:

ナイフで、または管理コンソール内で、またはJSONファイルを編集して、何かを構成できるようですか?これは、物事を行う方法が非常に多くある理由が非常にわかりにくく、麻痺しています!どちらか一方を使用する理由はありますか?

Chef Infra Serverには、JSON応答を送受信するRESTful APIがあります。ナイフと管理コンソールは、管理の観点からAPIと対話するためのユーザーインターフェイスです。

管理コンソールにはKnifeほど多くの機能はありませんが、お好みのツールを使用できます。 Chef Infraを使用するほとんどの人々は、WindowsでChef Infraを使用している人々でさえ、それが提供する能力と柔軟性のためにコマンドラインインターフェイスを好みます。さらに、knifeは、Chef Infra Serverまたはインフラストラクチャの他の部分と対話するための新しいプラグインを作成できるプラグインベースのツールです。

Chef Infraは、ライブラリ、プリミティブ、およびAPIのセットです。インフラストラクチャに最適な構成管理システムを柔軟に構築できます。

参考文献:

開発クラスターでchefを使用してノードを自動的にプロビジョニングするにはどうすればよいですか?人形を使用してVMを起動し、人形人形の実行を開始し、人形の実行を開始します(役割は外部ノード分類子によって決定されます)。これをchefでどのように実行しますか?- chefサーバーに結び付けるpem/rbファイルを使用してchefをインストールし、ナイフでノードの役割を手動で伝えるか、管理インターフェースでこれを編集してから、chef-client実行を開始してセットアップしますか?

ナイフbootstrapプラグインを使用する必要があります。これは、ナイフに付属する組み込みプラグインです。次のように呼び出します。

knife bootstrap 10.1.1.112 -x root -i ~/.ssh/root_id_rsa -r 'role[webserver]'

この意志:

  • SSHキーを使用して、rootユーザーとしてターゲットシステム(10.1.1.112)にSSH接続します(別のユーザーとしてsshしてから--Sudoを使用できます)。
  • Rubyをインストールする
  • Chefをインストールする
  • ChefサーバーのChef構成ファイルを作成し、knifeの構成(.chef/knife.rb)を読み取ります。
  • ノードがChefサーバーに自動的に登録するために使用する「検証」RSA秘密鍵をコピーします。
  • 指定されたリストされたコンマ区切りの実行を使用してchef-clientを実行します。この例では、webserverロールのみが適用されます。

これは、ターゲットシステムがプロビジョニングされていて、IPアドレスがあり、ルートとしてSSHを実行できることを前提としています。ローカルポリシーとプロビジョニングプロセスによっては、これがどのように機能するかを調整する必要がある場合があります。 wikiのbootstrapページには、これがどのように機能するかについての詳細が記載されています。

Knifeには、Amazon EC2やRackspace Cloudなどの多くのパブリッククラウドコンピューティングプロバイダー用のプラグインもあります。 EucalyptusやOpenStackなどのプライベートクラウド環境で利用できるプラグインがあります。 VMware、Vsphereなどのプラグインもあります。詳細については、ドキュメントをご覧ください。

参考文献:

検索で見つからない可能性のある他の優れたシェフリソースはありますか?

Chef Documentation 主要なドキュメントソース。

Learn Chef Rally は、Chef Infraやその他のChef製品のさまざまな側面についてすべて学ぶことができる一連のセルフガイドモジュールです。

私は以前、シェフインフラに関するヒント、トリック、ガイドを投稿したブログを管理してきました: http://jtimberman.housepub.org/ 。 「 クイックヒント 」というシリーズがありました。実生活の状況やその他の取り組みにより、サイトを維持する時間はなくなったが、将来的にはサイトに戻る可能性がある。

シェフのお客様は、サポートサイトでヘルプとサポートを受けることができます。

Chefユーザーコミュニティは、追加のヘルプの優れた情報源です。

その他のリソースは Chef Software、Inc.のWebサイト で入手できます。

これがお役に立てば幸いです。

84
jtimberman