24時間365日フルマネージドホスティングサービスのデイーネット

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」を利用します。以下実行時の結果です。呼び出しもとのリソース(yumpackage[modssl] 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の実行タイミングを押さえておくと、処理の順番を意図的に操作するときに便利です。

読んでいただきありがとうございました。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar