directory "#{install_dir}" do recursive true mode 0755 owner "apache" group "apache" action :create end
WordPressをインストールするディレクトリを設定します。3行目のmodeでパーミッションの設定を、4・5行目のownerとgroupで所有者・グループの設定をしています。
この後の処理で、ここで作成したディレクトリの下にwordpressディレクトリが作成され、ドキュメントルートとして設定します。
#WordPressダウンロード remote_file "/tmp/#{filename}" do source "#{remote_uri}" checksum "#{file_checksum}" end
remote_fileリソースでは、指定されたURL(今回の場合は、attributeで定義された「https://ja.wordpress.org/wordpress-4.2.2-ja.tar.gz」)から「/tmp」にファイルをいったんダウンロードし、checksumでファイルの正当性を確認しています。
checksumは「sha256」です。「shasum -a 256 [FILENAME]」で取得できます。Webサイトに記載されている「md5sum」とは別の値になりますので、ご注意ください。
#WordPress配置 script "install_wordpress" do interpreter "bash" user "root" code <<-EOL install -d #{install_dir} tar zxvf /tmp/#{filename} -C #{install_dir} EOL end
次にWordPress配置の部分ですが、恐らくここが「手順書をChefのCookbookにする」上での最大の障壁になると思っています。
Chefの設計思想としては、ChefのResourceでできることはResourceとして記述して実行することが推奨されます。ですが、往々にして「どうしてもResourceで記述できない」手順というのが出てくるものです。そこで登場するのが、最後の手段である「Chefにコマンドを実行させる」というものです。
scriptリソースでは、bashを呼び出してコマンドを実行させています。イメージとしては、ChefのRecipeの中にシェルスクリプトを書いているようなイメージです。
ここで注意していただきたいのは、「1つのscriptリソースであまりにも多数のコマンドを実行するように記述しないこと」です。scriptリソースはbashという外部プログラムを呼び出して実行内容(code)を渡しているだけなので、bashの動きをトレースできません。
そのため、あまりにも長々とコマンドを書くと、どこでエラーになったかが分からなくなります。筆者も、どうしてもこの手を使う場合は、かなり細かく記述するように考慮しています。
#httpd.conf配置 template "httpdconf" do path "#{httpd_conf_dir}httpd.conf" source "httpdconf.erb" mode 0644 end
ここで実行している内容は、「httpdインストール時に作成されたhttpd.confファイルを「httpdconf.erb」というTemplateファイルを使って置き換える」というものです。
長くなりますが、今回使用したTemplateファイルをダウンロードできるようにしておきます。
見てもらいたいのは一番下の下記の部分で、バーチャルホストの設定値をAttributeで定義している部分です。こうすることで、設定内容の可視性を高め、Recipeの再利用性を高めています。
<VirtualHost *:80> ServerAdmin enginnering@ec2.tokyo DocumentRoot <%= node['wordpress']['wp_dir'] %>/wordpress ServerName <%= node['wordpress']['vhost_domain'] %> ErrorLog logs/<%= node['wordpress']['vhost_domain'] %>-error_log CustomLog logs/<%= node['wordpress']['vhost_domain'] %>-access_log common </VirtualHost>
#wordpressディレクトリpermission変更 directory "#{install_dir}/wordpress" do recursive true mode 0755 owner "apache" group "apache" end
この部分の説明は重複する部分なので割愛します。
#httpd実行 service "httpd" do action :start end #mysqld実行 service "mysqld" do action :start end
リモートノードのhttpdとmysqldサービスを起動させています。「:restart」とすることも可能です。
また、Rubyで条件判定処理を書くことで「設定値が変更されていた場合のみrestartする」というようなことも可能ですが、今回の入門編は原則としてChefのDSLだけでRecipeを完結させることを到達目標としていますので、その部分の説明は割愛します。
AttributeやTemplateを活用できるようになると、Chefにおける構築の自由度が一気に上がりますので、ここをぜひマスターしてもらいたいと思います。
また、個人的に推奨はできかねますが、Chefからコマンドを実行させるように記述することも可能なので、「ここは、どうしてもコマンドでやらないといけない、ChefのResourceで書けない」という場合に利用することで「手順書をChefのCookbookとして記述する」ことの障壁が下がると思います。
次回は本連載の最終回となります。Recipeの仕上げの部分について解説していきます。
Copyright © ITmedia, Inc. All Rights Reserved.