翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Chef 11.10 スタック用のレシピの実装
重要
- AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 にお問い合わせください。 AWS Support でのチーム AWS re:Post
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 クックブックをインストールし、次の順序で共通のディレクトリにマージします。
-
組み込みクックブック。
-
Berkshelf クックブック (ある場合)。
-
カスタムクックブック (ある場合)。
メトリック 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 の検索の使用
レシピで Chef の search
メソッド
-
インスタンスのスタック設定およびデプロイ属性。
-
インスタンスの組み込みクックブックとカスタムクックブックの属性ファイルにある属性。
-
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-app
で layers:php-app
または のいずれかを使用すると、同じ結果が返されsearch
ます。
データバッグの使用
レシピ内で Chef の data_bag_item
メソッド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例では、 という名前のデータバッグを作成しますmyapp
。mysql
という項目が 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 を使用するには、「カスタムクックブックのインストール」に説明されているように、明示的に有効にする必要があります。次に、インストールするクックブックを指定する 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 クックブックを更新することもできます。