※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
これまで2回にわたってChef Server、Workstationの構築と、Chef Nodeをknife-cloudstack-fogツールで作成する手順について解説してきました。過去の記事へのリンクは以下の通りです。
第1回:Chef Server導入編
第2回:Chef Workstation/Node構築編
今回は、Chefを使ってNodeに様々な設定を行うためのCookbookを作成、編集する方法について、『nginxのインストール、設定』を例にしながら解説していきます。
なお、今回の記事は、Chef Clientのバージョン10.14.4にて検証いたしました。古いバージョン(特にChef 10.12.10よりも前)では挙動が異なる場合がありますので、ご注意ください。
今回解説する作業は次の通りです。
- 導入済みのApacheの削除
- nginxおよび依存するCookbookの入手
- Chef ServerへのCookbookのアップロードとNodeへの配布・実行
- Cookbookの依存関係の設定、確認方法
- Recipe実行でエラーが出た時の調査
導入済みのApacheの削除
前回までで作成したNodeにはApacheがすでに導入されていますが、NginxとTCP/80ポートの衝突を避けるため、一旦削除してみます。
まず、Chef Serverの管理画面の「Nodes」タブから対象ノードを選んで「Edit」をクリックします。すると、現在割り当てられているRecipeとして、Apache2が含まれていますので、Drag & Dropで左下のRecipe一覧にApache2を移動させます。これでNodeからApache2のcookbookは削除されるよう設定されました。
次に、NodeにSSHログインして、chef-client
コマンドを実行することで、すぐに設定を反映させます。その後、Apacheの存在などを確認します。
[Node]# chef-client
・・・たくさんの出力・・・
[Node]# rpm -qa | grep httpd
[Node]# service httpd status
Cookbookの削除は行いましたが、Apacheの削除は自動では行われません。(Recipeに明示的に削除する記述などをしておけば話は別ですが。)そこで、手動でApacheを削除します。
[Node]# yum remove httpd*
(httpdとhttpd-toolsをアンインストール)
[Node]# rpm -qa | grep httpd
(出力されないことを確認)
[Node]# service httpd status
(サービスが存在しないとエラーが出ることを確認)
このように、CookbookのNodeから削除してもパッケージ削除やサービス停止は自動的には行われませんので、検証を行う際は注意が必要です。
nginxおよび依存するCookbookの入手
次に、WorkstationでnginxのCookbookおよび依存するCookbookを入手します。手動でダウンロードしてきても良いのですが、ここではknife cookbook
コマンドを利用します。
[Workstation]$ knife cookbook site install nginx
Installing nginx to /home/hoge/chef-repo/cookbooks
Checking out the master branch.
Pristine copy branch (chef-vendor-nginx) exists, switching to it. Downloading nginx from the cookbooks site at version 1.0.2 to /home/hoge/chef-repo/cookbooks/nginx.tar.gz
Cookbook saved: /home/hoge/chef-repo/cookbooks/nginx.tar.gz
Removing pre-existing version.
Uncompressing nginx version 1.0.2.
removing downloaded tarball
No changes made to nginx
Checking out the master branch.
・・・(以下省略)・・・
[Workstation]$ ls cookbooks
apache2 bluepill build-essential getting-started nginx ohai runit yum
上記の出力をみると、nginx以外にも依存関係のあるCookbookもダウンロードされます。cookbooks
ディレクトリ内を確認すると、以下の通り複数のサブディレクトリができていることがわかります。
Chef ServerへのCookbookのアップロードとNodeへの配布・実行
Cookbookがダウンロードされていることを確認したら、Chef Nodeにnginxをインストールします。
(cookbookのアップロード)
[Workstation]$ knife cookbook upload -a
・・・(cookbookのアップロード)・・・
(Nodeへのrecipe追加)
[Workstation]$ knife node run_list add ChefClient1 recipe[nginx]
run_list:
recipe[getting-started]
recipe[nginx]
(Chef Nodeへのログインとrecipeの実行)
[Workstation]$ ssh -i ~/chef-repo/.chef/srv2clt.pem root@(ChefClient1のIPアドレス)
[Node]# chef-client
・・・(大量の出力)・・・
(nginxが起動しHTTPアクセスに応答することを確認)
[Node]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost. Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
(以下nginxのデフォルトコンテンツ)
以上で、nginxのインストールがChef経由で実行できました。
ここから先は、nginxのCookbookに関連して何点かCookbook検証に必要となりそうな事項について解説いたします。
Cookbookの依存関係の設定、確認方法
先ほどnginxのCookbookをダウンロードした際、依存関係があるbluepill、build-essential、ohai、runit、yumというCookbookも一緒にダウンロードされました。このように、Cookbookには依存関係を定義することができます。
この依存関係は各Cookbookのmetadata.rbファイルに記述されています。nginxの場合の依存関係の記述は以下の通りです。
[Workstation]$ cat cookbooks/nginx/metadata.rb
・・・
%w{ build-essential runit bluepill yum }.each do |cb|
depends cb
end
depends 'ohai', '>= 1.1.0'
・・・
ここでは、bluepill 、build-essential、runit、yumに依存すること、そしてohaiのバージョンが1.1.x系であることが指定されています。 nginxのCookbookと依存関係のあるCookbookですが、CentOSにPackageとしてnginxをインストールする際には、bluepillとrunitは不要です。不要なものは関連付けたくない、という方は上記metadata.rbを編集することで依存関係を外すことができます。ただし、metadata.rbを編集した後は、以下のようにmetadata.jsonファイルを更新する必要があります。
$ vi cookbooks/nginx/metadata.rb
(編集)
[Workstation]$ knife cookbook metadata nginx
(metadata.jsonが生成される)
Recipe実行でエラーが出た時の調査
cookbookを自分で編集、もしくは新規作成していくと、当然記述ミスがあったりしてNodeで正しく実行されない場合があります。その際、エラーログがどこにどのように出力されるのかを説明します。
ここでは、nginx導入済みのNodeに最初に削除したApache2のrecipeを再導入してみます。これは、TCP 80番ポートをListenするプロセスが複数になってしまうため、Apacheのサービスが起動できず、エラーになります。
[Workstation]$ knife node run_list add ChefClient1 recipe[apache2]
run_list:
recipe[getting-started]
recipe[nginx]
recipe[apache2]
[Workstation]$ ssh -i ~/chef-repo/.chef/srv2clt.pem root@(ChefClient1のIPアドレス)
[Node]# chef-client
・・・・・・ ================================================================================ Error executing action `start` on resource 'service[apache2]' ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ Expected process to exit with [0], but received '1'
---- Begin output of /sbin/service httpd start ----
STDOUT: httpd を起動中: [失敗]
STDERR: (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
---- End output of /sbin/service httpd start ----
Ran /sbin/service httpd start returned 1
・・・(以下、エラーの内容およびStack Traceの出力)
この出力を見ると、TCP 80番ポートが既にListenされているためApacheのプロセス起動に失敗していることがわかります。ただ、chef-client
コマンドを直接実行しなかった(デフォルトで30分ごとに自動実行される)場合や、この出力を見逃した場合、エラーの一部がNodeの/var/chef/cache/chef-stacktrace.out
ファイルに保存されています。上記エラーログの中の「---- Begin output of・・・」から「---- End output of・・・」の部分も保存されているため、原因究明に役立ちます。
[Node]# cat /var/chef/cache/chef-stacktrace.out
Generated at (日時)
Mixlib::ShellOut::ShellCommandFailed: service[apache2] (apache2::default line 219) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /sbin/service httpd start ----
STDOUT: httpd を起動中: [失敗]
STDERR: (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
---- End output of /sbin/service httpd start ----
Ran /sbin/service httpd start returned 1
・・・
まとめ
これまで3回にわたり、Chefの検証環境構築、およびCookbookの使い方などについて解説してまいりました。ぜひ、構成管理ツール「Chef」を使って、システムの構成管理、構築自動化にチャレンジしてみてください。
<連載記事>
- IDCFクラウドでChefを使い始めるまで―第1回 Chef Server導入編
- IDCFクラウドでChefを使い始めるまで―第2回 Chef Workstation・Node構築編
- IDCFクラウドでChefを使い始めるまで―第3回 Cookbook検証編
- 【Chef 11版】Chef Server環境セットアップ手順の紹介