連載
» 2016年06月23日 05時00分 公開

実際に検証済み!OSS徹底比較(3)サーバ構築自動化【前編】:OSSのサーバ構築自動化ツール、4製品徹底検証 2016年版 (4/9)

[森元敏雄,TIS]

ChefのcookbookのTIPS

1.recipeへのパラメータの受け渡し

(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"

2.recipeの記述方法

 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。