Chef-quick-guide
シェフ-概要
Chefは、Opscodeによって開発されたオープンソーステクノロジーです。 Opscodeの共同設立者であるAdam Jacobは、Chefの創設者として知られています。 このテクノロジーは、Rubyエンコードを使用して、レシピやクックブックなどの基本的な構成要素を開発します。 Chefは、インフラストラクチャの自動化に使用され、インフラストラクチャ管理の手作業と反復作業を削減するのに役立ちます。
Chefには、インフラストラクチャの管理と自動化に必要なさまざまなビルディングブロックに対して独自の規則があります。
なぜシェフ?
Chefは、インフラストラクチャのプロビジョニングを自動化するために使用される構成管理テクノロジーです。 Ruby DSL言語に基づいて開発されています。 会社のサーバーの構成と管理のタスクを合理化するために使用されます。 任意のクラウドテクノロジーと統合する機能を備えています。
DevOpsでは、Chefを使用して、社内およびクラウドでサーバーとアプリケーションを展開および管理します。
シェフの特徴
以下は、シェフの最も顕著な特徴です-
- Chefは、一般的なRuby言語を使用して、ドメイン固有の言語を作成します。
- Chefは、ノードの現在のステータスを想定していません。 メカニズムを使用して、マシンの現在のステータスを取得します。
- Chefは、クラウドサーバー、ストレージ、およびソフトウェアの展開と管理に最適です。
シェフの利点
シェフは次の利点を提供しています-
- エントリーの障壁が低い-Chefは標準の構成言語であるネイティブのRuby言語を構成に使用しているため、開発経験のある人なら誰でも簡単に選択できます。
- クラウドとの優れた統合-ナイフユーティリティを使用すると、任意のクラウドテクノロジーと簡単に統合できます。 これは、マルチクラウド環境でインフラストラクチャを配布したい組織にとって最適なツールです。
シェフの短所
Chefの主な欠点のいくつかは次のとおりです-
- Chefの大きな欠点の1つは、クックブックの制御方法です。 働いている人が他の料理本を台無しにしないように、絶え間ない子育てが必要です。
- シェフソロのみが利用可能です。
- 現在の状況では、AWSクラウドに適しています。
- その人がRubyに慣れていない場合、学ぶことは非常に簡単ではありません。
- ドキュメントはまだ不足しています。
シェフの主要な構成要素
レシピ
インフラストラクチャの管理に使用される属性のコレクションとして定義できます。 レシピに存在するこれらの属性は、既存の状態を変更したり、特定のインフラストラクチャノードを設定したりするために使用されます。 Chefクライアントの実行中にロードされ、ノード(マシン)の既存の属性と区画されます。 次に、レシピのノードリソースで定義されているステータスになります。 クックブックの主な機能です。
クックブック
クックブックはレシピのコレクションです。 これらは、Chefサーバーにアップロードされる基本的な構成要素です。 Chefの実行が行われると、その中に存在するレシピが、レシピにリストされているように、指定されたインフラストラクチャを目的の状態に確実に取得します。
リソース
これは、さまざまな種類の状態のインフラストラクチャを管理するために使用されるレシピの基本コンポーネントです。 レシピには複数のリソースがあり、インフラストラクチャの構成と管理に役立ちます。 たとえば-
- package -ノード上のパッケージを管理します
- service -ノード上のサービスを管理します
- user -ノード上のユーザーを管理します
- group -グループを管理します
- template -Rubyテンプレートが埋め込まれたファイルを管理します
- cookbook_file -クックブックのfilesサブディレクトリからノード上の場所にファイルを転送します
- file -ノード上のファイルの内容を管理します
- directory -ノード上のディレクトリを管理します
- execute -ノードでコマンドを実行します
- cron -ノード上の既存のcronファイルを編集します
属性
基本的には設定です。 それらは、クックブックで使用したいもののキーと値のペアと考えることができます。 適用できる属性にはいくつかの種類があり、ノードが動作する最終設定よりも優先順位が異なります。
File
これは、クックブックを使用するノードに配置される静的ファイルを含むクックブック内のサブディレクトリです。 レシピは、そのディレクトリから最終ノードにファイルを移動するリソースとして宣言できます。
テンプレート
ファイルに似ていますが、静的ではありません。 テンプレートファイルは.ebr拡張子で終わります。つまり、埋め込まれたRubyが含まれています。 主に、ファイルに属性値を代入して、ノードに配置される最終ファイルバージョンを作成するために使用されます。
Metadata.rb
パッケージに関するメタデータを管理するために使用されます。 これには、パッケージの名前や詳細などの詳細が含まれます。 また、このクックブックを操作する必要があるクックブックを示す依存関係情報なども含まれます。 これにより、Chefサーバーはノードの実行リストを正しく作成し、すべてのピースが正しく転送されるようにします。
デフォルトのクックブック構造
C:\chef\cookbooks\nginx>tree
Folder PATH listing for volume Local Disk
Volume serial number is BE8B-6427
C: ├───attributes
├───definitions
├───files
│ └───default
├───libraries
├───providers
├───recipes
├───resources
└───templates
└───default
Chef −関連テクノロジー
以下は、Chef関連テクノロジーのリストです。
人形
Puppetは、実行場所に関係なく、ソフトウェアを配信および操作する標準的な方法を提供します。 Linux、Unix、およびWindowsシステム用の自動化された管理エンジンであり、一元化された仕様に基づいて管理タスクを実行します。
Puppet *の主な機能は次のとおりです-
- 均一な構成で新しいシステムを実装します。
- システムを更新し、セキュリティおよびソフトウェアパッケージをアップグレードします。
- 新機能の組み込みと器用な機能の追加。
- データソースの可用性を確保するための構成のカスタマイズ。
- 利用可能なリソースの最適化とコストの最小化。
- 役割を簡素化し、チームが中核的で生産的な問題に集中できるようにします。 *利用可能なインフラストラクチャの鳥瞰図を取得します。
アンシブル
Ansibleは、アプリケーションとシステムの展開を容易にする、根本的にシンプルなIT自動化プラットフォームです。 アプリケーションを展開および更新するためのスクリプトやカスタムコードの作成を避けます。リモートシステムにインストールするエージェントを使用せずに、SSHを使用して、平易な英語に近い言語で自動化します。
Ansible* の主な機能は次のとおりです-
- シンプルで学びやすい
- Pythonで書かれた
- エージェントレス
- YAMLベースのPlaybook
- アンシブル銀河
ソルトスタック
SaltStackは、データ駆動型の構成に使用されます。 これは、動的通信バス上に構築されたインフラストラクチャ管理の新しいアプローチです。 データ駆動型のオーケストレーション、インフラストラクチャのリモート実行、アプリスタックの構成管理に使用されます。
ファブリック
*Fabric* はPythonベースのプログラミング言語で、インフラストラクチャを構成および管理するためにPythonコードにインポートする必要があるPythonのAPIとして開発されています。
シェフ-建築
Chefは、クックブックなどの作業ユニットがChefワークステーションで開発される3層のクライアントサーバーモデルで動作します。 knifeなどのコマンドラインユーティリティからChefサーバーにアップロードされ、アーキテクチャに存在するすべてのノードがChefサーバーに登録されます。
稼働中のChefインフラストラクチャを適切に配置するには、複数のものを順番に設定する必要があります。
上記の設定では、次のコンポーネントがあります。
シェフワークステーション
これは、すべての構成が開発される場所です。 Chefワークステーションがローカルマシンにインストールされます。 詳細な構成構造については、このチュートリアルの後の章で説明します。
シェフサーバー
これはChefセットアップの一元化された作業単位として機能し、すべての構成ファイルが開発後にアップロードされます。 Chefサーバーにはさまざまな種類があり、一部はChefサーバーをホストしていますが、一部は組み込みの前提です。
シェフノード
これらは、Chefサーバーによって管理される実際のマシンです。 すべてのノードは、要件ごとに異なる種類のセットアップを持つことができます。 Chefクライアントは、すべてのノードの主要コンポーネントであり、ChefサーバーとChefノード間の通信のセットアップに役立ちます。 Chefノードのその他のコンポーネントはOhaiです。これは、特定の時点でノードの現在の状態を取得するのに役立ちます。
Chef-バージョン管理システムのセットアップ
バージョン管理システムの使用は、インフラストラクチャ自動化の基本的な部分です。 SVN、CVS、GITなど、複数の種類のバージョン管理システムがあります。 ChefコミュニティでのGITの人気により、GITセットアップを使用します。
注-バージョン管理システムのないコードとしてインフラストラクチャを構築することは考えないでください。
Windowsの場合
- ステップ1 *-https://git-scm.com/[www.git-scm.org]からWindowsインストーラーをダウンロードし、インストール手順に従います。
- ステップ2 *-GitHubの中央リポジトリにサインアップします。
- ステップ3 *-sshキーをGitHubアカウントにアップロードして、簡単に操作できるようにします。 sshキーの詳細については、次のリンクhttps://help.github.com/articles/connecting-to-github-with-ssh/[https://help.github.com/articles/generatedssh-keys]にアクセスしてください。
ステップ4 *-最後にchef-repoという名前で [[1]]
実際にクックブックの作成を開始する前に、開発ボックスに初期GITリポジトリを設定し、Opscodeが提供する空のリポジトリを複製できます。
- ステップ1 *-Opscode Chefリポジトリの空の構造をダウンロードします。
$ wget https://github.com/opscode/chef-repo/tarball/master
- ステップ2 *-タールボールを抽出します。
$ tar –xvf master
- ステップ3 *-ディレクトリの名前を変更します。
$ mv opscode-chef-repo-2c42c6a/chef-repo
- ステップ4 *-現在の作業ディレクトリをchef repoに変更します。
$ cd chef-repo
- ステップ5 *-新しいgetリポジトリを初期化します。
$ git init.
- ステップ6 *-gitハブのリポジトリに接続します。
$ git remote add origin [email protected]:vipin022/chef-
- ステップ7 *-ローカルリポジトリをgithubにプッシュします。
$ git add.
$ git commit –m “empty repo structure added”
$ git push –u origin maste
上記の手順を使用すると、空のシェフリポジトリが所定の場所に配置されます。 その後、レシピとクックブックの開発に着手できます。 完了したら、GitHubに変更をプッシュできます。
シェフ-ワークステーションのセットアップ
Chefはクライアント/サーバーアーキテクチャの概念に従います。したがって、Chefで作業を開始するには、ワークステーションでChefをセットアップし、ローカルで構成を開発する必要があります。 後でそれをChefサーバーにアップロードして、構成する必要があるChefノードで動作させることができます。
Opscodeは完全にパッケージ化されたバージョンを提供し、外部の前提条件はありません。 この完全にパッケージ化されたChefは、* omnibusインストーラー*と呼ばれます。
Windowsマシン
- ステップ1 *-マシンにchefDKのセットアップ.msiファイルをダウンロードします。
- ステップ2 *-インストール手順に従って、ターゲットの場所にインストールします。
セットアップは、次のスクリーンショットに示すようになります。
ChefDKパス変数
$ echo $PATH
/c/opscode/chef/bin:/c/opscode/chefdk/bin:
Linuxマシン上
Linuxマシンでセットアップするには、まずマシンでcurlを取得する必要があります。
- ステップ1 *-マシンにcurlをインストールしたら、Opscodeのomnibus Chefインストーラーを使用してワークステーションにChefをインストールする必要があります。
$ curl –L https://www.opscode.com/chef/install.sh | sudo bash
- ステップ2 *-マシンにRubyをインストールします。
- ステップ3 *-パス変数にRubyを追加します。
$ echo ‘export PATH = ”/opt/chef/embedded/bin:$PATH”’ ≫ ~/.bash_profile &&
source ~/.bash_profile
Omnibus Chefは、 /opt/chef/embedded/bin ディレクトリを.bash_profileファイルに追加することにより、Rubyおよび必要なすべてのRuby gemを /opt/chef/embedded にインストールします。
Rubyがすでにインストールされている場合は、次のコマンドを実行して、マシンにChef Ruby gemをインストールします。
$ gem install chef
シェフ-クライアントのセットアップ
ChefノードがChefサーバーと通信できるようにするには、ノードでChefクライアントをセットアップする必要があります。
シェフクライアント
これはChefノードの主要コンポーネントの1つであり、Chefサーバーからクックブックを取得し、ノードで実行します。 Chefプロビジョニングツールとも呼ばれます。
ここでは、Vagrantを使用してVMを管理します。 Vagrantは、シェルスクリプト、Chef、Puppetなどのプロビジョニングツールで構成して、VMを目的の状態にすることもできます。 私たちの場合、Vagrantを使用して、VirtualBoxとChefクライアントをプロビジョニング機能として使用してVMを管理します。
- ステップ1 *-https://www.virtualbox.org/wiki/Downloads[https://www.virtualbox.org/wiki/downlod]からVirtualBoxをダウンロードしてインストールします
ステップ2 *- http://downloads.vagrantup.com*でVagrantをダウンロードしてインストールします
- ステップ3 *-Vagrant Omnibusプラグインをインストールして、VagrantがVMにChefクライアントをインストールできるようにします。
$ vagrant plugin install vagrant-omnibus
仮想の作成と起動
- ステップ1 *-Opscode vagrantリポジトリから必要なVagrantボックスをダウンロードできます。 次のURLからopscode-ubuntu-12.04ボックスをダウンロードしますhttp://www.vagrantbox.es/[https://opscode-vmbento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box]
- ステップ2 *-Vagrantファイルを入手したら、Vagrantファイルを編集するために必要なパスをダウンロードします。
vipin@laptop:~/chef-repo $ subl Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "opscode-ubuntu-12.04"
config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/
vagrant/opscode_ubuntu-12.04_provisionerless.box
config.omnibus.chef_version = :latest
config.vm.provision :chef_client do |chef|
chef.provisioning_path = "/etc/chef"
chef.chef_server_url = "https://api.opscode.com/
organizations/<YOUR_ORG>"
chef.validation_key_path = "/.chef/<YOUR_ORG>-validator.pem"
chef.validation_client_name = "<YOUR_ORG>-validator"
chef.node_name = "server"
end
end
上記のプログラムでは、正しいまたは必要な組織名で<YOUR_ORG>名を更新する必要があります。
- ステップ3 *-構成後の次のステップは、浮浪者ボックスを立ち上げることです。 そのためには、Vagrant boxがある場所に移動して、次のコマンドを実行する必要があります。
$ vagrant up
- ステップ4 *-マシンが起動したら、次のコマンドを使用してマシンにログインできます。
$ vagrant ssh
上記のコマンドでは、vagrantfileは、vagrant仮想マシンを構成するためのRubyドメイン固有言語(DSL)で記述されています。
vagrantファイルには、configオブジェクトがあります。 Vagrantはこの構成オブジェクトを使用してVMを構成します。
Vagrant.configure("2") do |config|
…….
End
構成ブロック内で、ノードを起動するために、使用するVMイメージをvagrantに指示します。
config.vm.box = "opscode-ubuntu-12.04"
config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/
vagrant/opscode_ubuntu-12.04_provisionerless.box
次のステップでは、Vagrantにオムニバスプラグインをダウンロードするように指示します。
config.omnibus.chef_version = :latest
起動するVMボックスを選択したら、Chefを使用してボックスをプロビジョニングする方法を構成します。
config.vm.provision :chef_client do |chef|
…..
End
この中に、仮想ノードをChefサーバーに接続する方法に関する指示をセットアップする必要があります。 Vagrantに、ノード上のすべてのChefのものを保存する必要がある場所を伝える必要があります。
chef.provisioning_path = "/etc/chef"
シェフ-キッチンのセットアップをテストする
Test Kitchenは、シェフの統合テストフレームワークです。 クックブックを使用してインスタンス化および収束されると、VM上で実行されるテストレシピの作成が可能になります。 テストレシピはそのVMで実行され、すべてが期待どおりに機能するかどうかを確認できます。
*ChefSpec* は、Chefの実行のみをシミュレートするものです。 テストキッチンは実際のノードを起動し、Chefを実行します。
- ステップ1 *-テストキッチンRuby gemおよびテストキッチンvagrant gemをインストールして、テストキッチンがテストのスピンアップにvagrantを使用できるようにします。
$ gem install kitchen
$ gem install kitchen-vagrant
ステップ2 *-テストキッチンをセットアップします。 これを行うには、クックブックディレクトリに *.kitchen.yml を作成します。
driver_plugin: vagrant
driver_config:
require_chef_omnibus: true
platforms:
- name: ubuntu-12.04
driver_config:
box: opscode-ubuntu-12.04
box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_
ubuntu-12.04_provisionerless.box
suites:
- name: default
run_list:
- recipe[minitest-handler]
- recipe[my_cookbook_test]
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} }
上記のコードの一部では、迷走者がVMをスピンアップする必要があることを定義し、OmnibusでターゲットノードにChefをインストールすることを定義しています。
2番目の部分では、クックブックをテストするプラットフォームを定義します。 Vagrantは常に新しいインスタンスを作成および破棄します。 Vagrantファイルを使用してスピンアップするVagrant VMの副作用を心配する必要はありません。
テストキッチンは、運用環境に似た一時的な環境でクックブックを実行およびテストするのに役立つ一時的な環境と考えることができます。 テストキッチンを有効にすると、テスト、運用前、および運用環境に実際に展開する前に、特定のコードが動作していることを確認できます。 テストキッチンのこの機能は、クックブックを実際の作業環境に配置する前に、多くの組織がセットで従います。
テストキッチンワークフロー
以下は、テストキッチンワークフローに含まれる手順です。
Chefを使用してクックブックを作成する
次のコードを使用してクックブックを作成します。
$ chef generate cookbook motd_rhel
Installing Cookbook Gems:
Compiling Cookbooks...
Recipe: code_generator::cookbook
*directory[C:/chef/cookbooks/motd_rhel] action create
- create new directory C:/chef/cookbooks/motd_rhel
* template[C:/chef/cookbooks/motd_rhel/metadata.rb] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/metadata.rb
- update content in file C:/chef/cookbooks/motd_rhel/metadata.rb from none to
d6fcc2 (diff output suppressed by config)
*template[C:/chef/cookbooks/motd_rhel/README.md] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/README.md
- update content in file C:/chef/cookbooks/motd_rhel/README.md from none to 50deab
(diff output suppressed by config)
* cookbook_file[C:/chef/cookbooks/motd_rhel/chefignore] action create
- create new file C:/chef/cookbooks/motd_rhel/chefignore
- update content in file C:/chef/cookbooks/motd_rhel/chefignore from none to 15fac5
(diff output suppressed by config)
*cookbook_file[C:/chef/cookbooks/motd_rhel/Berksfile] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/Berksfile
- update content in file C:/chef/cookbooks/motd_rhel/Berksfile from none to 9f08dc
(diff output suppressed by config)
* template[C:/chef/cookbooks/motd_rhel/.kitchen.yml] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/.kitchen.yml
- update content in file C:/chef/cookbooks/motd_rhel/.kitchen.yml
from none to 49b92b (diff output suppressed by config)
*directory[C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec]
action create
- create new directory
C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec
* directory[C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec]
action create
- create new directory
C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec
*cookbook_file
[C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb]
action create_if_missing
- create new file
C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
- update content in file
C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
from none to d85df4 (diff output suppressed by config)
* template
[C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/defaul t_spec.rb]
action create_if_missing
- create new file
C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
- update content in file
C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
from none to 3fbdbd (diff output suppressed by config)
*directory[C:/chef/cookbooks/motd_rhel/spec/unit/recipes] action create
- create new directory C:/chef/cookbooks/motd_rhel/spec/unit/recipes
* cookbook_file
[C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb
- update content in file
C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb from none to 587075
(diff output suppressed by config)
*template
[C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb]
action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
- update content in file
C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
from none to ff3b17 (diff output suppressed by config)
* directory[C:/chef/cookbooks/motd_rhel/recipes] action create
- create new directory C:/chef/cookbooks/motd_rhel/recipes
*template[C:/chef/cookbooks/motd_rhel/recipes/default.rb] action create_if_missing
- create new file C:/chef/cookbooks/motd_rhel/recipes/default.rb
- update content in file
C:/chef/cookbooks/motd_rhel/recipes/default.rb from none to c4b029
(diff output suppressed by config)
* execute[initialize-git] action run
- execute git init .
*cookbook_file[C:/chef/cookbooks/motd_rhel/.gitignore] action create
- create new file C:/chef/cookbooks/motd_rhel/.gitignore
- update content in file C:/chef/cookbooks/motd_rhel/.gitignore from none to 33d469
(diff output suppressed by config)
* execute[git-add-new-files] action run
- execute git add .
* execute[git-commit-new-files] action run
- execute git commit -m "Add generated cookbook content"
以下は、上記のコードの出力として作成されたクックブック構造です。
キッチン構成ファイルのテスト
.kitchen.yamlファイル
driver:
name: vagrant
provisioner:
name: chef_zero
# verifier:
# name: inspec
# format: doc
platforms:
- name: ubuntu-14.04
suites:
- name: default
run_list:
- recipe[motd_rhel::default]
attributes:
ドライバー-マシンを管理するソフトウェアを指定します。
*Provisioner* -Chefの実行方法に関する仕様を提供します。 chef_zeroを使用しているのは、ローカルマシン上のChefサーバー環境を模倣できるためです。 これにより、ノード属性とChefサーバー仕様を操作できます。
プラットフォーム-これは、ターゲットオペレーティングシステムを指定します。
スイート-仮想環境に適用するものを定義します。 ここでは、複数の定義を定義します。 実行リストを定義する場所であり、実行するレシピと実行する必要があるシーケンスを指定します。
コマンドを順番に実行する
キッチンリスト
$ kitchen list
Instance Driver Provisioner Verifier Transport Last Action
ubuntu-1404 Vagrant ChefZero Busser Ssh <Not Created>
キッチンクリエイト
$ kitchen create
-----> Starting Kitchen (v1.4.2)
-----> Creating <default-centos-72>...
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'opscode-centos-7.2' could not be found.
Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Box file was not detected as metadata. Adding it directly...
==> default: Adding box 'opscode-centos-7.2' (v0) for provider: virtualbox
default: Downloading:
https://opscode-vmbento.s3.amazonaws.com/vagrant/virtualbox/
opscode_centos-7.1_chefprovisionerless.box[...]
Vagrant instance <default-centos-72> created.
Finished creating <default-centos-72> (3m12.01s).
-----> Kitchen is finished. (3m12.60s)
キッチンコンバージ
$ kitchen converge
-----> Converging <default-centos-72>...
Preparing files for transfer
Preparing dna.json
Resolving cookbook dependencies with Berkshelf 4.0.1...
Removing non-cookbook files before transfer
Preparing validation.pem
Preparing client.rb
-----> Chef Omnibus installation detected (install only if missing)
Transferring files to <default-centos-72>
Starting Chef Client, version 12.6.0
resolving cookbooks for run list: ["motd_rhel::default"]
Synchronizing Cookbooks: - motd_rhel (0.1.0)
Compiling Cookbooks... Converging 1 resources
Recipe: motd_rhel::default (up to date)
Running handlers: Running handlers complete
Chef Client finished, 0/1 resources updated in 01 seconds
Finished converging <default-centos-72> (0m3.57s).
-----> Kitchen is finished. (0m4.55s)
テストのセットアップ
キッチンログインは、テストVMが正しくプロビジョニングされているかどうかをテストするために使用されます。
$ kitchen login
Last login: Thu Jan 30 19:02:14 2017 from 10.0.2.2
hostname: default-centos-72
fqdn: default-centos-72
memory: 244180kBcpu count: 1
最後に終了
$ exit
Logout
Connection to 127.0.0.1 closed.
セットアップの破棄
$ Kitchen destroy
-----> Starting Kitchen (v1.4.2)
-----> Destroying <default-centos-72>...
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
Vagrant instance <default-centos-72> destroyed.
Finished destroying <default-centos-72> (0m4.94s).
-----> Kitchen is finished. (0m5.93s)
シェフ-ナイフのセットアップ
ナイフは、Chefサーバーとやり取りするChefのコマンドラインツールです。 クックブックのアップロードやChefの他の側面の管理に使用します。 ローカルマシン上のchefDK(Repo)とChefサーバー間のインターフェースを提供します。 それは管理に役立ちます-
- シェフノード
- クックブック
- レシピ
- 環境
- クラウドリソース
- クラウドプロビジョニング
- Chefノード上のChefクライアントへのインストール
ナイフは、Chefインフラストラクチャを管理するための一連のコマンドを提供します。
ブートストラップコマンド
- ナイフブートストラップ[SSH_USER @] FQDN(オプション)
クライアントコマンド
- ナイフクライアントの一括削除REGEX(オプション)
- knife client create CLIENTNAME(オプション)
- knife client delete CLIENT(オプション)
- knife client edit CLIENT(オプション)
- 使用法:C:/opscode/chef/bin/knife(オプション)
- knife client key delete CLIENT KEYNAME(オプション)
- knife client key edit CLIENT KEYNAME(オプション)
- knife client key list CLIENT(オプション)
- knife client key show CLIENT KEYNAME(オプション)
- ナイフクライアントリスト(オプション)
- ナイフクライアントはクライアントを再登録します(オプション)
- knife client show CLIENT(オプション)
構成コマンド
- ナイフ設定(オプション)
- knife configure client DIRECTORY
クックブックコマンド
- ナイフクックブック一括削除REGEX(オプション)
- knife cookbook create COOKBOOK(オプション)
- knife cookbook delete COOKBOOK VERSION(オプション)
- ナイフクックブックダウンロードCOOKBOOK [バージョン](オプション)
- ナイフ料理の本のリスト(オプション)
- knife cookbook metadata COOKBOOK(オプション)
- FILEのknife cookbookメタデータ(オプション)
- knife cookbook show COOKBOOK [VERSION] [PART] [FILENAME](オプション)
- ナイフクックブックテスト[COOKBOOKS …](オプション)
- knife cookbook upload [COOKBOOKS …](オプション)
クックブックサイトコマンド
- ナイフクックブックサイトダウンロードCOOKBOOK [バージョン](オプション)
- ナイフクックブックサイトインストールCOOKBOOK [バージョン](オプション)
- ナイフクックブックサイトリスト(オプション)
- ナイフクックブックサイト検索QUERY(オプション)
- ナイフクックブックサイトシェアCOOKBOOK [CATEGORY](オプション)
- ナイフクックブックサイトショーCOOKBOOK [バージョン](オプション)
- ナイフクックブックサイトunshare COOKBOOK
データバッグコマンド
- knife data bag create BAG [ITEM](オプション)
- ナイフデータバッグ削除BAG [ITEM](オプション)
- ナイフデータバッグ編集BAG ITEM(オプション)
- ファイルBAGからのナイフデータバッグFILE | FOLDER [FILE | FOLDER ..](オプション)
- ナイフデータバッグリスト(オプション)
- ナイフデータバッグショーBAG [ITEM](オプション)
環境コマンド
- ナイフ環境比較[環境..](オプション)
- ナイフ環境作成環境(オプション)
- ナイフ環境削除環境(オプション)
- ナイフ環境編集環境(オプション)
- ファイルFILE [FILE ..]からのナイフ環境(オプション)
- ナイフ環境リスト(オプション)
- ナイフ環境ショーENVIRONMENT(オプション)
実行コマンド
- knife exec [SCRIPT](オプション)
ヘルプコマンド
- ナイフヘルプ[list | TOPIC]
インデックスコマンド
- ナイフインデックスの再構築(オプション)
ノードコマンド
- ナイフノードの一括削除REGEX(オプション)
- knife node create NODE(オプション)
- ナイフノード削除ノード(オプション)
- ナイフノード編集ノード(オプション)
- ナイフノード環境セットNODE ENVIRONMENT
- ファイルFILEからのナイフノード(オプション)
- ナイフノードリスト(オプション)
- knife node run_list add [NODE] [ENTRY [、ENTRY]](オプション)
- knife node run_list remove [NODE] [ENTRY [、ENTRY]](オプション)
- ナイフノードrun_listはノードエントリを設定します(オプション)
- knife node show NODE(オプション)
OSCコマンド
- knife osc_user create USER(オプション)
- knife osc_user delete USER(オプション)
- knife osc_user edit USER(オプション)
- knife osc_userリスト(オプション)
- knife osc_user USERの再登録(オプション)
- knife osc_user show USER(オプション)
パスベースのコマンド
- ナイフ削除[PATTERN1 … パターン]
- ナイフデプスPATTERN1 [PATTERNn]
- ナイフ差分パターン
- ナイフダウンロードパターン
- ナイフ編集[PATTERN1 … パターン]
- ナイフリスト[-dfR1p] [PATTERN1 … パターン]
- ナイフショー[PATTERN1 … パターン]
- ナイフアップロードパターン
- knife xargs [コマンド]
生のコマンド
- ナイフ生REQUEST_PATH
レシピコマンド
- ナイフレシピ一覧[PATTERN]
役割コマンド
- ナイフロール一括削除REGEX(オプション)
- knife role create ROLE(オプション)
- knife role delete ROLE(オプション)
- knife role edit ROLE(オプション)
- ナイフロールenv_run_list add [ロール] [環境] [エントリ[、エントリ]](オプション)
- ナイフの役割env_run_list clear [役割] [環境]
- ナイフロールenv_run_list remove [ロール] [環境] [エントリ]
- ナイフの役割env_run_listは[ROLE] [ENVIRONMENT] [OLD_ENTRY] [NEW_ENTRY]を置き換えます
- ナイフの役割env_run_listセット[役割] [環境] [エントリ]
- ファイルFILE [FILE ..]からのナイフの役割(オプション)
- ナイフの役割リスト(オプション)
- ナイフロールrun_list add [ロール] [エントリ[、エントリ]](オプション)
- ナイフの役割run_list clear [ROLE]
- ナイフロールrun_list削除[ロール] [エントリ]
- ナイフの役割run_listは[ROLE] [OLD_ENTRY] [NEW_ENTRY]を置き換えます
- ナイフの役割run_listセット[役割] [エントリ]
- ナイフロールショーロール(オプション)
配信コマンド
- ナイフサーブ(オプション)
SSHコマンド
- knife ssh QUERY COMMAND(オプション)
SSLコマンド
- knife ssl check [URL](オプション)
- knife ssl fetch [URL](オプション)
ステータスコマンド
- ナイフステータスクエリ(オプション)
タグコマンド
- ナイフタグはノードタグを作成します…
- ナイフタグ削除ノードタグ…
- ナイフタグリストNODE
ユーザーコマンド
- knife user create USERNAME DISPLAY_NAME FIRST_NAME LAST_NAME EMAIL PASSWORD(オプション)
- knife user delete USER(オプション)
- knife user edit USER(オプション)
- knife user key create USER(オプション)
- knife user key delete USER KEYNAME(オプション)
- knife user key edit USER KEYNAME(オプション)
- ナイフユーザーキーリストUSER(オプション)
- knife user key show USER KEYNAME(オプション)
- ナイフユーザーリスト(オプション)
- knifeユーザーがUSERを再登録します(オプション)
- knife user show USER(オプション)
ナイフのセットアップ
knifeを設定するには、。chef *ディレクトリに移動し、chefリポジトリ内に *knife.rb を作成する必要があります。これにより、設定の詳細がknifeに通知されます。 これにはいくつかの詳細があります。
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name 'node_name'
client_key "#{current_dir}/USER.pem"
validation_client_name 'ORG_NAME-validator'
validation_key "#{current_dir}/ORGANIZATION-validator.pem"
chef_server_url 'https://api.chef.io/organizations/ORG_NAME'
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path ["#{current_dir}/../cookbooks"]
上記のコードでは、次の2つのキーを使用するホストされたChefサーバーを使用しています。
validation_client_name 'ORG_NAME-validator'
validation_key "#{current_dir}/ORGANIZATION-validator.pem"
ここで、knife.rbは、knifeに使用する組織と秘密キーの場所を伝えます。 ナイフにユーザーの秘密キーの場所を伝えます。
client_key "#{current_dir}/USER.pem"
次のコード行は、ホストされたサーバーを使用していることをknifeに伝えます。
chef_server_url 'https://api.chef.io/organizations/ORG_NAME'
knife.rbファイルを使用して、バリデーターナイフは組織のホストされたOpscodeに接続できるようになりました。
シェフ-ソロ設定
Chef-Soloは、ローカルで実行されるオープンソースツールであり、Chefクライアントとサーバーの設定を複雑にすることなく、Chefクックブックを使用してゲストマシンをプロビジョニングできます。 自分で作成したサーバーでクックブックを実行するのに役立ちます。
ローカルマシンでChef-Soloを実行する前に、ローカルマシンに次の2つのファイルをインストールする必要があります。
- Solo.rb -このファイルは、クックブック、ロール、データバッグの場所をChefに伝えます。
- Node.json -必要に応じて、このファイルは実行リストとノード固有の属性を設定します。
solo.rbの構成
以下は、solo.rbを設定する手順です。
- ステップ1 *-chefリポジトリ内にsolo.rbファイルを作成します。
current_dir = File.expand_path(File.dirname(__FILE__))
file_cache_path "#{current_dir}"
cookbook_path "#{current_dir}/cookbooks"
role_path "#{current_dir}/roles"
data_bag_path "#{current_dir}/data_bags"
- ステップ2 *-ファイルをgit repoに追加します。
$ git add solo.rb
- ステップ3 *-次のコンテンツを含むchefリポジトリ内にnode.jsonファイルを作成します。
{
"run_list": [ "recipe[ntp]" ]
}
- ステップ4 *-ナイフを使用してシェフレポ内でntpクックブックを取得します。
vipin@laptop:~/chef-repo $ knife cookbook site install ntp
Installing ntp to/Users/mma/work/chef-repo/cookbooks
…TRUNCATED OUTPUT…
Cookbook ntp version 1.3.0 successfully installed
- ステップ5 *-node.jsonファイルをGitに追加します。
$ git add node.json
- ステップ6 *-ファイルをコミットしてgit repoにプッシュします。
vipin@laptop:~/chef-repo $ git commit -m "initial setup for Chef Solo"
vipin@laptop:~/chef-repo $ git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
...TRUNCATED OUTPUT...
To [email protected]:mmarschall/chef-repo.git
b930647..5bcfab6 master -> master
ノードでクックブックを実行する
- ステップ1 *-Chef-Soloをプロビジョニングするノードにログインします。
- ステップ2 *-マシンでChefリポジトリを複製します。
$ git clone $URL_PATH
- ステップ3 *-シェフリポジトリにcdします。
$ cd chef-repo
最後に、シェフソロを実行してノードを収束させます-
$ sudo chef-solo -c solo.rb -j node.json
[2017-20-08T22:54:13+01:00] INFO: ** *Chef 11.0.0* **
[2017-20-08T22:54:13+01:00] INFO: Setting the run_list to
["recipe[ntp]"] from JSON
...TRUNCATED OUTPUT...
[2012-12-08T22:54:16+01:00] INFO: Chef Run complete in 2.388374
seconds
[2012-12-08T22:54:16+01:00] INFO: Running report handlers
*solo.rb* は、現在のディレクトリ(Chefリポジトリ)内でクックブック、ロール、およびデータバッグを検索するようにChef-Soloを構成します。
*Chef-Solo* は、JSONファイルからノード構成を取得します。 この例では、node.jsonと呼びます。 複数のサーバーを管理する場合は、ノードごとに個別のファイルが必要です。 次に、Chef-Soloは、solo.rbおよびnode.jsonにある構成データに基づいてChef実行を実行するだけです。
シェフ-クックブック
クックブックはChefの基本的な作業単位であり、作業単位に関連するすべての詳細で構成され、Chefインフラストラクチャ上のノードとして構成されたシステムの構成と状態を変更する機能を備えています。 クックブックは複数のタスクを実行できます。 クックブックには、ノードの望ましい状態に関する値が含まれています。 これは、目的の外部ライブラリを使用してChefで実現されます。
クックブックの主要コンポーネント
- レシピ
- メタデータ
- 属性
- リソース
- テンプレート
- 図書館
- システムの作成に役立つその他のもの
クックブックを作成する
クックブックを動的に作成するには2つの方法があります。
- chefコマンドを使用する *ナイフユーティリティを使用する
Chefコマンドの使用
Chefコマンドを使用して空のクックブックを作成するには、次のコマンドを実行します。
C:\Users\vipinkumarm>chef generate cookbook <Cookbook Name>
C:\Users\vipinkumarm>chef generate cookbook VTest
Installing Cookbook Gems:
Compiling Cookbooks...
Recipe: code_generator::cookbook
* directory[C:/Users/vipinkumarm/VTest] action create
- create new directory C:/Users/vipinkumarm/VTest
*template[C:/Users/vipinkumarm/VTest/metadata.rb] action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/metadata.rb
- update content in file C:/Users/vipinkumarm/VTest/metadata.rb
from none to 4b9435 (diff output suppressed by config)
* template[C:/Users/vipinkumarm/VTest/README.md] action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/README.md
- update content in file C:/Users/vipinkumarm/VTest/README.md
from none to 482077 (diff output suppressed by config)
*cookbook_file[C:/Users/vipinkumarm/VTest/chefignore] action create
- create new file C:/Users/vipinkumarm/VTest/chefignore
- update content in file C:/Users/vipinkumarm/VTest/chefignore
from none to 15fac5 (diff output suppressed by config)
* cookbook_file[C:/Users/vipinkumarm/VTest/Berksfile] action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/Berksfile
- update content in file C:/Users/vipinkumarm/VTest/Berksfile
from none to 9f08dc (diff output suppressed by config)
*template[C:/Users/vipinkumarm/VTest/.kitchen.yml] action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/.kitchen.yml
- update content in file C:/Users/vipinkumarm/VTest/.kitchen.yml
from none to 93c5bd (diff output suppressed by config)
* directory[C:/Users/vipinkumarm/VTest/test/integration/default/serverspec]
action create
- create new directory
C:/Users/vipinkumarm/VTest/test/integration/default/serverspec
*directory[C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec]
action create
- create new directory
C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec
* cookbook_file
[C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/sp ec_helper.rb]
action create_if_missing
- create new file
C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
- update content in file
C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
from none to d85df4 (diff output suppressed by config)
*template
[C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default _spec.rb]
action create_if_missing
- create new file
C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
- update content in file
C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
from none to 758b94 (diff output suppressed by config)
* directory[C:/Users/vipinkumarm/VTest/spec/unit/recipes] action create
- create new directory C:/Users/vipinkumarm/VTest/spec/unit/recipes
*cookbook_file[C:/Users/vipinkumarm/VTest/spec/spec_helper.rb]
action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
- update content in file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
from none to 587075 (diff output suppressed by config)
* template[C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb]
action create_if_missing
- create new file C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
- update content in file
C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
from none to 779503 (diff output suppressed by config)
- create new file C:/Users/vipinkumarm/VTest/recipes/default.rb
- update content in file C:/Users/vipinkumarm/VTest/recipes/default.rb
from none to 8cc381 (diff output suppressed by config)
* cookbook_file[C:/Users/vipinkumarm/VTest/.gitignore] action create
- create new file C:/Users/vipinkumarm/VTest/.gitignore
- update content in file C:/Users/vipinkumarm/VTest/.gitignore from none to 33d469
(diff output suppressed by config)
VTestという名前のクックブック構造がディレクトリに作成され、以下が同じ構造になります。
ナイフユーティリティの使用
次のコマンドを使用して、ナイフユーティリティを使用してクックブックを作成します。
C:\Users\vipinkumarm\VTest>knife cookbook create VTest2
WARNING: No knife configuration file found
** Creating cookbook VTest2 in C:/chef/cookbooks
** Creating README for cookbook: VTest2
** Creating CHANGELOG for cookbook: VTest2
** Creating metadata for cookbook: VTest2
クックブックの構造は次のとおりです。
シェフ-クックブックの依存関係
クックブックの依存関係を定義する機能は、クックブックの管理に役立ちます。 この機能は、あるクックブックの機能を他のクックブックで使用する場合に使用されます。
たとえば、Cコードをコンパイルする場合は、コンパイルに必要なすべての依存関係がインストールされていることを確認する必要があります。 そうするために、そのような機能を実行できる別のクックブックがあるかもしれません。
chef-serverを使用している場合、クックブックメタデータファイルで減速する必要があるクックブックのこのような依存関係を知る必要があります。 このファイルは、クックブックのディレクトリ構造の上部にあります。 これは、正しいノードにクックブックを展開するのに役立つヒントをChefサーバーに提供します。
metadata.rbファイルの機能
- クックブックのディレクトリ構造の上部にあります。
- knifeコマンドを使用してクックブックがChefサーバーにアップロードされるとコンパイルされます。
- knife cookbook metadataサブコマンドでコンパイルされています。
- knife cookbook createコマンドの実行時に自動的に作成されます。
metadata.rbの構成
以下は、メタデータファイルのデフォルトのコンテンツです。
シェフ-役割
Chefのロールは、ノードをグループ化する論理的な方法です。 典型的なケースは、Webサーバー、データベースサーバーなどのロールを持つことです。 すべてのノードにカスタム実行リストを設定し、ロール内の属性値をオーバーライドできます。
役割を作成する
vipin@laptop:~/chef-repo $ subl roles/web_servers.rb
name "web_servers"
description "This role contains nodes, which act as web servers"
run_list "recipe[ntp]"
default_attributes 'ntp' => {
'ntpdate' => {
'disable' => true
}
}
ロールを作成したら、Chefサーバーにアップロードする必要があります。
Chef Serverへのロールのアップロード
vipin@laptop:~/chef-repo $ knife role from file web_servers.rb
次に、サーバーと呼ばれるノードにロールを割り当てる必要があります。
ノードに役割を割り当てる
vipin@laptop:~/chef-repo $ knife node edit server
"run_list": [
"role[web_servers]"
]
Saving updated run_list on node server
Chef-Clientを実行する
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-07-25T13:28:24+00:00] INFO: Run List is [role[web_servers]]
[2013-07-25T13:28:24+00:00] INFO: Run List expands to [ntp]
...TRUNCATED OUTPUT...
使い方
- Chefリポジトリのrolesフォルダー内のRubyファイルでロールを定義します。
- ロールは、名前と説明の属性で構成されます。
- ロールは、ロール固有の実行リストとロール固有の属性設定で構成されます。
- 実行リストにロールを持つすべてのノードには、ロールの実行リストが独自に厳密に設定されます。
- ロールの実行リスト内のすべてのレシピがノードで実行されます。
- ロールは、fileコマンドからknife roleを使用してChefサーバーにアップロードされます。
- ロールがノード実行リストに追加されます。
- 実行リストにロールを持つノードでChefクライアントを実行すると、ロールにリストされているすべてのレシピが実行されます。
シェフ-環境
Chefは、環境固有の構成の実行を支援します。 開発、テスト、実稼働用に個別の環境を用意することは常に良い考えです。
Chefでは、ノードを個別の環境にグループ化して、順序付けられた開発フローをサポートできます。
環境を作成する
その場で環境を作成するには、knifeユーティリティを使用します。 次のコマンドは、シェルのデフォルトエディターを開き、環境定義を変更できるようにします。
vipin@laptop:~/chef-repo $ knife environment create book {
"name": "book",
"description": "",
"cookbook_versions": {
},
"json_class": "Chef::Environment",
"chef_type": "environment",
"default_attributes": {
},
"override_attributes": {
}
}
Created book
作成された環境のテスト
vipin@laptop:~/chef-repo $ knife environment list
_default
book
すべての環境のリストノード
vipin@laptop:~/chef-repo $ knife node list
my_server
_default環境
各組織は、常にデフォルト環境と呼ばれる少なくとも1つの環境から開始します。デフォルト環境は、常にChefサーバーで使用可能です。 とにかくデフォルト環境を変更することはできません。 あらゆる種類の変更は、作成したカスタム環境でのみ対応できます。
環境属性
環境で属性を定義してから、ノードのデフォルト設定をオーバーライドするために使用できます。 Chefクライアントの実行が行われると、これらの属性は、ノードに既に存在するデフォルトの属性と比較されます。 環境属性がデフォルトの属性よりも優先される場合、Chefクライアントは各ノードで実行されるときにこれらの設定と値を適用します。
環境属性は、default_attributeまたはoverride_attributeのみです。 通常の属性にすることはできません。 default_attributeまたはoverride_attributeメソッドを使用できます。
属性タイプ
デフォルト-デフォルト属性は、すべてのChefクライアントの実行の開始時に常にリセットされ、属性の優先順位が最も低くなります。
オーバーライド-オーバーライド属性は、すべてのChefクライアントの実行の開始時に常にリセットされ、デフォルトのforce_defaultおよびnormalよりも属性の優先順位が高くなります。 オーバーライド属性は、ほとんどの場合レシピで定義されますが、役割または環境の属性ファイルで指定することもできます。
属性を適用する順序
シェフ-デーモンとしてのシェフクライアント
Chef-Clientをデーモンとして実行すると、いつでもすべてのノードの状態を知ることができます。 これは、いつでもChef-Clientを実行するのに役立ちます。
前提条件
ノードはChefサーバーに登録され、エラーなしでChef-Clientが実行されている必要があります。
デーモンモードのChef-Client
30分ごとに実行するデーモンモードでChef-Clientを起動します。
user@server:~$ sudo chef-client -i 1800
上記のコードでは、– i はChef-Clientを必要なノードでデーモンモードで実行できるようにし、1800秒でChef-Clientデーモンを30分ごとに実行するように定義しています。
デーモン実行の検証
Chef-Clientがデーモンとして実行されていることを検証します。
user@server:~$ ps auxw | grep chef-client
上記のコマンドは、Chef-Clientの実行中のデーモンプロセスをgrepします。
他の方法
Chef-Clientをデーモンとして実行する代わりに、* cronジョブ*と同じように実行できます。
user@server:~$ subl/etc/cron.d/chef_client
PATH=/usr/local/bin:/usr/bin:/bin
# m h dom mon dow user command
*/15 * * * * root chef-client -l warn | grep -v 'retrying [1234]/5 in'
上記のcronジョブは、15分ごとに実行されます。
シェフ-シェフシェル
シェフの料理本を書くのはいつも大変です。 Chefサーバーへのアップロード、Vagrant VMのプロビジョニング、そこでの失敗の確認、すすぎ、繰り返しのフィードバックサイクルが長いため、さらに困難になります。 このような重い作業を一度に行う前に、いくつかのピースやレシピをテストできると簡単です。
ChefにはChef-Shellが付属しています。これは基本的にChefとのインタラクティブなRubyセッションです。 シェフシェルでは、作成することができます-
- 属性
- レシピを書く
- Chef Runの初期化
レシピの一部をその場で評価し、それらをChefサーバーにアップロードして、ノードで完全なクックブックを実行するために使用されます。
実行中のシェル
- ステップ1 *-スタンドアロンモードでChef-Shellを実行します。
mma@laptop:~/chef-repo $ chef-shell
loading configuration: none (standalone chef-shell session)
Session type: standalone
Loading...[2017-01-12T20:48:01+01:00] INFO: Run List is []
[2017-01-12T20:48:01+01:00] INFO: Run List expands to []
done.
This is chef-shell, the Chef Shell.
Chef Version: 11.0.0
http://www.opscode.com/chef
http://wiki.opscode.com/display/chef/Home
run `help' for help, `exit' or ^D to quit.
Ohai2u mma@laptop!
chef >
- ステップ2 *-Chef-Shellで属性モードに切り替えます
- chef> attributes_mode
- ステップ3 *-属性値を設定します。
- chef:attributes> set [:title] = "Chef Cookbook"
- 「シェフクックブック」
- chef:attributes> quit
- :属性
- *シェフ> *
- ステップ4 *-レシピモードに切り替えます。
- chef> recipe_mode
- ステップ5 *-ファイルリソースを作成します。
chef:recipe > file "/tmp/book.txt" do
chef:recipe > content node.title
chef:recipe ?> end
=> <file[/tmp/book.txt] @name: "/tmp/book.txt" @noop: nil @
before: nil @params: {} @provider: Chef::Provider::File @allowed_
actions: [:nothing, :create, :delete, :touch, :create_if_missing]
@action: "create" @updated: false @updated_by_last_action: false
@supports: {} @ignore_failure: false @retries: 0 @retry_delay:
2 @source_line: "(irb#1):1:in `irb_binding'" @elapsed_time: 0 @
resource_name: :file @path: "/tmp/book.txt" @backup: 5 @diff: nil
@cookbook_name: nil @recipe_name: nil @content: "Chef Cookbook">
chef:recipe >
- ステップ6 *-指定されたコンテンツでファイルを作成するためにChefの実行を開始します。
- chef:recipe> run_chef
[2017-01-12T21:07:49+01:00] INFO: Processing file[/tmp/book.txt]
action create ((irb#1) line 1)
---/var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/cheftempfile20121212-
11348-dwp1zs 2012-12-12 21:07:49.000000000
+0100
+++/var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/chefdiff20121212-
11348-hdzcp1 2012-12-12 21:07:49.000000000 +0100
@@ -0,0 +1 @@
+Chef Cookbook
\ No newline at end of file
[2017-01-12T21:07:49+01:00] INFO: entered create
[2017-01-12T21:07:49+01:00] INFO: file[/tmp/book.txt] created file
/tmp/book.txt
使い方
- Chef-Shellは、いくつかの特定の機能で強化されたInteractive Ruby(IRB)セッションで始まります。
- attributes_modeやinteractive_modeなどのモードを提供します。
- レシピまたはクックブック内に記述されるコマンドを書くのに役立ちます。
- すべてをインタラクティブモードで実行します。
Chef-Shellは、スタンドアロンモード、クライアントモード、*ソロモード*の3つの異なるモードで実行できます。
- スタンドアロンモード-これはデフォルトのモードです。 クックブックはロードされず、実行リストは空です。
- クライアントモード-ここでは、シェフシェルはシェフクライアントとして機能します。
- ソロモード-ここでは、シェフシェルはシェフソロクライアントとして機能します。
シェフ-クックブックのテスト
クックブックが直接デプロイされ、実稼働サーバーで実行される場合、クックブックが実稼働で分割される可能性が高くなります。 これを防ぐ最善の方法は、セットアップ環境でクックブックをテストすることです。
テストの手順は次のとおりです。
- ステップ1 *-次のコマンドを使用してクックブックをインストールします。
vipin@laptop:~/chef-repo $ knife cookbook site install <cookbook name>
- ステップ2 *-動作しているクックブックでナイフクックブックテストコマンドを実行します。
vipin@laptop:~/chef-repo $ knife cookbook test VTest
checking ntp
Running syntax check on ntp
Validating ruby files
Validating templates
- ステップ3 *-クックブックで何かを壊して、もう一度テストします。
vipin@laptop:~/chef-repo $ subl cookbooks/VTest/recipes/default.rb
...
[ node['ntp']['varlibdir']
node['ntp']['statsdir'] ].each do |ntpdir|
directory ntpdir do
owner node['ntp']['var_owner']
group node['ntp']['var_group']
mode 0755
end
end
- ステップ4 *-ナイフテストコマンドを再度実行します。
vipin@laptop:~/chef-repo $ knife cookbook test ntp
checking ntp
Running syntax check on ntp
Validating ruby files
FATAL: Cookbook file recipes/default.rb has a ruby syntax error:
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error,
unexpected tIDENTIFIER, expecting ']'
FATAL: node['ntp']['statsdir'] ].each do |ntpdir|
FATAL: ^
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error,
unexpected ']', expecting $end
FATAL: node['ntp']['statsdir'] ].each do |ntpdir|
FATAL:
作業方法
ナイフクックブックテストは、クックブック内のすべてのRubyファイルとすべてのERBテンプレートに対してRuby構文チェックを実行します。 Rubyファイルをループし、それぞれに対してRuby –c を実行します。 Ruby –c はスクリプトの構文をチェックし、実行せずに終了します。
すべてのRubyファイルを調べた後、knife cookbookテストはすべてのERBテンプレートとパイプを調べます。これは、 – x によってRuby –c によって作成された冗長バージョンです。
制限事項
ナイフクックブックテストでは、RubyファイルとERBテンプレートの単純な構文チェックのみを行います。 ChefSpecとテストキッチンを使用して、完全にテストドリブンを進めることができます。
シェフ-Foodcritic
問題なく優れたクックブックを作成することは非常に困難な作業です。 しかし、落とし穴を特定するのに役立つ方法があります。 Chef Cookbookでフラグを立てることができます。 Foodcriticはそれをアーカイブする最良の方法の1つであり、クックブックのロジックとスタイルで考えられる問題を特定しようとします。
Foodcriticセットアップ
- ステップ1 *-Foodcritic gemを追加します。
vipin@laptop:~/chef-repo $ subl Gemfile
source 'https://rubygems.org'
gem 'foodcritic', '~>2.2.0'
- ステップ2 *-gemをインストールします。
vipin@laptop:~/chef-repo $ bundle install
Fetching gem metadata from https://rubygems.org/
...TRUNCATED OUTPUT...
Installing foodcritic (2.2.0)
Foodcritic Gem
- ステップ1 *-クックブックでFoodcriticを実行します。
vipin@laptop:~/chef-repo $ foodcritic ./cookbooks/<Cookbook Name>
FC002: Avoid string interpolation where not required: ./cookbooks/
mysql/attributes/server.rb:220
...TRUNCATED OUTPUT...
FC024: Consider adding platform equivalents: ./cookbooks/<Cookbook Name>/
recipes/server.rb:132
- ステップ2 *-詳細レポートを生成します。
vipin@laptop:~/chef-repo $ foodcritic -C ./cookbooks/mysql
cookbooks/<cookbook Name>/attributes/server.rb
FC002: Avoid string interpolation where not required
[...]
85| default['<Cookbook Name>']['conf_dir'] = "#{mysql['basedir']}"
[...]
cookbooks/<Cookbook Name>/recipes/client.rb
FC007: Ensure recipe dependencies are reflected in cookbook
metadata
40| end
41|when "mac_os_x"
42| include_recipe 'homebrew'
43|end
44|
作業方法
Foodcriticは一連のルールを定義し、それぞれがレシピエージェントをチェックします。 スタイル、接続性、属性、文字列、確率、検索、サービス、ファイル、メタデータなど、さまざまな領域に関する複数のルールが付属しています。
シェフ-ChefSpec
- テスト駆動開発(TDD)*は、実際のレシピコードを記述する前にユニットテストを記述する方法です。 テストは本物でなければならず、レシピが何をするかを検証する必要があります。 開発されたレシピがなかったため、実際には失敗するはずです。 レシピが開発されると、テストに合格するはずです。
ChefSpecは、人気のあるRSpecフレームワーク上に構築され、Chefレシピをテストするためのカスタマイズされた構文を提供します。
ChefSpecの作成
- ステップ1 *-chefSpec gemを含むgemファイルを作成します。
vipin@laptop:~/chef-repo $ subl Gemfile
source 'https://rubygems.org'
gem 'chefspec'
- ステップ2 *-gemをインストールします。
vipin@laptop:~/chef-repo $ bundler install
Fetching gem metadata from https://rubygems.org/
...TRUNCATED OUTPUT...
Installing chefspec (1.3.1)
Using bundler (1.3.5)
Your bundle is complete!
- ステップ3 *-スペックディレクトリを作成します。
vipin@laptop:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec
- ステップ4 *-仕様を作成する
vipin@laptop:~/chef-repo $ subl
cookbooks/my_cookbook/spec/default_spec.rb
require 'chefspec'
describe 'my_cookbook::default' do
let(:chef_run) {
ChefSpec::ChefRunner.new(
platform:'ubuntu', version:'12.04'
).converge(described_recipe)
}
it 'creates a greetings file, containing the platform
name' do
expect(chef_run).to
create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!')
end
end
- ステップ5 *-ChefSpecを検証します。
vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb
F
Failures:
1) <CookBook Name> ::default creates a greetings file, containing the platform name
Failure/Error: expect(chef_run.converge(described_recipe)).to
create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!')
File content:
does not match expected:
Hello! ubuntu!
# ./cookbooks/my_cookbook/spec/default_spec.rb:11:in `block
(2 levels) in <top (required)>'
Finished in 0.11152 seconds
1 example, 1 failure
Failed examples:
rspec ./cookbooks/my_cookbook/spec/default_spec.rb:10 # my_
cookbook::default creates a greetings file, containing the
platform name
- ステップ6 *-クックブックのデフォルトのレシピを編集します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb
template '/tmp/greeting.txt' do
variables greeting: 'Hello!'
end
- ステップ7 *-テンプレートファイルを作成します。
vipin@laptop:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb
<%= @greeting %> <%= node['platform'] %>!
- ステップ8 *-rspecを再度実行します。
vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb
.
Finished in 0.10142 seconds
1 example, 0 failures
使い方
動作させるには、まずChefでRSpecを使用するための基本インフラストラクチャをセットアップする必要があります。 次に、Ruby gemをChefSpecする必要があり、クックブックには、すべてのテストを保存するspecというディレクトリが必要です。
シェフ-テストキッチン付きテストクックブック
テストキッチンはChefの統合テストフレームワークです。 クックブックを使用してVMがインスタンス化および収束された後に実行されるテストの作成が可能になります。 テストはVM上で実行され、すべてが期待どおりに機能することを確認できます。
これは、ChefSpecのノードコントラクトであり、Chefの実行のみをシミュレートします。 Test Kitchenは実際のノードを起動し、Chefを実行します。
設定する
これを行うには、仮想マシンの管理に役立つVagrantをマシンにインストールする必要があります。 次に、クックブックの依存関係を管理するために、本棚をインストールしてVagrantにフックする必要があります。
- ステップ1 *-クックブックのデフォルトのレシピを編集します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb
file "/tmp/greeting.txt" do
content node['my_cookbook']['greeting']
end
- ステップ2 *-クックブックの属性を編集します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/attributes/default.rb
default['my_cookbook']['greeting'] = "Ohai, Chefs!"
- ステップ3 *-gemファイルを編集して、必要なRuby gemをインストールします。
vipin@laptop:~/chef-repo $ subl Gemfile
gem 'test-kitchen', '~> 2.0.0.alpha.7'
gem 'kitchen-vagrant'
- ステップ4 *-必要なRuby gemをインストールします。
vipin@laptop:~/chef-repo $ bundle install
...TRUNCATED OUTPUT...
Installing test-kitchen (1.0.0.alpha.7)
Installing kitchen-vagrant (0.10.0) ...TRUNCATED OUTPUT...
- ステップ5 *-クックブックに.kitchen.ymlファイルを作成します。
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl .kitchen.yml
---
driver_plugin: vagrant
driver_config:
require_chef_omnibus: true
platforms:
- name: ubuntu-12.04
driver_config:
box: opscode-ubuntu-12.04
box_url:
https://opscode-vm.s3.amazonaws.com/vagrant/
opscode_ubuntu12.04_provisionerless.box
suites:
- name: default
run_list:
- recipe[minitest-handler]
- recipe[my_cookbook_test]
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} }
- ステップ6 *-クックブック内にテストディレクトリを作成します。
vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>$ mkdir test
- ステップ7 *-統合テスト用のテストクックブックを作成します。
vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>/test $ knife
cookbook create my_cookbook_test
** Creating cookbook my_cookbook_test
** Creating README for cookbook: my_cookbook_test
** Creating CHANGELOG for cookbook: my_cookbook_test
** Creating metadata for cookbook: my_cookbook_test
- ステップ8 *-テストクックブックのデフォルトレシピを編集します。
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl
test/cookbooks/my_cookbook_test/recipes/default.rb
include_recipe 'my_cookbook::default'
- ステップ9 *-クックブック内にミニテスト仕様を作成します。
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ mkdir -p
test/cookbooks/my_cookbook_test/files/default/tests/minitest
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl
test/cookbooks/my_cookbook_test/files/default/tests/minitest/default_test.rb
require 'minitest/spec'
describe_recipe 'my_cookbook::default' do
describe "greeting file" do
it "creates the greeting file" do
file("/tmp/greeting.txt").must_exist
end
it "contains what's stored in the 'greeting' node
attribute" do
file('/tmp/greeting.txt').must_include 'Ohai, Minitest!'
end
end
- ステップ10 *-メインクックブックのBerksfileを編集します。
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl Berksfile
site :opscode
metadata
cookbook "apt"
cookbook "minitest-handler"
cookbook "my_cookbook_test", path:
"./test/cookbooks/my_cookbook_test"
セットアップのテスト
vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ kitchen test
-----> Starting Kitchen (v1.0.0.alpha.7)
...TRUNCATED OUTPUT...
-----> Converging <default-ubuntu-1204>
-----> Installing Chef Omnibus (true)
...TRUNCATED OUTPUT...
Starting Chef Client, version 11.4.4
[2013-06-29T18:33:57+00:00] INFO: ** *Chef 11.4.4* **
[2013-06-29T18:33:58+00:00] INFO: Setting the run_list to
["recipe[minitest-handler]", "recipe[my_cookbook_test]"]
from JSON
...TRUNCATED OUTPUT...
# Running tests:
recipe::my_cookbook::default::greeting
file#test_0001_creates the greeting file = 0.00 s = .
recipe::my_cookbook::default::greeting
file#test_0002_contains what's stored in the 'greeting'
node attribute = 0.00 s = .
Finished tests in 0.011190s, 178.7277 tests/s, 178.7277
assertions/s.
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
...TRUNCATED OUTPUT...
-----> Kitchen is finished. (2m5.69s)
シェフ-ノード
*Knife preflight* は、特定のクックブックを使用するすべてのノードに関する詳細をChefサーバーにアップロードする前に表示します。
入門
開始するには、ナイフプリフライトgemをインストールする必要があります。
- ステップ1 *-gemファイルでパスを定義します。
vipin@laptop:~/chef-repo $ subl Gemfile
source 'https://rubygems.org'
gem 'knife-preflight'
- ステップ2 *-bundlerを実行してknife-preflight gemをインストールします。
vipin@laptop:~/chef-repo $ bundle install
Fetching gem metadata from https://rubygems.org/
...TRUNCATED OUTPUT...
Installing knife-preflight (0.1.6)
作業方法
指定されたクックブックでナイフプリフライトを実行します。
preflightコマンドを実行して、展開された実行リストで特定のクックブックを持つノードとロールを確認できます。
vipin@laptop:~/chef-repo $ knife preflight ntp
Searching for nodes containing ntp OR ntp::default in their
expanded run_list...
2 Nodes found
www-staging.example.com
cms-staging.example.com
Searching for roles containing ntp OR ntp::default in their
expanded run_list...
3 Roles found
your_cms_role
your_www_role
your_app_role
Found 6 nodes and 3 roles using the specified search
criteria
ノードでクックブックを実行する方法は複数あります。
- ノードの実行リストに追加することで、クックブックをノードに直接割り当てることができます。
- ロールにクックブックを追加し、ノードの実行リストにロールを追加できます。
- ロールを別のロールの実行リストに追加し、その別のロールをノードの実行リストに追加できます。
- クックブックは、使用される別のクックブックの依存関係になる場合があります。
どのようにクックブックがノードの実行リストに追加されても、Chefがロールとレシピのすべての拡張リストをノード属性に保存するため、knife preflightコマンドはそれをキャッチします。 knife preflightコマンドは、これらのノード属性を正確に検索します。
シェフ-シェフクライアント実行
Chef-Clientの実行をテストするには、ホストされているChefまたは独自のホストされているサーバーを使用するようにChef-Clientを構成する必要があります。
デバッグモードでのChef-Clientの実行
vipin@server:~$ sudo chef-client -l debug
…TRUNCATED OUTPUT…
Hashed Path:A+WOcvvGu160cBO7IFKLYPhh9fI=
X-Ops-Content-Hash:2jmj7l5rSw0yVb/vlWAYkK/YBwk=
X-Ops-Timestamp:2012-12-27T11:14:07Z
X-Ops-UserId:vagrant'
Header hash: {"X-Ops-Sign"=>"algorithm=sha1;version=1.0;",
"X-Ops-Userid"=>"vagrant", "X-Ops-Timestamp"=>"2012-12-
27T11:14:07Z", "X-Ops-Content-
Hash"=>"2jmj7l5rSw0yVb/vlWAYkK/YBwk=", "X-Ops-
Authorization-
1"=>"HQmTt9U/
LJJVAJXWtyOu3GW8FbybxAIKp4rhiw9O9O3wtGYVHyVGuoilWDao",
"X-Ops-Authorization-
2"=>"2/uUBPWX+YAN0g1/
fD2854QAU2aUcnSaVM0cPNNrldoOocmA0U5HXkBJTKok",
"X-Ops-Authorization-
3"=>"6EXPrEJg5T+
ddWd5qHAN6zMqYc3untb41t+eBpigGHPhtn1LLInMkPeIYwBm",
"X-Ops-Authorization-
4"=>"B0Fwbwz2HVP3wEsYdBGu7yOatq7fZBXHfIpeOi0kn/
Vn0P7HrucnOpONmMgU", "X-Ops-Authorization-
5"=>"RBmmbetFSKCYsdg2v2mW/
ifLIVemhsHyOQjffPYPpNIB3U2n7vji37NxRnBY",
"X-Ops-Authorization-
6"=>"Pb3VM7FmY60xKvWfZyahM8y8WVV9xPWsD1vngihjFw=="}
[2012-12-27T11:14:07+00:00] DEBUG: Sending HTTP Request via
GET to api.opscode.com:443/organizations/agilewebops/
nodes/vagrant
[2012-12-27T11:14:09+00:00] DEBUG: ---- HTTP Status and
Header Data: ----
[2012-12-27T11:14:09+00:00] DEBUG: HTTP 1.1 200 OK
[2012-12-27T11:14:09+00:00] DEBUG: server: nginx/1.0.5
[2012-12-27T11:14:09+00:00] DEBUG: date: Thu, 27 Dec 2012
最後のChef-Client実行の結果の検査
新しいクックブックを開発しているときに、最後のChef-Clientの実行、特に失敗の問題を確認するには、正確に何が間違っていたかを知る必要があります。 Chefはすべてをstdoutに出力しますが、デバッグログをもう一度表示したい場合があります。
テストする場合、コンパイル時に失敗する壊れたクックブックが必要です。
user@server:~$ sudo chef-client
==================================================================
==============
Recipe Compile Error in/srv/chef/file_store/cookbooks/my_
cookbook/recipes/default.rb
==================================================================
==============
NoMethodError
-------------
undefined method `each' for nil:NilClass
Cookbook Trace:
---------------
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.
rb:9:in `from_file'
Relevant File Content:
----------------------
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb:
2: # Cookbook Name:: my_cookbook
3: # Recipe:: default
4: #
5: # Copyright 2013, YOUR_COMPANY_NAME
6: #
7: # All rights reserved - Do Not Redistribute
8: #
9≫ nil.each {}
10:
詳細については、スタックトレースを調べることができます。
user@server:~$ less/srv/chef/file_store/chef-stacktrace.out
Generated at 2013-07-21 18:34:05 +0000
NoMethodError: undefined method `each' for nil:NilClass
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb:9:in
`from_file'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/
mixin/from_file.rb:30:in `instance_eval'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/
mixin/from_file.rb:30:in `from_file'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/
cookbook_version.rb:346:in `load_recipe'
Chef-レシピの動的構成
属性は、クックブックを動的に構成するための重要なコンポーネントです。 属性により、作成者はクックブックを構成可能にすることができます。 クックブックに設定されているデフォルト値をオーバーライドすることにより、ユーザーは独自の値を注入できます。
- ステップ1 *-クックブック属性のデフォルトファイルを作成し、それにデフォルト属性を追加します。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/attributes/default.rb
default['my_cookbook']['message'] = 'hello world!'
- ステップ2 *-レシピ内の属性を定義します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb
message = node['my_cookbook']['message']
Chef::Log.info("** Saying what I was told to say: #{message}")
- ステップ3 *-変更したクックブックをアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook
Uploading my_cookbook [0.1.0]
- ステップ4 *-定義されたノードのChef-Clientを実行します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-13T20:48:21+00:00] INFO: ** Saying what I was told to
say: hello world!
...TRUNCATED OUTPUT...
作業方法
Chefは、属性ファイルからすべての属性をロードしてから実行します。 属性はノードオブジェクトとともに保存されます。 レシピ内のノードオブジェクトに格納されているすべての属性にアクセスし、現在の値を取得できます。
Chefの構造は制限されており、デフォルトの最小値から始まり、通常のセット(セットにエイリアスされます)になり、オーバーライドされます。 レシピで設定された属性レベルは、属性ファイルで設定された同じレベルよりも優先されます。
ノードおよび環境レベルでの属性のオーバーライド
ロールまたは環境で定義された属性が最も優先されます。
- ステップ1 *-ロールを作成します。
vipin@laptop:~/chef-repo $ subl roles/german_hosts.rb
name "german_hosts"
description "This Role contains hosts, which should print out
their messages in German"
run_list "recipe[my_cookbook]"
default_attributes "my_cookbook" => { "message" => "Hallo Welt!" }
- ステップ2 *-Chefサーバーにロールをアップロードします。
vipin@laptop:~/chef-repo $ knife role from file german_hosts.rb
Updated Role german_hosts!
- ステップ3 *-ノードに役割を割り当てます。
vipin@laptop:~/chef-repo $ knife node edit server
"run_list": [
"role[german_hosts]"
]
Saving updated run_list on node server
- ステップ4 *-Chef-Clientを実行します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-13T20:49:49+00:00] INFO: ** Saying what I was told to
say: Hallo Welt!
...TRUNCATED OUTPUT...
シェフ-テンプレート
インフラストラクチャでは、*構成管理*は、ホストをどの程度適切に構成するかに関するものです。 一般に、すべての構成は構成ファイルを使用して行われます。 Chefはテンプレートを使用して、構成ファイルに動的な値を入力できるようにします。
Chefは、レシピで使用できるリソースとしてテンプレートを提供します。 構成ファイルの動的な値は、データバッグ、属性から取得したり、テンプレートに渡して計算したりできます。
それの使い方?
- ステップ1 *-テンプレートをレシピに追加します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb
template '/tmp/message' do
source 'Test.erb'
variables(
hi: 'Tesing',
world: 'Welt',
from: node['fqdn']
)
end
ステップ2 *- *ERB テンプレートファイルを追加します。
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/templates/default/test.erb
<%- 4.times do %>
<%= @hi %>, <%= @world %> from <%= @from %>!
<%- end %>
- ステップ3 *-変更したクックブックをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload <Cookbook Name>
Uploading my_cookbook [0.1.0]
Run Chef Client on your node:
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2017-01-14T20:41:21+00:00] INFO: Processing template[/tmp/
message] action create (my_cookbook::default line 9)
[2017-01-14T20:41:22+00:00] INFO: template[/tmp/message] updated
content
- ステップ4 *-アップロードされたファイルのコンテンツを検証します。
user@server:~$ sudo cat/tmp/message
Hallo, Welt from vagrant.vm!
Hallo, Welt from vagrant.vm!
Hallo, Welt from vagrant.vm!
Hallo, Welt from vagrant.vm!
ワークフロー
Chefは、テンプレート言語としてErubisを使用します。 テンプレートの特別なシンボル内に純粋なRubyコードを埋め込むことができます。
- <%=%>は、変数の値またはRuby式を生成されたファイルに出力する場合に使用されます。
- <%-%>は、Rubyロジックをテンプレートファイルに埋め込む場合に使用されます。 これを使用して式を4回ループします。
Chef-Chef DSLを使用したプレーンRuby
Chefでは、単純なレシピを作成する必要がある場合、テンプレート、remote_file、サービスなど、Chefで利用可能なリソースを使用できます。 ただし、レシピが複雑になると、条件に応じてレシピの一部を実行する条件ステートメントなどの高度なテクニックが必要になります。 これは、プレーンRubyとChef Domain Specific Language(DSL)を混合する力です。
それの使い方?
クライアントモードのいずれかのノードでChef Shellを起動して、Chefサーバーにアクセスできるようにします。
user@server:~$ sudo chef-shell --client
loading configuration:/etc/chef/client.rb
Session type: client
...TRUNCATED OUTPUT...
run `help' for help, `exit' or ^D to quit.
Ohai2u user@server!
Chef>
Chef DSLの基本条件
プレーンRubyを使用して名前でノードを並べ替えます。
chef > nodes.sort! {|a,b| a.name <=> b.name }
=> [node[alice],node[server]]
ノードをループし、オペレーティングシステムを印刷します。
chef > nodes.each do |n|
chef > puts n['os']
chef ?>
end
linux
windows
=> [node[server], node[alice]]
配列、ループ、および文字列拡張を使用して複数のRuby gemをインストールし、gem名を作成します。
chef > %w{ec2 essentials}.each do |gem|
chef > gem_package "knife-#{gem}"
chef ?> end => ["ec2", "essentials"]
作業方法
ChefレシピはRubyファイルであり、Chef runのコンテキストで評価されます。 これらには、ifステートメントやループなどの単純なRubyコード、およびリソースなどのChef DSL要素を含めることができます。
レシピ内では、Ruby変数を単純に宣言して値を割り当てることができます。
シェフ-レシピ付きRuby Gems
レシピは、基本的にRubyコードであるクックブックの主要な構成要素です。 Chefレシピ内ですべてのRuby言語機能を使用できます。 ほとんどの場合、Rubyビルドイン機能で十分ですが、場合によっては追加のRuby gemを使用する必要があります。 たとえば、レシピ自体からMySQLデータベースにアクセスする必要がある場合。
Chefレシピには、同じレシピ内で使用するために必要なRuby gemを取得する機能があります。
特定のレシピでiptable Gemを使用する
- ステップ1 *-クックブックのデフォルトレシピを編集し、レシピ内で使用するgemをインストールします。
vipin@laptop:~/chef-repo $ subl
cookbooks/my_cookbook/recipes/default.rb
chef_gem 'ipaddress'
require 'ipaddress'
ip = IPAddress("192.168.0.1/24")
Chef::Log.info("Netmask of #{ip}: #{ip.netmask}")
- ステップ2 *-変更したクックブックをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook
Uploading my_cookbook [0.1.0]
- ステップ3 *-Chefクライアントを実行して出力を確認します。
user@server $ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-18T14:02:02+00:00] INFO: Netmask of 192.168.0.1:
255.255.255.0
...TRUNCATED OUTPUT...
作業方法
Chefの実行手順は、すべてのリソースをコンパイルするコンパイルフェーズと、ノードを目的の状態に収束させるためにChefがリソースプロバイダーを実行する実行フェーズで構成されます。 クックブック内に特定のRuby gemが必要な場合は、複雑化フェーズでgemをインストールする必要があります。
chef_gemリソースはまったく同じことを行います。Chefでは、オムニバスが唯一の作業方法です。 その主な機能は、宝石をChef自体で利用できるようにすることです。
シェフ-図書館
Chefのライブラリは、クックブックのレシピがきれいできれいなままになるように、コンパイルされたロジックをカプセル化する場所を提供します。
ライブラリを作成する
- ステップ1 *-クックブックのライブラリにヘルパーメソッドを作成します。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb
class Chef::Recipe
def netmask(ipaddress)
IPAddress(ipaddress).netmask
end
end
- ステップ2 *-ヘルパーメソッドを使用します。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb
ip = '10.10.0.0/24'
mask = netmask(ip) # here we use the library method
Chef::Log.info("Netmask of #{ip}: #{mask}")
- ステップ3 *-変更したクックブックをChef Serverにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook
Uploading my_cookbook [0.1.0]
ライブラリのテスト
user@server $ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-18T14:38:26+00:00] INFO: Netmask of 10.10.0.0/24:
255.255.255.0
...TRUNCATED OUTPUT...
作業方法
- Chefライブラリコードは、chef
- Recipeクラスを開き、手順1で行ったように新しいメソッドを追加できます。 この手順は最もクリーンではありませんが、最も簡単な方法です。
class Chef::Recipe
def netmask(ipaddress)
...
end
end
ベストプラクティス
- chef
- recipeクラスを開くと、汚染される変更があります。 ベストプラクティスとして、ライブラリ内に新しいサブクラスを導入し、メソッドをクラスメソッドとして定義することは、常により良い方法です。 これにより、chef :: recipe名前空間のプルが回避されます。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb
class Chef::Recipe::IPAddress
def self.netmask(ipaddress)
IPAddress(ipaddress).netmask
end
end
レシピ内で次のようなメソッドを使用できます
IPAddress.netmask(ip)
シェフ-定義
定義は、繰り返し使用されるリソースをグループ化する論理的な方法として定義できます。 このフローでは、リソースをグループ化し、定義されたクックブックを読みやすくするためにリソースに名前を付けます。
これを行うには、レシピが必要です。 この場合、test_cookbookとクックブックを含むノードの実行リストを使用しています。
定義を作成する
- ステップ1 *-クックブック定義フォルダーに新しい定義ファイルを作成します。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/definitions/
capistrano_deploy_dirs.rb
define :capistrano_deploy_dirs, :deploy_to => '' do
directory "#{params[:deploy_to]}/releases"
directory "#{params[:deploy_to]}/shared"
directory "#{params[:deploy_to]}/shared/system"
end
- ステップ2 *-クックブックのデフォルトレシピ内で定義を使用します。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
capistrano_deploy_dirs do
deploy_to "/srv"
end
- ステップ3 *-クックブックをchefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook
Uploading test_cookbook [0.1.0]
- ステップ4 *-目的のノードでChefクライアントを実行します。
vipin@laptop:~/chef-repuser@server $ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/
releases] action create (my_cookbook::default line 2)
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/releases] created
directory/srv/releases
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/
shared] action create (my_cookbook::default line 3)
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared] created
directory/srv/shared
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/
shared/system] action create (my_cookbook::default line 4)
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared/system]
クックブックの定義は、リソースをグループ化して名前を付けるマイクロのようなものです。 定義には、レシピの内部から呼び出すことができる名前があり、境界のリストがあります。
定義には、コード内で次のように見えるパラメーターがあります。
…..
directory "#{params[:deploy_to]}/releases"
directory "#{params[:deploy_to]}/shared"
directory "#{params[:deploy_to]}/shared/system”
……
次のようにデフォルトのレシピ内で使用できます。
capistrano_deploy_dirs do
deploy_to "/srv"`
end
シェフ-環境変数
環境変数は、特定のノードでChefレシピを正常に実行するための重要な方法です。 手動で設定する方法とシェルスクリプトを使用する方法のいずれかで、複数の方法があります。 ここで実行する必要があるのは、レシピを介して設定することです。
これを行うには、test_cookbookとtest_cookbookを含む実行リストを使用するクックブックが必要です。
Chef Recipeを使用した環境変数の設定
- ステップ1 *-環境変数でクックブックのデフォルトのレシピを更新します。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
ENV['MESSAGE'] = 'Testing environment variable update with chef !'
execute 'print value of environment variable $MESSAGE' do
command 'echo $MESSAGE >/tmp/message'
end
- ステップ2 *-更新されたクックブックをサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook
Uploading my_cookbook [0.1.0]
- ステップ3 *-Chefクライアントを実行して一時ファイルを作成します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-01-25T15:01:57+00:00] INFO: Processing execute[print
value of environment variable $MESSAGE] action run
(my_cookbook::default line 11)
[2013-01-25T15:01:57+00:00] INFO: execute[print value of
environment variable $MESSAGE] ran successfully
...TRUNCATED OUTPUT...
変数の検証
user@server:~$ cat/tmp/message
Hello from Chef
作業方法
Rubyは、ENV –a ハッシュを介して現在の環境変数を公開し、環境変数を読み取って変更します。
リソースを実行する
実行リソースを使用して、クックブックのChefデフォルトレシピ内で同じことを実行できます。
mma@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
execute 'print value of environment variable $MESSAGE' do
command 'echo $MESSAGE >/tmp/message'
environment 'MESSAGE' => 'Hello from the execute resource'
end
注-ENVを使用して環境変数を設定すると、Chef全体の実行中にその変数が使用可能になります。 対照的に、それを実行リソースに渡すと、リソースによって実行されるその1つのコマンドでのみ使用可能になります。
シェフ-データバッグ
Chefデータバッグは、クックブックで使用できる任意のデータコレクションとして定義できます。 データバッグの使用は、レシピの属性をハードコーディングしたり、クックブックに属性を保存したくない場合に非常に役立ちます。
作業方法
次のセットアップでは、httpエンドポイントURLと通信しようとしています。 このために、エンドポイントURLの詳細を保持し、レシピで使用するデータバッグを作成する必要があります。
- ステップ1 *-データバッグ用のディレクトリを作成します。
mma@laptop:~/chef-repo $ mkdir data_bags/hooks
- ステップ2 *-リクエストビンのデータバッグアイテムを作成します。 定義されたrequestBin URLを使用していることを確認する必要があります。
vipi@laptop:~/chef-repo $ subl data_bags/hooks/request_bin.json {
"id": "request_bin",
"url": "http://requestb.in/1abd0kf1"
}
- ステップ3 *-Chefサーバーでデータバッグを作成する
vipin@laptop:~/chef-repo $ knife data bag create hooks
Created data_bag[hooks]
- ステップ4 *-データバッグをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife data bag from file hooks requestbin.json
Updated data_bag_item[hooks::RequestBin]
- ステップ5 *-クックブックのデフォルトレシピを更新して、データバッグから必要なクックブックを受け取ります。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb
hook = data_bag_item('hooks', 'request_bin')
http_request 'callback' do
url hook['url']
end
- ステップ6 *-変更したクックブックをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook
Uploading my_cookbook [0.1.0]
- ステップ7 *-ノードでChefクライアントを実行して、http要求ビンが実行されるかどうかを確認します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-02-22T20:37:35+00:00] INFO: http_request[callback]
GET to http://requestb.in/1abd0kf1 successful
...TRUNCATED OUTPUT...
使い方
データバッグは、構造データエントリの名前付きコレクションです。 データエントリを定義し、JSONファイルでデータバッグアイテムを呼び出す必要があります。 レシピ内からデータバッグアイテムを検索して、データバッグに保存されているデータを使用することもできます。
フックと呼ばれるデータバッグを作成しました。 データバッグは、Chefリポジトリ内のディレクトリです。 サーバーでナイフを作成しました。
Chef-データバッグのスクリプト
特定の条件では、サーバーをChefの完全な制御下に置くことはできません。 そのような場合、スクリプトからChefデータバッグの値にアクセスする必要があります。 これを行うには、データバッグの値をJSONファイルに保存し、追加されたスクリプトがそれらの値にアクセスできるようにする必要があります。
そのためには、料理の本が必要です。 この場合、以前のようにtest_cookbookを使用し、test_cookbook定義を含むノードの実行リストが含まれている必要があります。
作業方法
- ステップ1 *-データバッグを作成します。
vipin@laptop:~/chef-repo $ mkdir data_bags/servers
vipin@laptop:~/chef-repo $ knife data bag create servers
Created data_bag[servers]
- ステップ2 *-データバッグアイテムを作成します。
vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json {
"id": "storage",
"host": "10.0.0.12"
}
- ステップ3 *-データバッグアイテムを更新します。
vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json {
"id": "storage",
"host": "10.0.0.12"
}
クックブックで使用する
- ステップ1 *-上記のクックブックを使用してデータバッグ値を含むJSONファイルを作成し、外部スクリプトがそれらの値にアクセスできるようにする必要があります。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
file "/etc/backup_config.json" do
owner "root"
group "root"
mode 0644
content data_bag_item('servers', 'backup')['host'].to_json
end
- ステップ2 *-test_cookbookをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook
Uploading my_cookbook [0.1.0]
- ステップ3 *-ノードでChefクライアントを実行します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-03-14T20:30:33+00:00] INFO: Processing
file[/etc/backup_config.json] action create
(my_cookbook::default line 9)
[2013-03-14T20:30:34+00:00] INFO: entered create
[2013-03-14T20:30:34+00:00] INFO:
file[/etc/backup_config.json] owner changed to 0
[2013-03-14T20:30:34+00:00] INFO:
file[/etc/backup_config.json] group changed to 0
[2013-03-14T20:30:34+00:00] INFO:
file[/etc/backup_config.json] mode changed to 644
[2013-03-14T20:30:34+00:00] INFO:
file[/etc/backup_config.json] created file
/etc/backup_config.json
...TRUNCATED OUTPUT...
- ステップ4 *-生成されたJSONファイルのコンテンツを検証します。
user@server:~$ cat/etc/backup_config.json
"10.0.0.12"
スクリプトのワークフロー
上記のコマンドでは、 /etc ディレクトリ内にJSONファイルを作成するために使用したファイルリソースがデフォルトのクックブックで定義されています。 data_bag_itemメソッドを使用して、データバッグからファイルコンテンツを直接取得します。 データバッグアイテムからホスト値にアクセスし、JSONに変換します。 ファイルリソースは、JSON変換された値をコンテンツとして使用し、ディスクに書き込みます。
シェフ-クックブックのクロスプラットフォーム
Cross-Platformクックブックは、実行する基本的な環境を採用するクックブックです。 Chefは多くの機能を提供します。これは、デプロイされるOSで実行可能なクロスプラットフォームクックブックを作成するのに役立ちます。 これにより、開発者は完全に機能するクックブックを作成できます。
これを行うには、クックブックが必要です。 私たちの場合、それはtest_cookbookとクックブック定義を含む実行リストになります。
作業方法
ノードプラットフォームの詳細を取得し、クックブックで条件ロジックを実行することは、プラットフォームに依存します。 今回のケースでは、Ubuntuでテストします。
- ステップ1 *-ノードがUbuntuの場合、メッセージを記録します。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
Log.info("Running on ubuntu") if node.platform['ubuntu']
- ステップ2 *-クックブックをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
Uploading my_cookbook [0.1.0]
Uploaded 1 cookbook.
- ステップ3 *-ノードでChefクライアントを実行します。
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu
...TRUNCATED OUTPUT...
あるいは、特定のプラットフォームに興味がなく、使用している宣言的なプラットフォームを知るだけでよい場合は、次のステートメントを使用できます。
Log.info("Running on a debian derivative") if
platform_family?('debian')
変更されたクックブックをアップロードし、UbuntuノードでChefクライアントを実行すると、次の結果が表示されます。
[2013-03-03T20:16:14+00:00] INFO: Running on a debian
derivative
スクリプトのワークフロー
上記のコマンドで、Ohaiはノードのオペレーティングシステムの現在のステータスを検出し、ノードオブジェクトと共にプラットフォーム属性として保存します。
node['platform']
または、メソッドスタイルの構文を使用することができます-
node.platform
プラットフォーム固有の値の設定
プラットフォーム固有の値を設定するために、chefは便利なメソッドvalue_for_platformおよびvalue_for_platform_familyを提供しています。 複雑なcaseステートメントを回避し、代わりに単純なハッシュを使用するために使用できます。
クックブックの例
execute "start-runsvdir" do
command value_for_platform(
"debian" => { "default" => "runsvdir-start" },
"ubuntu" => { "default" => "start runsvdir" },
"gentoo" => { "default" => "/etc/init.d/runit-start start" }
)
action :nothing
end
上記の例では、コマンドは定義されているOS固有です。
- Debianの場合、「runsvdir-start」が機能します
- Ubuntuの場合、「start runsvdir」が機能します
- Gentooの場合、「/etc/init.d/runit-start」が機能します
シェフ-リソース
Chefリソースは、望ましい状態のオペレーティングシステムの一部を表します。 これは、現在の構成を使用してリソースプロバイダーを使用するノードの望ましい状態を記述する構成ポリシーのステートメントです。 ChefのOhaiメカニズムを使用して、ターゲットマシンの現在のステータスを知るのに役立ちます。 また、ターゲットマシンをその状態にするために実行するために必要な手順を定義するのにも役立ちます。 リソースは、作業構成を説明するレシピにグループ化されます。
- Chefの場合、chef
- Platformは各ノードのプロバイダーとプラットフォームバージョンをマップします。 すべてのChefクライアントの実行の開始時に、Chefサーバーは現在のマシンの詳細を収集します。 後で、Chefサーバーはこれらの値を使用して正しいプロバイダーを識別します。
リソース構文
type 'name' do
attribute 'value'
action :type_of_action
end
上記の構文では、「タイプ」はリソースタイプであり、「名前」は使用する名前です。 「do」ブロックと「end」ブロックには、そのリソースの属性と、その特定のリソースに対して実行する必要があるアクションがあります。
レシピで使用するすべてのリソースには、「do」ブロックと「end」ブロック内で定義される独自のアクションセットがあります。
例
type 'name' do
attribute 'value'
action :type_of_action
end
すべてのリソースは、機能、アクション、プロパティ、条件付き実行、通知、およびアクションの関連パスの共通セットを共有します。
Actions | The *:nothing *action can be used with any resource or custom resource. |
Properties | The ignore_failure, provider, retries, retry_delay, and supports properties can be used with any resource or custom resources. |
Guards | The not_if and only_if conditional executions can be used to put additional guards around certain resources, so that they are only run when the condition is met. |
Guard Interpreters | Evaluates a string command using a* script*-based resource: bash, csh, perl, powershell_script, python, *or ruby*. |
Notifications | The notifies and subscribes notifications can be used with any resource. |
Relative Paths | The #\{ENV['HOME']} relative path can be used with any resource. |
Windows File Security | The template, file, remote_file, cookbook_file, directory, *and remote_directory* resources support the use of inheritance and access control lists (ACLs) within recipes. |
Run in Compile Phase | Sometimes a resource needs to be run before every other resource or after all resources have been added to the resource collection. |
利用可能な資源
apt_package
*apt_package* リソースを使用して、DebianおよびUbuntuプラットフォームのパッケージを管理します。
Bash
*bash* リソースを使用して、Bashインタープリターを使用してスクリプトを実行します。 このリソースは、 *execute* リソースで利用可能なアクションとプロパティのいずれかを使用する場合もあります。 このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
バッチ
*batch* リソースを使用して、cmd.exeインタープリターを使用してバッチスクリプトを実行します。 *batch* リソースは、コマンドをインラインで実行するのではなく、一時ファイルを作成して実行します( *script* リソースの動作に似ています)。
このリソースは、 execute リソースからアクション(:runおよび:nothing)およびプロパティ(creates、cwd、environment、group、path、timeout、およびuser)を継承します。 このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_if および only_if を使用して、このリソースをべき等性から保護します。
bff_package
*installp* ユーティリティを使用して、AIXプラットフォームのパッケージを管理するには、 *bff_package* リソースを使用します。 パッケージをローカルファイルからインストールする場合、 *remote_file* または* cookbook_fileリソース*を使用してノードに追加する必要があります。
chef_gem
*chef_gem* リソースを使用して、Chef-Client専用のRubyのインスタンスのみにgemをインストールします。 gemをローカルファイルからインストールする場合、 *remote_file* または *cookbook_file* リソースを使用して、gemをノードに追加する必要があります。
*chef_gem* リソースは、 *gem_package* リソースと同じプロパティとオプションのすべてで機能しますが、Chef-Clientが実行されているCurrentGemEnvironmentを常に使用するため、gem_binaryプロパティを受け入れません。 *gem_package* リソースと同様のアクションを実行することに加えて、 *chef_gem* リソースは上記を実行します。
cookbook_file
*cookbook_file* リソースを使用して、COOKBOOK_NAME/files/のサブディレクトリからChefClientを実行しているホストにある指定されたパスにファイルを転送します。
ファイルはファイルの特異性に従って選択されるため、ホスト名、ホストプラットフォーム(オペレーティングシステム、ディストリビューション、または必要に応じて)、またはプラットフォームバージョンに基づいて、さまざまなソースファイルを使用できます。 COOKBOOK_NAME/files/defaultサブディレクトリにあるファイルは、どのプラットフォームでも使用できます。
Cron
cronリソースを使用して、時間ベースのジョブスケジューリング用のcronエントリを管理します。 スケジュールのプロパティはデフォルトで&ast;になります。提供されない場合。 cronリソースには、crontabプログラム(通常はcron)へのアクセスが必要です。
Csh
cshインタープリターを使用してスクリプトを実行するには、cshリソースを使用します。 このリソースは、実行リソースで使用可能なアクションとプロパティのいずれかを使用する場合もあります。
このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
展開する
*deploy* リソースを使用して、展開を管理および制御します。 これは一般的なリソースですが、複雑であり、ほとんどのプロパティ、複数のプロバイダー、追加されたコールバックの複雑さ、およびレシピ内からのレイアウト変更をサポートする4つの属性を備えています。
ディレクトリ
- ディレクトリ*リソースを使用してディレクトリを管理します。ディレクトリは、コンピュータに保存されているすべての情報を含むフォルダの階層です。 ルートディレクトリはトップレベルで、その下に残りのディレクトリが編成されます。
*directory* リソースは、nameプロパティを使用して、ディレクトリ内の場所へのパスを指定します。 通常、ディレクトリ内のその場所へのアクセス許可が必要です。
dpkg_package
*dpkg_package* リソースを使用して、 *dpkg* プラットフォームのパッケージを管理します。 パッケージをローカルファイルからインストールする場合、 *remote_file* または *cookbook_file* リソースを使用してノードにパッケージを追加する必要があります。
easy_install_package
*easy_install_package* リソースを使用して、Pythonプラットフォームのパッケージを管理します。
Env
*env* リソースを使用して、Microsoft Windowsで環境キーを管理します。 環境キーを設定したら、タスクスケジューラで環境キーを使用できるようにするには、Microsoft Windowsを再起動する必要があります。
erl_call
*erl_call* リソースを使用して、分散Erlangシステム内にあるノードに接続します。 このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
実行する
*execute* リソースを使用して、単一のコマンドを実行します。 このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 *not_if* および *only_if* を使用して、このリソースをべき等性から保護します。
File
*file* リソースを使用して、ノード上のファイルを直接管理します。
freebsd_package
*freebsd_package* リソースを使用して、FreeBSDプラットフォームのパッケージを管理します。
gem_package
*gem_package* リソースを使用して、レシピにのみ含まれるgemパッケージを管理します。 パッケージをローカルファイルからインストールする場合、 *remote_file* または *cookbook_file* リソースを使用してノードにパッケージを追加する必要があります。
Git
*git* リソースを使用して、gitリポジトリに存在するソース管理リソースを管理します。 gitリソースのすべての機能を使用するには、gitバージョン1.6.5以降が必要です。
グループ
*group* リソースを使用して、ローカルグループを管理します。
homebrew_package
*homebrew_package* リソースを使用して、Mac OS Xプラットフォームのパッケージを管理します。
http_request
*http_request* リソースを使用して、任意のメッセージでHTTPリクエスト(GET、PUT、POST、DELETE、HEAD、またはOPTIONS)を送信します。 このリソースは、カスタムコールバックが必要な場合に役立ちます。
ifconfig
インターフェイスを管理するには、 ifconfig リソースを使用します。
ips_package
*ips_package* リソースを使用して、Solaris 11プラットフォームで(Image Packaging System(IPS)を使用して)パッケージを管理します。
Ksh
*ksh* リソースを使用して、Kornシェル(ksh)インタープリターを使用してスクリプトを実行します。 このリソースは、実行リソースで使用可能なアクションとプロパティのいずれかを使用する場合もあります。
このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
Link
*link* リソースを使用して、シンボリックリンクまたはハードリンクを作成します。
Log
- log リソースを使用して、ログエントリを作成します。 ログリソースは他のリソースと同様に動作します。コンパイルフェーズでリソースコレクションに組み込まれ、実行フェーズで実行されます。 (リソースコレクションに組み込まれていないログエントリを作成するには、ログリソースの代わりにChef
- Logを使用します)
macports_package
macports_packageリソースを使用して、Mac OS Xプラットフォームのパッケージを管理します。
MDADM
*mdadm* リソースを使用して、mdadmユーティリティを使用してLinux環境でRAIDデバイスを管理します。 mdadmプロバイダーはアレイを作成およびアセンブルしますが、再起動時にアレイを永続化するために使用される構成ファイルは作成しません。
構成ファイルが必要な場合は、正しいアレイレイアウトのテンプレートを指定してから、マウントプロバイダーを使用してファイルシステムテーブル(fstab)エントリを作成する必要があります。
マウント
マウントリソースを使用して、マウントされたファイルシステムを管理します。
Ohai
*ohai* リソースを使用して、ノードにOhai設定を再読み込みします。 これにより、システム属性を変更するレシピ(ユーザーを追加するレシピなど)は、後でchef-clientの実行中にそれらの属性を参照できます。
パッケージ
*package* リソースを使用してパッケージを管理します。 パッケージをローカルファイル(RubyGems、dpkg、RPMパッケージマネージャーなど)からインストールする場合、remote_fileまたはcookbook_fileリソースを使用してファイルをノードに追加する必要があります。
pacman_package
*pacman_package* リソースを使用して、Arch Linuxプラットフォームでパッケージを管理します(pacmanを使用)。
powershell_script
*powershell_script* リソースを使用して、Windows PowerShellインタープリターを使用してスクリプトを実行します。これは、スクリプトおよびスクリプトベースのリソース(bash、csh、perl、python、およびruby)の使用方法とよく似ています。 powershell_scriptは、Microsoft WindowsプラットフォームおよびWindows PowerShellインタープリターに固有です。
Python
Pythonインタープリターを使用してスクリプトを実行するには、 python リソースを使用します。 このリソースは、実行リソースで使用可能なアクションとプロパティのいずれかを使用する場合もあります。
このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
リブート
*reboot* リソースを使用してノードを再起動します。これは、特定のプラットフォームでのインストールに必要な手順です。 このリソースは、Microsoft Windows、Mac OS X、およびLinuxプラットフォームでの使用がサポートされています。
registry_key
*registry_key* リソースを使用して、Microsoft Windowsでレジストリキーを作成および削除します。
remote_directory
*remote_directory* リソースを使用して、ディレクトリをクックブックからノードに増分転送します。 クックブックからコピーされるディレクトリは、COOKBOOK_NAME/files/default/REMOTE_DIRECTORYにあります。
remote_directoryリソースはファイルの特異性に従います。
remote_file
*remote_file* リソースを使用して、ファイルの特異性を使用してリモートの場所からファイルを転送します。 このリソースは、ファイルリソースに似ています。
ルート
Linuxリソースでは、ルートリソースを使用してシステムルーティングテーブルを管理します。
rpm_package
*rpm_package* リソースを使用して、RPM Package Managerプラットフォームのパッケージを管理します。
Ruby
Rubyインタープリターを使用してスクリプトを実行するには、 ruby リソースを使用します。 このリソースは、実行リソースで使用可能なアクションとプロパティのいずれかを使用する場合もあります。
このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
ruby_block
*ruby_block* リソースを使用して、Chef-Clientの実行中にRubyコードを実行します。 ruby_blockリソース内のRubyコードは、コンバージェンス中に他のリソースとともに評価されますが、ruby_blockリソース外のRubyコードは、レシピがコンパイルされるときに他のリソースよりも前に評価されます。
スクリプト
スクリプトリソースを使用して、Bash、csh、Perl、Python、Rubyなどの指定されたインタープリターを使用してスクリプトを実行します。 このリソースは、実行リソースで使用可能なアクションとプロパティのいずれかを使用する場合もあります。
このリソースで実行されるコマンドは、それらが実行される環境に通常一意であるため、(本来)by等ではありません。 not_ifおよびonly_ifを使用して、このリソースのべき等性を保護します。
サービス
*service* リソースを使用して、サービスを管理します。
smart_os_package
*smartos_package* リソースを使用して、SmartOSプラットフォームのパッケージを管理します。
solaris_package
*solaris_package* リソースは、Solarisプラットフォームのパッケージを管理するために使用されます。
転覆
*subversion* リソースを使用して、Subversionリポジトリに存在するソース管理リソースを管理します。
テンプレート
*template* リソースを使用して、COOKBOOK_NAME/templates/のサブディレクトリからChef-Clientを実行しているホストにある指定されたパスにファイルを転送することにより、埋め込みRuby(ERB)テンプレートを使用してファイルのコンテンツを管理します。 このリソースには、ファイルリソースのアクションとプロパティが含まれます。 テンプレートリソースによって管理されるテンプレートファイルは、remote_fileおよびファイルリソースと同じファイル固有の規則に従います。
User
*user* リソースを使用して、ユーザーの追加、既存のユーザーの更新、ユーザーの削除、およびユーザーパスワードのロック/ロック解除を行います。
windows_package
*windows_package* リソースを使用して、Microsoft Windowsプラットフォーム用のMicrosoft Installer Package(MSI)パッケージを管理します。
windows_service
*windows_service* リソースを使用して、Microsoft Windowsプラットフォーム上のサービスを管理します。
yum_package
*yum_package* リソースを使用して、Red HatおよびCentOSプラットフォームのYumでパッケージをインストール、アップグレード、および削除します。 yum_packageリソースは、Yumがコマンドラインから実行されたときにできるように、パッケージのデータを解決できます。 これにより、最小バージョン、仮想提供、ライブラリ名など、パッケージをインストールするためのさまざまなオプションが可能になります。
シェフ-軽量リソースプロバイダー
- Lightweight Resource Provider(LWRP)*は、機能を拡張することで利用可能なリソースのリストを拡張するオプションを提供し、Chefユーザーがカスタムリソースを作成できるようにします。
カスタムリソースを作成すると、レシピコードをより表現力豊かにするのに役立つChef DSLを使用して充実したカスタムリソースを所有できるため、単にクックブックを作成できます。
Chefコミュニティでは、カスタムリソースの多くはLWRPを使用して実装されます。 iptables_rules や apt_repository など、LWRPの多くの実例があります。
作業方法
クックブック名Testing_resourceと、Testing_resourceクックブックを含むノードのrun_listがあることを確認してください。
LWRPの構築
- ステップ1 *-Testing_resourceクックブックでカスタムリソースを作成します。
vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/resources/default.rb
actions :create, :remove
attribute :title, kind_of: String, default: "World"
attribute :path, kind_of: String, default: "/tmp/greeting.txt"
- ステップ2 *-Tesing_resourceクックブックでリソースのプロバイダーを作成します。
vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/provider/default.rb
action :create do
log "Adding '#{new_resource.name}' greeting as #{new_resource.
path}"
file new_resource.path do
content "#{new_resource.name}, #{new_resource.title}!"
action :create
end
action :remove do
Chef::Log.info "Removing '#{new_resource.name}' greeting #{new_resource.path}"
file new_resource.path do
action :delete
end
end
- ステップ3 *-Testing_resourceのデフォルトレシピを編集して、新しいリソースを使用します。
vipin@laptop:~/chef-repo $ subl cookbooks/Tesing_resource/recipes/default.rb
greeting "Ohai" do
title "Chef"
action :create
end
- ステップ4 *-変更したクックブックをChefサーバーにアップロードします。
vipin@laptop:~/chef-repo $ knife cookbook upload greeting
Uploading greeting [0.1.0]
- ステップ5 *-ノードでChef-Clientを実行します。
vipin@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
2013-06-28T21:32:54+00:00] INFO: Processing greeting[Ohai] action
create (greeting::default line 9)
[2013-06-28T21:32:54+00:00] INFO: Adding 'Ohai' greeting as/tmp/
greeting.txt
[2013-06-28T21:32:54+00:00] INFO: Processing file[/tmp/greeting.
txt] action create (/srv/chef/file_store/cookbooks/greeting/
providers/default.rb line 7)
[2013-06-28T21:32:54+00:00] INFO: entered create
[2013-06-28T21:32:54+00:00] INFO: file[/tmp/greeting.txt] created
file/tmp/greeting.txt
...TRUNCATED OUTPUT...
- ステップ6 *-生成されたファイルの内容を検証します。
user@server:~$ cat/tmp/greeting.txt
Ohai, Chef!
ワークフロースクリプト
LWRPは料理の本に住んでいます。 カスタムリソースはクックブック内に存在し、クックブック名の下で使用できます。 ワークフローでは、まず定義を定義してから、クックブックで使用されるリソースに属性を渡します。 最後に、レシピでこれらのアクションと属性を使用します。
シェフ-設計図
Chefでは、設計図はサーバー上に存在するものを正確に見つけて記録するためのツールです。 ブループリントは、ディレクター、パッケージ、構成ファイルなど、必要なすべてのものを記録します。 ブループリントには、サーバー情報をさまざまな形式で分割する機能があります。 それらの1つはシェフのレシピです。 これは、Chefを使用して一意のサーバーを構成するのに役立ちます。
装着方法
ブループリントを実行する必要があるノードにPythonとGitをインストールする必要があります。
- ステップ1 *-ブループリントをインストールします。
vipin@server:~$ pip install blueprint
- ステップ2 *-ブループリントを作成します。
user@server:~$ sudo blueprint create internal-cookbook
# [blueprint] using cached blueprintignore(5) rules
# [blueprint] searching for Python packages
# [blueprint] searching for PEAR/PECL packages
# [blueprint] searching for Yum packages
# [blueprint] searching for Ruby gems
# [blueprint] searching for npm packages
# [blueprint] searching for software built from source
# [blueprint] searching for configuration files
# [blueprint]/etc/ssl/certs/AC_Ra\xc3\xadz_Certic\xc3\
xa1mara_S.A..pem not UTF-8 - skipping it
# [blueprint]/etc/ssl/certs/NetLock_Arany_=Class_Gold=_F\xc5\
x91tan\xc3\xbas\xc3\xadtv\xc3\xa1ny.pem not UTF-8 - skipping it
# [blueprint]/etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_Sa\
xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1.pem not UTF-8 - skipping it
# [blueprint]/etc/ssl/certs/Certinomis_-_Autorit\xc3\xa9_Racine.
pem not UTF-8 - skipping it
# [blueprint]/etc/ssl/certs/T\xc3\x9cB\xc4\xb0TAK_UEKAE_K\xc3\
xb6k_Sertifika_Hizmet_Sa\xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1_-_S\
xc3\xbcr\xc3\xbcm_3.pem not UTF-8 - skipping it
# [blueprint] searching for APT packages
# [blueprint] searching for service dependencies
- ステップ3 *-ブループリントからクックブックを作成します。
user@server:~$ blueprint show -C internal-cookbook my-server/recipes/default.rb
- ステップ4 *-生成されたファイルの内容を検証します。
user@server:~$ cat internal-cookbook/recipes/default.rb
#
# Automatically generated by blueprint(7). Edit at your own risk.
#
cookbook_file('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar')
do
backup false
group 'root'
mode '0644'
owner 'root'
source 'tmp/96468fd1cc36927a027045b223c61065de6bc575.tar'
end
execute('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar') do
command 'tar xf "/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar"'
cwd '/usr/local'
end
directory('/etc/apt/apt.conf.d') do
...TRUNCATED OUTPUT...
service('ssh') do
action [:enable, :start]
subscribes :restart, resources('cookbook_file[/etc/default/
keyboard]', 'cookbook_file[/etc/default/console-setup]',
'cookbook_file[/etc/default/ntfs-3g]', 'package[openssh-server]',
'execute[96468fd1cc36927a027045b223c61065de6bc575.tar]')
end
ワークフロースクリプト
ブループリントは、サーバーの関連するすべての構成データを見つけてGitリポジトリに保存するPythonパッケージです。 各ブループリントには独自の名前があります。
さまざまなフォルマントでGitリポジトリのコンテンツを表示するように設計図を要求できます。
user@server:~$ ls -l internal-cookbook/
total 8
drwxrwxr-x 3 vagrant vagrant 4096 Jun 28 06:01 files
-rw-rw-r-- 1 vagrant vagrant 0 Jun 28 06:01 metadata.rb
drwxrwxr-x 2 vagrant vagrant 4096 Jun 28 06:01 recipes
ブループリント表示コマンド
user@server:~$ blueprint show-packages my-server
...TRUNCATED OUTPUT...
apt wireless-regdb 2011.04.28-1ubuntu3
apt zlib1g-dev 1:1.2.3.4.dfsg-3ubuntu4
python2.7 distribute 0.6.45
python2.7 pip 1.3.1
pip blueprint 3.4.2
pip virtualenv 1.9.1
上記のコマンドは、インストールされているすべての種類のパッケージを表示します。 他のshowコマンドは次のとおりです-
- ショーファイル
- ショーサービス
- show-sources
シェフ-ファイルとパッケージ
Chefでは、構成ファイルの作成とパッケージの移動が重要なコンポーネントです。 Chefが同じことを管理する方法は複数あります。 Chefがファイルとソフトウェアパッケージの処理でサポートする方法は複数あります。
サードパーティリポジトリからのパッケージのインストール
- ステップ1 *-クックブックのデフォルトのレシピを編集します。
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
include_recipe "apt"
apt_repository "s3tools" do
uri "http://s3tools.org/repo/deb-all"
components ["stable/"]
key "http://s3tools.org/repo/deb-all/stable/s3tools.key"
action :add
end
package "s3cmd"
- ステップ2 *-メタデータを編集して、aptクックブックへの依存関係を追加します。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/metadata.rb
...
depends "apt"
- ステップ3 *-変更したクックブックをChefサーバーにアップロードします。
- ステップ4 *-インストールしようとしているパッケージがまだインストールされていないことを検証します。
- ステップ5 *-デフォルトのレポを検証します。
- ステップ6 *-ノードでChef-Clientを実行します。
- ステップ7 *-必要なパッケージがインストールされていることを検証します。
ソースからソフトウェアをインストールする
特定のプラットフォームのパッケージとして利用できないソフトウェアをインストールする必要がある場合は、自分でコンパイルする必要があります。 Chefでは、スクリプトリソースを使用してこれを行うことができます。
- ステップ1 *-デフォルトのレシピを編集します。
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/
default.rb
version = "1.3.9"
bash "install_nginx_from_source" do
cwd Chef::Config['file_cache_path']
code ≪-EOH
wget http://nginx.org/download/nginx-#{version}.tar.gz
tar zxf nginx-#{version}.tar.gz &&
cd nginx-#{version} &&
./configure && make && make install
EOH
- ステップ2 *-変更したクックブックをChefサーバーにアップロードします。
- ステップ3 *-ノードでChef-Clientを実行します。
- ステップ4 *-nginxがインストールされていることを検証します。
シェフ-コミュニティクックブック
コミュニティクックブックは、他のクックブックに似ています。 コミュニティクックブックと呼ばれる唯一の理由は、クックブックを書くことを知っている人なら誰でもこのコミュニティに参加して、クックブックを中央ハブにアップロードできるからです。 これらのクックブックは無料で利用でき、誰でもダウンロードして使用できます。 これらのコミュニティクックブックを使用するには、それらをダウンロードし、要件に従って変更し、それぞれのChefサーバーにアップロードする必要があります。
クックブックを更新、アップロード、ダウンロードするには、システムでナイフを設定する必要があります。 knife cookbookコマンドを使用してクックブックを操作します。 ナイフクックブックを使用すると、クックブックを作成、削除、表示、一覧表示、ダウンロード、およびアップロードできます。 第7章の詳細については、knife cookbookコマンドのドキュメントを参照してください。
コミュニティクックブックのリンクを次に示します。https://supermarket.chef.io/cookbooks-directory[https://supermarket.chef.io/cookbooksdirectory]