(1)node定義ファイル(./chef-repo/node/[hostname].json)から取得する方法
node定義ファイル内で定義されたパラメータをrecipe内で取得することが可能となる。
{ "mariadb" : { "mysql_root_pass" : "FM11AD2+" }, "wordpress" : { "wordpress_latest" : "https://ja.wordpress.org/latest-ja.tar.gz", }, "hostinfo" : { "hostname" : "tissvv096" } }
上記のように、定義を行うとrecipe内でnode[]の処理でjson形式のデータの取得が行える。
# Parameter settings hostname = node['hostinfo']['hostname'] mysql_root_pass = node['mariadb']['mysql_root_pass'] wordpress_latest = node['wordpress']['wordpress_latest']
(2)defaultパラメータ定義ファイル(./chef-repo/site-cookbooks/wordpress_sample/attributes/default.rb)から取得する方法
defaultパラメータ定義ファイルに以下のように記述しておくと、node定義ファイルにパラメータ設定がなかった場合に設定値が補完される。補完する処理についてはrecipeに記述する必要はないが、node[]と[]の部分は統一しておくことが必須となる。
# Paramaters default default['hostinfo']['hostname'] = "localhost" default['mariadb']['mysql_root_pass'] = "password" default['wordpress']['wordpress_latest'] = "https://wordpress.org/latest.tar.gz"
Chefのrecipeの記述方法は、公式サイトのLEARN CHEFに詳しく記載されているので、こちらを参照いただきたい。
(1)yumコマンドでのパッケージの制御
yumコマンドでのパッケージのインストールはyum_pakageリソースを利用する。recipe内では複数のパッケージをインストールするために、[]内にスペース区切りで記述している。
# install packages yum_package [ 'mariadb-server', 'httpd', 'php', 'php-mysql' ] do action :install end
1個のパッケージの場合は[]はなくても動作する。
# install packages yum_package 'mariadb-server' do action :install end
actionでは install以外にupdata/removeなども設定することができる。ただ、yum updateによる全パッケージのupdateはできないようで、今回のrecipeではnode側で“yum updaet -y”を実行する形を採っている。
(2)serviceの起動制御
serviceの起動(CentOS 7.2の場合、systemctlコマンド)の実行はserviceリソース(https://docs.chef.io/resources.html#service)で行う。下記の例ではstart実行後にenableを設定している。
# start/enable mariadb service 'mariadb' do supports :status => true, :restart => true, :reload => true action [:start, :enable] end
recipeの中で同一サービスのserviceリソースを複数回記述すると、実行前のチェック処理でエラーとなってしまう。今回の処理の中では、mariadbのrootのパスワード設定後にサービスのrestartが必要だが、その処理をserviceリソースで行うことができず、executeやbashコマンドでsystemctl restart mariadbを呼び出す形で対処している。
(3)node上でのコマンドを実行
recipe内でnode側で任意のコマンドを実行させることが可能である。リソースは以下の2種類が提供されている。
リソース | 特長 | 用途 |
---|---|---|
execute | commandのパラメータに指定されたコマンドをsh -cで実行する。node側の実行ユーザーの環境変数/PATH/aliasなどの影響がない | node上での単純なコマンドの実行 |
bash | codeのパラメータに指定されたコマンドをbashコマンドで実行する。codeのパラメータをいったん、/tmp以下の一時ファイルに作成するため、シェルスクリプトの制御処理を記述することもできる。さらに実行ユーザーの環境変数/PATH/aliasも利用できる | 処理制御やnode側の環境変数が必要な一時シェルスクリプトの実行 |
executeもbashも基本的な書式は同じである。commandやcodeの後ろにコマンドを記述する。コマンドが単一行の場合は"〜"または'〜'でくくる。複数行の場合は<<-文字列(EOC)〜文字列(EOC)の間の部分が1回のコマンドとして解釈されるので、<<-文字列(EOC)〜文字列(EOC)でくくるといいだろう(単一行でも使える)。
update packages execute 'yum-update' do user 'root' command 'yum -y update' end
# create wordpress config bash 'create wordpress config' do code <<-EOC sed -e "s/\\(define.*'\\)database_name_here\\('.*\\)/\\1#{wp_db_name}\\2/" \ -e "s/\\(define.*'\\)username_here\\('.*\\)/\\1#{wp_db_user}\\2/" \ -e "s/\\(define.*'\\)password_here\\('.*\\)/\\1#{wp_db_pass}\\2/" \ -e "s/\\(define.*'\\)put your unique phrase here\\('.*\\)/\\1#{wp_unique_phrase}\\2/" \ /var/www/wordpress/wp-config-sample.php > /var/www/wordpress/wp-config.php EOC not_if { File.exists?('/var/www/wordpress/wp-config.php') } end
(4)templateを利用したファイルの作成
設定ファイルなどを新規に作成する場合、fileリソースを使用する。contextパラメータにファイルの内容を直接記載することも可能だが、ファイルの内容全部をrecipeに記載するのは、保守性の面でも可視性の面でも、やや問題がある。その対策としてtemplateリソースを利用して作成する方法が提供されている。
このrecipeでは/root/.my.cnfをmy.cnf.erbというtemplateファイルから作成する処理を記載している。templateファイルは./site-cookbook/[recipe name]/template直下のファイルが参照される。
# create /root/.my.cnf template '/root/.my.cnf' do owner 'root' group 'root' mode '600' source 'my.cnf.erb' variables({ :mysql_root_pass => mysql_root_pass }) not_if { File.exists?('/root/.my.cnf') } end
recipeのvariablesで設定されたパラメータをtemplateの変数と置換することができる。変数は<%= @[変数名] %>で記載する必要がある。この<%= @[変数名] %>の前後を'〜'でくくると変換が行われないので、"〜"を使用する必要がある。
[client] user = root password = "<%= @mysql_root_pass %>" [mysqladmin] user = root password = "<%= @mysql_root_pass %>"
(5)設定処理の実行要否の判定
再実行時の設定処理の実行要否の判定にはonly_if/not_ifのパラメータが準備されており、ほぼ全てのリソースで利用できる。only_if "条件式"は条件式が“false”の場合に、not_ifの場合は逆に“true”の場合に処理が実行される。主な判定方法は「ファイルが存在するか?」と「検索をした結果が存在するか?」で行われる。
# install wordpress execute 'install wordpress' do command <<-EOC curl #{wordpress_latest} | tar zx -C /var/www EOC not_if { File.exists?('/var/www/wordpress/index.php') } end
# chown wordpress files execute 'chown wordpress files' do command <<-EOC chown -R #{wp_os_user}:#{wp_os_group} /var/www/wordpress EOC not_if "test `find /var/www/wordpress -not -user #{wp_os_user} -or -not -group #{wp_os_group} | wc -l` == 0" end
Copyright © ITmedia, Inc. All Rights Reserved.