Chef 11.10 スタック用のレシピの実装 - AWS OpsWorks

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Chef 11.10 スタック用のレシピの実装

重要

- AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 にお問い合わせください。 AWS Support でのチーム AWS re:Post または through AWS プレミアムサポート

Chef 11.10 スタックは、Chef 11.4 スタックと比べて、次のような利点があります。

  • Chef の実行に Ruby 2.0.0 が使用されるため、レシピで新しい Ruby の構文を使用できます。

  • レシピで Chef の検索およびデータバッグを使用できます。

    Chef 11.10 スタックでは、多くのコミュニティクックブックを変更せずに使用できます。

  • クックブックの管理に Berkshelf を使用できます。

    Berkshelf は、カスタムクックブックを管理し、スタックでコミュニティクックブックを使用するための非常に柔軟な方法を提供します。

  • クックブックは、metadata.rb で依存関係を宣言する必要があります。

    クックブックが別のクックブックに依存する場合、その依存関係をカスタムクックブックの metadata.rb ファイルに含める必要があります。たとえば、クックブックに include_recipe anothercookbook::somerecipe のようなステートメントを持つレシピが含まれている場合は、クックブックの metadata.rb ファイルに depends "anothercookbook" という行が含まれている必要があります。

  • AWS OpsWorks スタックは、スタックに MySQL レイヤーが含まれている場合にのみ、スタックのインスタンスに My SQLクライアントをインストールします。

  • AWS OpsWorks スタックは、スタックに Ganglia レイヤーが含まれている場合にのみ、スタックのインスタンスに Ganglia クライアントをインストールします。

  • デプロイで bundle install を実行し、インストールが失敗した場合、デプロイも失敗します。

重要

カスタムクックブックまたはコミュニティクックブックに組み込みクックブックの名前を再使用しないでください。組込クックブックと同じ名前のカスタムクックブックは失敗する可能性があります。Chef 11.10、11.4、および 0.9 スタックで使用できる組み込みクックブックの完全なリストについては、「」の「opsworks-cookbooks」リポジトリ GitHubを参照してください。

Chef 0.9 および 11.4 スタックで正常に実行される文字ASCII以外のクックブックは、Chef 11.10 スタックで失敗することがあります。これは Chef 11.10 スタックが、Ruby 1.8.7 よりもエンコードが厳密である Ruby 2.0.0 を使用して Chef を実行するためです。このようなクックブックを Chef 11.10 スタックで正常に実行するには、 ASCII以外の文字を使用する各ファイルに、エンコーディングに関するヒントを提供するコメントが上部にある必要があります。例えば、UTF-8 エンコーディングの場合、コメントは になります# encoding: UTF-8。Ruby 2.0.0 のエンコードの詳細については、「エンコード」を参照してください。

クックブックのインストールと優先順位

をインストールする手順 AWS OpsWorks スタッククックブックは、Chef 11.10 スタックでは、以前の Chef バージョンと若干動作が異なります。Chef 11.10 スタックの場合は、 AWS OpsWorks スタックは、組み込み、カスタム、Berkshelf クックブックをインストールし、次の順序で共通のディレクトリにマージします。

  1. 組み込みクックブック。

  2. Berkshelf クックブック (ある場合)。

  3. カスタムクックブック (ある場合)。

メトリック AWS OpsWorks スタックはこのマージを実行し、レシピを含むディレクトリの内容全体をコピーします。重複がある場合、次のルールが適用されます。

  • Berkshelf クックブックの内容は組み込みクックブックより優先されます。

  • カスタムクックブックの内容は Berkshelf クックブックより優先されます。

このプロセスがどのように機能するかを示すために、3 つのすべてのクックブックのディレクトリに mycookbook という名前のクックブックが含まれている、次のようなシナリオを考えてみます。

  • 組み込みクックブック — mycookbook は、someattributes.rb という名前の属性ファイル、sometemplate.erb という名前のテンプレートファイル、somerecipe.rb という名前のレシピを含みます。

  • Berkshelf クックブック — mycookbook は、sometemplate.erb および somerecipe.rb を含みます。

  • カスタムクックブック — mycookbook は、somerecipe.rb を含みます。

