chef実行サイクルで押さえておきたいポイント

Nオガワです。
今回は、chefを始めるにあたり知っておきたいchefの実行サイクルのポイントに関してご紹介します。
chefを触ったことがない方向けです。

chef実行サイクル

実装する上で、押さえておきたいポイントは以下の順序の実行サイクルです。
以降で押さえておきたいポイントの詳細を説明していきます。
1. cookbookのコンパイル(rubyスクリプトの実行はここ)
2. レシピ内のchefリソースの実行
3. Notifications(Timersに[:delayed]指定)
[補足]chefserverとの通信、認証処理、cookbookのダウンロード等他にも処理はありますが、実装上意識するケースはそんなにないと思いますので割愛しています。

cookbookのコンパイル(rubyスクリプトの実行はここ)

ここで紹介したいのは、cookbookのコンパイルがこのタイミングで行われるということよりも、rubyスクリプトの実行がコンパイル時に行われるということです。
以下のコード例でレシピを実行した結果を確認します。
p "実行順序テスト①"」、「p "実行順序テスト②"」がrubyスクリプトに該当します。

p "実行順序テスト①"
# apacheインストール
package 'httpd' do
version '2.4.6'
action :install
end
service "httpd" do
action [ :enable, :start ]
end
package 'mod_ssl' do
action :install
notifies :restart, 'service[httpd]', :delayed
end
# mysqlインストール
bash 'mysql install' do
code <<-EOH
yum -y remove mariadb-libs
rm -rf /var/lib/mysql/
yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum -y install mysql-community-server-5.7.22
EOH
not_if "rpm -qa | grep mysql-community-server"
end
service "mysqld" do
action [ :enable, :start ]
end
# phpインストール
package 'php' do
version '5.4.16'
action :install
end
p "実行順序テスト②"

実行結果をみてみます。
以下のログから、rubyスクリプトはレシピ内のリソースが実行されるよりも前に、コンパイル時に実行されていることがみてとれます。(package,service,bash等のchefリソースよりも前に実行される)
前回の記事からの流れもあってkitchen converge実行時のログで確認しています。

       Compiling Cookbooks...
"実行順序テスト①"
"実行順序テスト②"
Converging 6 resources
Recipe: blog_demo::default
* yum_package[httpd] action install
- install version 2.4.6 of package httpd
* service[httpd] action enable
- enable service service[httpd]
* service[httpd] action start
- start service service[httpd]
* yum_package[mod_ssl] action install
- install version 1:2.4.6-80.el7.centos.1.x86_64 of package mod_ssl
* bash[mysql install] action run
- execute "bash"  "/tmp/chef-script20180802-1251-kcvbs7"
* service[mysqld] action enable (up to date)
* service[mysqld] action start
- start service service[mysqld]
* yum_package[php] action install
- install version 5.4.16 of package php
* service[httpd] action restart
- restart service service[httpd]
Running handlers:
Running handlers complete
Chef Client finished, 8/9 resources updated in 01 minutes 12 seconds
Downloading files from 
Finished converging  (2m28.78s).

ではrubyスクリプトをリソースが実行されるタイミングで実施するにはどうすれば良いか?ということですが、その場合は、ruby_blockリソースを利用します。
例にあげたコードのrubyスクリプトの実行箇所を以下に書き換えます。

ruby_block 'ruby_script_test1' do
block do
p "実行順序テスト①"
end
end
・
・(割愛)
・
ruby_block 'ruby_script_test2' do
block do
p "実行順序テスト②"
end
end

実行結果は以下になります。ruby_blockリソースにrubyスクリプトを含めることで、コンパイル後のリソースの実行時に、rubyスクリプトが実行されていることがわかります。

       Compiling Cookbooks...
Converging 8 resources
Recipe: blog_demo::default
* ruby_block[ruby_script_test1] action run"実行順序テスト①"
- execute the ruby block ruby_script_test1
* yum_package[httpd] action install
- install version 2.4.6 of package httpd
* service[httpd] action enable (up to date)
* service[httpd] action start (up to date)
* yum_package[mod_ssl] action install (up to date)
* bash[mysql install] action run (skipped due to not_if)
* service[mysqld] action enable (up to date)
* service[mysqld] action start (up to date)
* yum_package[php] action install
- install version 5.4.16 of package php
* ruby_block[ruby_script_test2] action run"実行順序テスト②"
- execute the ruby block ruby_script_test2
Running handlers:
Running handlers complete
Chef Client finished, 4/10 resources updated in 04 seconds
Downloading files from 
Finished converging  (0m7.78s).

Notifications(Timersに[:delayed]指定)

テストコード上で以下の通り、packageリソース内にnotifiesを利用してリソース実行時にserviceリソースへ通知して、apacheの再起動を実施しています。ここで説明したいのは「:delayed」の記述です。

package 'mod_ssl' do
action :install
notifies :restart, 'service[httpd]', :delayed
end

本記事内の一番初めの実行ログの結果(以下にも記載)を確認すると、serviceリソースによるapacheの再起動(service[httpd] action restart)が最後に行われていることがわかります。このように「:delayed」を指定すると、全リソース実行の一番最後に処理が行われます。

       Compiling Cookbooks...
"実行順序テスト①"
"実行順序テスト②"
Converging 6 resources
Recipe: blog_demo::default
* yum_package[httpd] action install
- install version 2.4.6 of package httpd
* service[httpd] action enable
- enable service service[httpd]
* service[httpd] action start
- start service service[httpd]
* yum_package[mod_ssl] action install
- install version 1:2.4.6-80.el7.centos.1.x86_64 of package mod_ssl
* bash[mysql install] action run
- execute "bash"  "/tmp/chef-script20180802-1251-kcvbs7"
* service[mysqld] action enable (up to date)
* service[mysqld] action start
- start service service[mysqld]
* yum_package[php] action install
- install version 5.4.16 of package php
* service[httpd] action restart
- restart service service[httpd]
Running handlers:
Running handlers complete
Chef Client finished, 8/9 resources updated in 01 minutes 12 seconds
Downloading files from 
Finished converging  (2m28.78s).

通知元のリソースが実行された直後に通知先のリソースを実行したい場合は、「:immediately」を利用します。以下実行時の結果です。呼び出しもとのリソース(yum_package[mod_ssl] action install)が実行された直後にapacheの再起動(service[httpd] action restart)が行われていることがわかります。

       Compiling Cookbooks...
"実行順序テスト①"
"実行順序テスト②"
Converging 6 resources
Recipe: blog_demo::default
* yum_package[httpd] action install
- install version 2.4.6 of package httpd
* service[httpd] action enable
- enable service service[httpd]
* service[httpd] action start
- start service service[httpd]
* yum_package[mod_ssl] action install
- install version 1:2.4.6-80.el7.centos.1.x86_64 of package mod_ssl
* service[httpd] action restart
- restart service service[httpd]
* bash[mysql install] action run
- execute "bash"  "/tmp/chef-script20180802-1729-10ypgwu"
* service[mysqld] action enable (up to date)
* service[mysqld] action start
- start service service[mysqld]
* yum_package[php] action install
- install version 5.4.16 of package php
Running handlers:
Running handlers complete
Chef Client finished, 8/9 resources updated in 01 minutes 01 seconds
Downloading files from 
Finished converging  (1m3.71s).

最後に

chefの実行サイクルに関してご紹介させていただきました。
初めに実行サイクルや、Notificationsの実行タイミングを押さえておくと、処理の順番を意図的に操作するときに便利です。
読んでいただきありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA