Itamaeはクックパッドの荒井良太氏を中心に開発されている製品である。GitHubにも「Configuration management tool inspired by Chef, but simpler and lightweight. Formerly known as Lightchef.」と記載されており、Chefを簡素化、軽量化する目的で開発されている。当初は「Light Chef」として提供されていた。2013年に最初のStable版がリリースされており、今回の4製品の中では非常に新しい製品となっている。
ライセンスはMIT Licenseで、現在の最新の安定バージョンは2016年4月7日にリリースされた1.9.6。製品の詳細については、荒井氏が自ら執筆された記事「Itamaeが構成管理を仕込みます! 〜新進気鋭の国産・構成管理ツール〜」が公開されているので、ご一読をお勧めしたい。
今回の検証では、CentOS 7.2に最新のStable版、Ver 4.4.2をインストールしている。ItamaeはRubyで開発されており、サーバの設定を行うrecipeはChefを踏襲している。nodeの定義はjson、recipe本体はRubyスクリプトになっており、書式もChefとほぼ同じである。Chefの経験者であれば、すんなり利用することができるだろう。今回、検証で行ったインストールの手順は以下の通りだ。
$ sudo yum update -y
$ sudo yum install -y ruby
$ sudo gem install itamae
$ sudo /usr/local/bin/itamae version Itamae v1.9.6
$ sudo mkdir /var/log/itamae $ sudo chmod a+w /var/log/itamae
node側には作業は不要である。このわずかな作業だけで、Itamaeの実行環境は構築が行え、サーバの構築と設定を行うrecipeを作成、実行することができる。
node定義ファイルもrecipe本体も、Itamae実行時はファイル名を直接パラメータとして指定する。このため、参照可能であればどこのフォルダでも問題ないが、取りあえず/etc/itamae以下に作成しておく。
$ sudo mkdir -p /etc/itamae/nodes /etc/itamae/cookbooks/wordpress/templates
recipeに引き渡すパラメータを定義する。
$ sudo vi /etc/itamae/nodes/tissvv096.json
{
"ipaddress" : "10.255.202.96",
"hostname" : "tissvv096",
"mysql_root_pass" : "FM11AD2+",
"mysql_wp_db" : "WordPress",
"mysql_wp_user" : "wp_admin",
"mysql_wp_pass" : "HB-F1XDJ",
"wp_unique_phrase" : "FX702PFX801PPB100FX860PPB700PB500PB750PAI1000",
"wp_os_user" : "root",
"wp_os_group" : "root",
"wp_latest" : "https://ja.wordpress.org/latest-ja.tar.gz"
}
作成したcookbookは以下となる。各処理のTIPSは後ほど、機能ごとに説明を行う。
(1)cookbookとして作成するファイルおよびフォルダの構成
$ t tree -l /etc/itamae
/etc/itamae
├── cookbooks
│ └── wordpress
│ ├── default.rb
│ └── templates
│ ├── my.cnf.erb
│ ├── wordpress.conf.erb
│ └── wordpress.createdb.sql.erb
└── nodes
└── tissvv096.json
(2)WordPress環境の構築を実際に行うwordpress/default.rbファイルの作成
$ sudo vi /etc/itamae/cookbooks/wordpress/default.rb
# Parameter settings
ipaddress = node['ipaddress']
hostname = node['hostname']
mysql_root_pass = node['mysql_root_pass']
mysql_wp_db = node['mysql_wp_db']
mysql_wp_user = node['mysql_wp_user']
mysql_wp_pass = node['mysql_wp_pass']
wp_unique_phrase = node['wp_unique_phrase']
wp_os_user = node['wp_os_user']
wp_os_group = node['wp_os_group']
wp_latest = node['wp_latest']
# update packages
execute "update packages" do
command "yum update -y"
end
# install packages
%w( mariadb-server httpd php php-mysql ).each do |pkg|
package pkg do
action :install
end
end
# enable/start mariadb
service "mariadb" do
action [:enable,:start]
end
# set mariadb root password
execute "create mariadb root" do
command "mysql -e \"update mysql.user set password=password(\'#{mysql_root_pass}\') where user = \'root\'\""
only_if "test `mysql -u root -p#{mysql_root_pass} -e \"show databases\" | grep -c mysql` == 0"
end
# create /root/.my.cnf
template "/root/.my.cnf" do
action :create
source "/etc/itamae/cookbooks/wordpress/templates/my.cnf.erb"
variables( mysql_root_pass: "#{mysql_root_pass}" )
owner "root"
group "root"
mode "600"
not_if "test -f /root/.my.cnf"
end
# restart mariadb
service "mariadb" do
action :restart
end
# mariadb logrotate setting
execute "modify maridb logrotate config" do
command "sed -i.bak -e '23,$ s/^#//' /etc/logrotate.d/mariadb"
user "root"
not_if "test -f /etc/logrotate.d/mariadb.bak"
end
# create wordpres db/user
template "/tmp/wordpress.createdb.sql" do
action :create
source "/etc/itamae/cookbooks/wordpress/templates/wordpress.createdb.sql.erb"
variables( mysql_wp_db: "#{mysql_wp_db}",
mysql_wp_user: "#{mysql_wp_user}",
mysql_wp_pass: "#{mysql_wp_pass}" )
owner "root"
group "root"
not_if "test -f /tmp/wordpress.createdb.sql"
end
execute "create wordpress db/user" do
command "mysql -u root -p#{mysql_root_pass} < /tmp/wordpress.createdb.sql"
only_if "test `mysql -u root -p#{mysql_root_pass} -e \"show databases\" | grep -c #{mysql_wp_db}` == 0"
end
execute "remove /tmp/wordpress.createdb.sql" do
command "rm -f /tmp/wordpress.createdb.sql"
only_if "test -f /tmp/wordpress.createdb.sql"
end
# insatll wordpress
execute "insatll wordpress" do
command "curl #{wp_latest} | tar zx -C /var/www"
user "root"
not_if "test -f /var/www/wordpress/wp-config-sample.php"
end
# create wordpress config
execute "copy wordpress config" do
cwd "/var/www/wordpress"
command "cp -p wp-config-sample.php wp-config.php"
user "root"
not_if "test -f /var/www/wordpress/wp-config.php"
end
file "/var/www/wordpress/wp-config.php" do
action :edit
block do |content|
content.gsub!( /(^.+?)database_name_here(.+?$)/, "\\1#{mysql_wp_db}\\2" )
content.gsub!( /(^.+?)username_here(.+?$)/, "\\1#{mysql_wp_user}\\2" )
content.gsub!( /(^.+?)password_here(.+?$)/, "\\1#{mysql_wp_pass}\\2" )
content.gsub!( /(^.+?)put your unique phrase here(.+?$)/, "\\1#{wp_unique_phrase}\\2" )
end
owner "root"
group "root"
not_if "test `grep -c database_name_here /var/www/wordpress/wp-config.php` == 0"
end
# chown wordpress files
execute "chown wordpress files" do
command "chown -R #{wp_os_user}:#{wp_os_group} /var/www/wordpress"
user "root"
not_if "test `find /var/www/wordpress -not -user #{wp_os_user} -or -not -group #{wp_os_group} | wc -l` == 0"
end
# create wordpress httpd config
template "/etc/httpd/conf.d/wordpress.conf" do
action :create
source "/etc/itamae/cookbooks/wordpress/templates/wordpress.conf.erb"
variables( hostname: "#{hostname}" )
owner "root"
group "root"
not_if "test -f /etc/httpd/conf.d/wordpress.conf"
end
# modify httpd config
execute "backup httpd config" do
cwd "/etc/httpd/conf"
command "cp -p httpd.conf httpd.conf.bak"
user "root"
not_if "test -f /etc/httpd/conf/httpd.conf.bak"
end
file "/etc/httpd/conf/httpd.conf" do
action :edit
block do |content|
content.gsub!( /^#ServerName.*/, "ServerName #{hostname}" )
end
owner "root"
group "root"
not_if "test `grep -c \"ServerName #{hostname}\" == 0"
end
# enable/start httpd
service "httpd" do
action [:enable, :start]
end
# open httpd port in firewall
execute "open firewall http" do
command "firewall-cmd --add-service=http --zone=public --permanent;\
firewall-cmd --reload"
user "root"
only_if "test `firewall-cmd --zone=public --list-all | grep -c http` == 0"
end
(3)/root/.my.cnfのtemplateファイルの作成
$ sudo vi /etc/itamae/cookbooks/wordpress/templates/my.cnf.erb
[client] user = root password = "<%= @mysql_root_pass %>" [mysqladmin] user = root password = "<%= @mysql_root_pass %>"
(4)/etc/httpd/conf.d/wordpress.confのtemplateファイルの作成
$ sudo vi /etc/itamae/cookbooks/wordpress/templates/wordpress.conf.erb
<VirtualHost *:80>
ServerName <%= @hostname %>
DocumentRoot /var/www/wordpress
<Directory "/var/www/wordpress">
AllowOverride All
Options -Indexes
</Directory>
<Files wp-config.php>
order allow,deny
deny from all
</Files>
</VirtualHost>
(5)WordPressのdb/userを作成するsql文のtemplateファイルの作成
$ sudo vi /etc/itamae/cookbooks/wordpress/templates/wordpress.createdb.sql.erb
create user "<%= @mysql_wp_user %>"@"localhost" identified by "<%= @mysql_wp_pass %>"; create database <%= @mysql_wp_db %>; grant all privileges on <%= @mysql_wp_db %>.* to "<%= @mysql_wp_user %>"@"localhost"; flush privileges;
以上でcookbookの作成は終了となる。cookbookはサーバ側でitamaeコマンドで実行する。
itamaeコマンドでcookbookを実行することになるが、最後に"-n"または"--dry-run"オプションを付けると、実行せずに構文チェックのみが行われる。エラーが表示されなければ構文的には問題がない。
$ itamae ssh -h tissvv096 -p 22 -j /etc/itamae/nodes/tissvv096.json -u maintain -i ~/.ssh/id_rsa.pem /etc/itamae/cookbooks/wordpress/default.rb --dry-run 2>&1 | tee /var/log/itamae/tissvv096_2nd.log
以下のコマンドを実行するとサーバ側からcookbookがダウンロードされ、WordPress環境の構築が行われる。出力されるログは以下となる。
$ itamae ssh -h tissvv096 -p 22 -j /etc/itamae/nodes/tissvv096.json -u maintain -i ~/.ssh/id_rsa.pem /etc/itamae/cookbooks/wordpress/default.rb 2>&1 | tee /var/log/itamae/tissvv096_2nd.log
INFO : Starting Itamae...
INFO : Loading node data from /etc/itamae/nodes/tissvv096.json...
INFO : Recipe: /etc/itamae/cookbooks/wordpress/default.rb
INFO : execute[update packages] executed will change from 'false' to 'true'
INFO : package[mariadb-server] installed will change from 'false' to 'true'
INFO : package[httpd] installed will change from 'false' to 'true'
INFO : package[php] installed will change from 'false' to 'true'
INFO : package[php-mysql] installed will change from 'false' to 'true'
INFO : service[mariadb] enabled will change from 'false' to 'true'
INFO : service[mariadb] running will change from 'false' to 'true'
INFO : execute[create mariadb root] executed will change from 'false' to 'true'
INFO : template[/root/.my.cnf] exist will change from 'false' to 'true'
INFO : template[/root/.my.cnf] mode will be '0600'
INFO : template[/root/.my.cnf] owner will be 'root'
INFO : template[/root/.my.cnf] group will be 'root'
INFO : diff:
INFO : --- /dev/null 2016-05-13 14:38:00.434000293 +0900
INFO : +++ /tmp/itamae_tmp/1463118454.564642 2016-05-13 14:47:34.616655971 +0900
INFO : @@ -0,0 +1,7 @@
INFO : +[client]
INFO : +user = root
INFO : +password = "FM11AD2+"
INFO : +
INFO : +[mysqladmin]
INFO : +user = root
INFO : +password = "FM11AD2+"
INFO : execute[modify maridb logrotate config] executed will change from 'false' to 'true'
INFO : template[/tmp/wordpress.createdb.sql] exist will change from 'false' to 'true'
INFO : template[/tmp/wordpress.createdb.sql] owner will be 'root'
INFO : template[/tmp/wordpress.createdb.sql] group will be 'root'
INFO : diff:
INFO : -
INFO : +grant all privileges on WordPress.* to "wp_admin"@"localhost";
INFO : +flush privileges;
INFO : execute[create wordpress db/user] executed will change from 'false' to 'true'
INFO : execute[insatll wordpress] executed will change from 'false' to 'true'
INFO : execute[copy wordpress config] executed will change from 'false' to 'true'
INFO : file[/var/www/wordpress/wp-config.php] owner will change from 'nobody' to 'root'
INFO : file[/var/www/wordpress/wp-config.php] group will change from 'UNKNOWN' to 'root'
INFO : diff:
INFO : --- /var/www/wordpress/wp-config.php 2016-05-07 09:12:32.000000000 +0900
INFO : +++ /tmp/itamae_tmp/1463118460.339039 2016-05-13 14:47:40.431656258 +0900
INFO : @@ -26,13 +26,13 @@
INFO :
INFO : // ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
INFO : /** WordPress のためのデータベース名 */
INFO : -define('DB_NAME', 'database_name_here');
INFO : +define('DB_NAME', 'WordPress');
INFO :
INFO : /** MySQL データベースのユーザー名 */
INFO : -define('DB_USER', 'username_here');
INFO : +define('DB_USER', 'wp_admin');
INFO :
INFO : /** MySQL データベースのパスワード */
INFO : -define('DB_PASSWORD', 'password_here');
INFO : +define('DB_PASSWORD', 'HB-F1XDJ');
INFO :
INFO : /** MySQL のホスト名 */
INFO : define('DB_HOST', 'localhost');
INFO : @@ -52,14 +52,14 @@
INFO : *
INFO : * @since 2.6.0
INFO : */
INFO : -define('AUTH_KEY', 'put your unique phrase here');
INFO : -define('SECURE_AUTH_KEY', 'put your unique phrase here');
INFO : -define('LOGGED_IN_KEY', 'put your unique phrase here');
INFO : -define('NONCE_KEY', 'put your unique phrase here');
INFO : -define('AUTH_SALT', 'put your unique phrase here');
INFO : -define('SECURE_AUTH_SALT', 'put your unique phrase here');
INFO : -define('LOGGED_IN_SALT', 'put your unique phrase here');
INFO : -define('NONCE_SALT', 'put your unique phrase here');
INFO : +define('AUTH_KEY', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('SECURE_AUTH_KEY', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('LOGGED_IN_KEY', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('NONCE_KEY', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('AUTH_SALT', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('SECURE_AUTH_SALT', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('LOGGED_IN_SALT', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO : +define('NONCE_SALT', 'FX702PFX801PPB100FX860PPB700PB500PB750PAI1000');
INFO :
INFO : /**#@-*/
INFO :
INFO : execute[chown wordpress files] executed will change from 'false' to 'true'
INFO : template[/etc/httpd/conf.d/wordpress.conf] exist will change from 'false' to 'true'
INFO : template[/etc/httpd/conf.d/wordpress.conf] owner will be 'root'
INFO : template[/etc/httpd/conf.d/wordpress.conf] group will be 'root'
INFO : diff:
INFO : --- /dev/null 2016-05-13 14:38:00.434000293 +0900
INFO : +++ /tmp/itamae_tmp/1463118460.7118292 2016-05-13 14:47:40.767656275 +0900
INFO : @@ -0,0 +1,13 @@
INFO : +<VirtualHost *:80>
INFO : + ServerName tissvv096
INFO : + DocumentRoot /var/www/wordpress
INFO : + <Directory "/var/www/wordpress">
INFO : + AllowOverride All
INFO : + Options -Indexes
INFO : + </Directory>
INFO : +
INFO : + <Files wp-config.php>
INFO : + order allow,deny
INFO : + deny from all
INFO : + </Files>
INFO : +</VirtualHost>
INFO : execute[backup httpd config] executed will change from 'false' to 'true'
INFO : diff:
INFO : --- /etc/httpd/conf/httpd.conf 2016-05-12 19:16:14.000000000 +0900
INFO : +++ /tmp/itamae_tmp/1463118461.0208547 2016-05-13 14:47:41.115656292 +0900
INFO : @@ -92,7 +92,7 @@
INFO : #
INFO : # If your host doesn't have a registered DNS name, enter its IP address here.
INFO : #
INFO : -#ServerName www.example.com:80
INFO : +ServerName tissvv096
INFO :
INFO : #
INFO : # Deny access to the entirety of your server's filesystem. You must
INFO : service[httpd] enabled will change from 'false' to 'true'
INFO : service[httpd] running will change from 'false' to 'true'
INFO : execute[open firewall http] executed will change from 'false' to 'true'
yum update以外の全ての処理がスキップされていることが確認できる。
INFO : Starting Itamae... INFO : Loading node data from /etc/itamae/nodes/tissvv096.json... INFO : Recipe: /etc/itamae/cookbooks/wordpress/default.rb INFO : execute[update packages] executed will change from 'false' to 'true'
Copyright © ITmedia, Inc. All Rights Reserved.