マージされたクックブックには次のものが含まれます。

  • 組み込みクックブックの someattributes.rb

  • Berkshelf クックブックの sometemplate.erb

  • カスタムクックブックの somerecipe.rb

重要

組み込みクックブック全体をリポジトリにコピーし、クックブックの一部を変更することによって、Chef 11.10 スタックをカスタマイズしないでください。そうすることで、レシピを含む組み込みクックブック全体が上書きされます。If AWS OpsWorks スタックは、そのクックブックを更新します。プライベートコピーを手動で更新しない限り、スタックはこれらの更新のメリットを享受できません。スタックをカスタマイズする方法の詳細については、「カスタマイズ AWS OpsWorks スタック」を参照してください。

レシピで Chef の search メソッドを使用して、スタックデータのクエリを実行できます。Chef サーバーと同じ構文を使用しますが、 AWS OpsWorks スタックは、Chef サーバーにクエリを実行する代わりに、ローカルノードオブジェクトからデータを取得します。これには、以下のデータが含まれます。

  • インスタンスのスタック設定およびデプロイ属性

  • インスタンスの組み込みクックブックとカスタムクックブックの属性ファイルにある属性。

  • Ohai によって収集されるシステムデータ。

スタック設定およびデプロイ属性には、スタック内のオンラインインスタンスのホスト名や IP アドレスなどのデータを含め、通常、レシピが検索で取得する情報の多くが含まれています。 AWS OpsWorks スタックでは、各ライフサイクルイベントについてこれらの属性を更新し、正確に現在のスタックの状態が反映されるようにします。つまり、スタック内で検索に依存するコミュニティレシピを、変更せずに、頻繁に使用できます。search メソッドでは適切なデータが返されますが、データはサーバーではなく、スタック設定およびデプロイ属性から取得されます。

の主な制限 AWS OpsWorks スタック検索は、ローカルノードオブジェクトのデータ、特にスタック設定とデプロイ属性のみを処理するものです。そのため、次のような種類のデータは検索で使用できない可能性があります。

  • 他のインスタンスにあるローカルに定義された属性。

    recipe で属性がローカルに定義されている場合、その情報は に報告されません。 AWS OpsWorks スタックサービス。検索を使用して他のインスタンスからそのデータにアクセスすることはできません。

  • カスタム deploy 属性。

    アプリケーションをデプロイし、対応する属性がそのデプロイのスタックのインスタンスにインストールされるJSONときに、カスタムを指定できます。ただし、選択したインスタンスにのみデプロイする場合、属性はそのインスタンスにのみインストールされます。これらのカスタムJSON属性のクエリは、他のすべてのインスタンスで失敗します。さらに、カスタム属性は、その特定のデプロイに対してJSONのみスタック設定とデプロイに含まれます。カスタム属性にアクセスできるのは、次回のライフサイクルイベントで、新しい一連のスタック設定およびデプロイ属性がインストールされるまでの間だけです。スタック JSONにカスタム を指定すると、属性はライフサイクルイベントごとにすべてのインスタンスにインストールされ、検索を通じて常にアクセス可能であることに注意してください。

  • 他のインスタンスの Ohai データ。

    Chef の Ohai ツールは、インスタンスでさまざまなシステムデータを取得し、ノードオブジェクトに追加します。このデータはローカルに保存され、 にはレポートされません。 AWS OpsWorks スタックサービスは、検索が他のインスタンスからオハイアイデータにアクセスできないようにします。ただし、このデータの一部はスタック設定およびデプロイ属性に含まれる場合があります。

  • オフラインインスタンス。

    スタック設定およびデプロイ属性には、オンラインインスタンスのデータのみが含まれます。

次のレシピの抜粋は、検索を使用してPHPレイヤーのインスタンスのプライベート IP アドレスを取得する方法を示しています。

appserver = search(:node, "role:php-app").first Chef::Log.info("The private IP is '#{appserver[:private_ip]}'")
注記

メトリック AWS OpsWorks スタックは、スタック設定属性とデプロイ属性をノードオブジェクトに追加し、実際には 2 つのレイヤー属性のセットを作成します。それぞれが同じデータを持ちます。1 つのセットは layers名前空間にあります。 AWS OpsWorks スタックはデータを保存します。もう 1 つのセットは role 名前空間にあります。Chef サーバーでは同等のデータはこのように保存されます。role 名前空間の目的は、Chef サーバーが で実行できるように実装された検索コードを許可することです。 AWS OpsWorks スタックインスタンス。専用のコードを記述する場合 AWS OpsWorks スタックでは、前の例role:php-applayers:php-appまたは のいずれかを使用すると、同じ結果が返されsearchます。

データバッグの使用

レシピ内で Chef の data_bag_item メソッドを使用して、データバッグ内の情報に対するクエリを実行できます。Chef サーバーと同じ構文を使用しますが、 AWS OpsWorks スタックは、インスタンスのスタック設定とデプロイ属性からデータを取得します。ただし、 AWS OpsWorks スタックは現在 Chef 環境をサポートしていないため、 node.chef_environment は常に を返します_default

カスタム を使用して属性JSONに 1 つ以上の属性を追加することで、データバッグを作成します[:opsworks][:data_bags]。次の例は、カスタム でデータバッグを作成するための一般的な形式を示していますJSON。

注記

クックブックリポジトリに追加することで、データバッグを作成することはできません。カスタム を使用する必要がありますJSON。

{ "opsworks": { "data_bags": { "bag_name1": { "item_name1: { "key1" : “value1”, "key2" : “value2”, ... } }, "bag_name2": { "item_name1": { "key1" : “value1”, "key2" : “value2”, ... } }, ... } } }

通常、スタック JSONにカスタム を指定します。スタック は、後続の各ライフサイクルイベントについて、すべてのインスタンスにカスタム属性をインストールします。アプリケーションをデプロイJSONするときにカスタムを指定することもできますが、これらの属性はそのデプロイにのみインストールされ、選択したインスタンスのセットにのみインストールされる場合があります。詳細については、「アプリケーションのデプロイ」を参照してください。

次のカスタムJSON例では、 という名前のデータバッグを作成しますmyappmysql という項目が 1 個と、キーと値のペアが 2 個含まれます。

{ "opsworks": { "data_bags": { "myapp": { "mysql": { "username": "default-user", "password": "default-pass" } } } } }

レシピでこのデータを使用するために、次の例に示すように、data_bag_item を呼び出して、データバッグと値の名前を渡すことができます。

mything = data_bag_item("myapp", "mysql") Chef::Log.info("The username is '#{mything['username']}' ")

データバッグ内のデータを変更するには、カスタム を変更するだけでJSON、次のライフサイクルイベントのためにスタックのインスタンスにインストールされます。

Berkshelf の使用

Chef 0.9 および 11.4 スタックでは、カスタムクックブックリポジトリを 1 つだけインストールできます。Chef 11.10 スタックでは、Berkshelf を使用してクックブックとその依存関係を管理でき、これにより複数のリポジトリからクックブックをインストールできます。(詳細については、ローカルでのクックブックの依存関係のパッケージ化 を参照してください)。特に、Berkshelf では、 をインストールできます。 AWS OpsWorks スタック互換のコミュニティクックブックは、カスタムクックブックリポジトリにコピーするのではなく、リポジトリから直接スタックできます。サポートされている Berkshelf バージョンは、オペレーティングシステムによって異なります。詳細については、「AWS OpsWorks スタックオペレーティングシステム」を参照してください。

Berkshelf を使用するには、「カスタムクックブックのインストール」に説明されているように、明示的に有効にする必要があります。次に、インストールするクックブックを指定する Berksfile ファイルを、クックブックリポジトリのルートディレクトリに含めます。

Berksfile で外部クックブックソースを指定するには、デフォルトのリポジトリ を指定するソース属性をファイルの上部に含めますURL。Berkshelf は、リポジトリを明示的に指定URLsしない限り、ソース内のクックブックを検索します。次に、インストールする各クックブックに対応する行を次の形式で追加します。

cookbook 'cookbook_name', ['>= cookbook_version'], [cookbook_options]

cookbook に続くフィールドが特定のクックブックを指定します。

  • cookbook_name – (必須) クックブックの名前を指定します。

    他のフィールドを含めない場合、Berkshelf は指定されたソース からクックブックをインストールしますURLs。

  • cookbook_version – (オプション) クックブックのバージョンを指定します。

    =>= などのプレフィックスを使用して、特定のバージョンまたは使用可能なバージョンの範囲を指定します。バージョンを指定しない場合、Berkshelf は最新のバージョンをインストールします。

  • cookbook_options – (オプション) 最後のフィールドは、リポジトリの場所などのオプションを指定する 1 つ以上のキーと値のペアを含むハッシュです。

    例えば、git キーを含めて特定の Git リポジトリを指定したり、tagキーを含めて特定のリポジトリブランチを指定したりすることができます。リポジトリブランチを指定することは、通常、目的のクックブックを確実にインストールするための最適な方法です。

重要

Berksfile に metadata 行を追加し、metadata.rb でクックブックの依存関係を宣言することによって、クックブックを宣言することは避けてください。この処理が正常に実行されるためには、両方のファイルが同じディレクトリにある必要があります。で AWS OpsWorks スタック、Berksfile はリポジトリのルートディレクトリにある必要がありますが、metadata.rbファイルはそれぞれのクックブックディレクトリにある必要があります。代わりに、Berksfile 内で外部クックブックを明示的に宣言してください。

次に、クックブックを指定するさまざまな方法を示す Berksfile の例を示します。Berksfile を作成する方法の詳細については、「Berkshelf」を参照してください。

source "https://supermarket.chef.io" cookbook 'apt' cookbook 'bluepill', '>= 2.3.1' cookbook 'ark', git: 'git://github.com/opscode-cookbooks/ark.git' cookbook 'build-essential', '>= 1.4.2', git: 'git://github.com/opscode-cookbooks/build-essential.git', tag: 'v1.4.2'

このファイルは、次のクックブックをインストールします。

  • コミュニティクックブックリポジトリにある apt の最新バージョン。

  • バージョン 2.3.1 以降である場合に限り、コミュニティクックブックにある bluepill の最新バージョン。

  • 指定されたリポジトリにある ark の最新バージョン。

    この例URLの は のパブリックコミュニティクックブックリポジトリ用ですが GitHub、プライベートリポジトリを含む他のリポジトリからクックブックをインストールできます。詳細については「Berkshelf」を参照してください。

  • 指定されたリポジトリの v1.4.2 ブランチにある build-essential クックブック。

カスタムクックブックリポジトリには、Berksfile に加えて、カスタムクックブックを含めることができます。この場合、 AWS OpsWorks スタックは両方のクックブックのセットをインストールします。つまり、インスタンスには最大 3 つのクックブックリポジトリを含めることができます。

  • 組み込みクックブックは、/opt/aws/opsworks/current/cookbooks にインストールされます。

  • カスタムクックブックリポジトリにクックブックが含まれる場合、そのクックブックは /opt/aws/opsworks/current/site-cookbooks にインストールされます。

  • Berkshelf を有効にし、カスタムクックブックリポジトリに Berksfile が含まれる場合、指定されたクックブックは /opt/aws/opsworks/current/berkshelf-cookbooks にインストールされます。

組み込みクックブックとカスタムクックブックは、セットアップ時に各インスタンスにインストールされますが、それ以降は、[Update Custom Cookbooks] スタックコマンドを手動で実行しない限り、更新されません。 AWS OpsWorks スタックは Chef を実行するたびに berks install を実行するため、Berkshelf クックブックは、以下のルールに従って、各ライフサイクルイベントについて更新されます。

  • リポジトリに新しいバージョンのクックブックがある場合、このオペレーションは、リポジトリからのクックブックを更新します。

  • それ以外の場合、このオペレーションは、ローカルキャッシュから Berkshelf クックブックを更新します。

注記

このオペレーションは Berkshelf クックブックを上書きするため、クックブックのローカルコピーを変更している場合、その変更内容が上書きされます。詳細については「Berkshelf」を参照してください。

また、Berkshelf クックブックとカスタムクックブックの両方を更新する Update Custom Cookbooks スタックコマンドを実行することによって、Berkshelf クックブックを更新することもできます。