前回はItamaeをインストールし、
リソースとは
レシピにはリソースと呼ばれる、
package "nginx" do
action :install # nginxパッケージをインストールする
version "1.4.6-1ubuntu3.3" # 特定のバージョンをインストールする
endpackage "nginx" do
action :remove # nginxパッケージをアンインストールする
endのようにpackageリソースをインストールしたり、
packageリソースの場合、installアクションがデフォルトになっているため、
package "nginx" # 暗黙的にinstallアクションになるどのようなアクションや属性が用意されているかはドキュメントを参照してください。
Itamaeには様々なリソースが用意されていますが、
executeリソース
executeリソースは任意のコマンド実行を表します。
runアクション
execute "touch /tmp/file-created-by-itamae" do
action :run # デフォルトなので省略可
end任意のコマンドをリソースとして定義できるため、
繰り返し似たようなコマンドを書く場合や抽象化出来る場合は、
executeリソースを利用する際は、
execute "touch /tmp/file-created-by-itamae" do
not_if "test -f /tmp/file-created-by-itamae"
# または
# only_if "test ! -f /tmp/file-created-by-itamae"
end上記のようにonly_またはnot_を使うと、
fileリソース
fileリソースはサーバ上のファイルを表すリソースです。
createアクション
デフォルトはcreateアクションで、
file "/etc/nginx/conf.d/app.conf" do
action :create # デフォルトなので省略可
content "..." # ファイルの内容
endfileリソースをつかうと実行時にdiffが表示されます。--dry-runオプションをつけた場合にも表示されるので、
editアクション
editアクションをつかうと、
file "/etc/ssh/sshd_config" do
action :edit
block do |content|
content.gsub!(/^Port .+$/, "Port 12322")
end
endeditアクションの場合にもdiffが出力されます。
remote_fileリソース
createアクション
remote_
remote_file "/etc/my.cnf" do
action :create # デフォルトなので省略可
source "my.cnf" # このファイルを/etc/my.cnfに配置する(レシピがあるディレクトリからの相対パス)
endcontentをファイルに書けること以外、fileリソースと同じですが、sourceを分離でき管理しやすくなります。sourceは省略すると自動的に決定されます。sourceを省略した場合は、
- (レシピがあるディレクトリ)
/files/ etc/ my. cnf - (レシピがあるディレクトリ)
/files/ my. cnf
templateリソース
createアクション
templateリソースはremote_とほぼ同じですが、sourceファイルとしてERBテンプレートを使える点が異なります。テンプレートを使って動的に設定ファイルを生成し、
ホスト固有の値を渡したり、
template "/etc/my.cnf" do
action :create # デフォルトなので省略可
source "my.cnf.erb"
endremote_と同様に、sourceは省略すると自動的に決定されます。sourceを省略した場合は、
- (レシピがあるディレクトリ)
/templates/ etc/ my. cnf. erb - (レシピがあるディレクトリ)
/templates/ etc/ my. cnf - (レシピがあるディレクトリ)
/templates/ my. cnf. erb - (レシピがあるディレクトリ)
/templates/ my. cnf
packageリソース
packageリソースはOS標準のパッケージシステムのパッケージを表します。Ubuntu, Debianの場合dpkg
installアクション
installアクションはパッケージのインストールを行います。すでにパッケージがインストールされていて、versionが指定されていない場合は何もしません。
package "nginx" do
action :install # デフォルトなので省略可
version "1.4.6-1ubuntu3.3"
endremoveアクション
removeアクションはパッケージのアンインストールを行います。
package "nginx" do
action :remove
endserviceリソース
serviceリソースはSysvinitやUpstartなどで管理されているサービスを表します。packageリソースと同様、
service "nginx" do
action :reload
end利用可能なアクションはstop, start, restart, reloadです。このリソースはデフォルトのアクションがnothingで、actionを指定しない限り何も起こりません。
local_ruby_blockリソース
runアクション
local_リソースはローカルでRubyのコードlocal_を利用します。
local_ruby_block "say hello" do
action :run # デフォルトなので省略可
block do
puts "Hello"
end
end全リソース共通の属性
既にでてきたonly_やnot_に加え、
only_if, not_if
only_
only_:指定されたコマンドが成功した場合if (コマンドの終了コードが0) のみアクションを実行します。 not_:指定されたコマンドが失敗した場合if (コマンドの終了コードが0以外) のみアクションを実行します
user
userで指定したユーザとしてコマンドを実行します。
cwd
cwdで指定したディレクトリ内でコマンドを実行します。
リソースの実行順序
Itamaeのリソースは基本的に上から下に順番に実行されます。しかし、
puts "A"
local_ruby_block "local" do
puts "B"
block do
puts "C"
end
puts "D"
end
puts "E"vagrant@vagrant-ubuntu-trusty-64:/vagrant$ itamae local -l debug order.rb INFO : Starting Itamae... A B D E INFO : Recipe: /vagrant/order.rb C
実行結果を見るとわかるように、DとEがCより前に出力されています。これはリソースアクションC)
リソース間の連携
例えば、notifiesとsubscribesで、
notifies
service "nginx" do
action :nothing
end
template "/etc/nginx/conf.d/app.conf" do
notifies :reload, "service[nginx]"
end上記の例では、templateに更新があった場合serviceのreloadアクションを実行するようになります。これにより設定ファイルが変更された時だけ、
serviceに指定されてるnothingアクションはnotifiesやsubscribesのためのアクションで、nothingを指定すると、notifies、subscribesでのみアクションが実行されます。
subscribes
subscribesはnotifiesの逆で、
service "nginx" do
action :nothing
subscribes :reload, "template[/etc/nginx/conf.d/app.conf]"
end
template "/etc/nginx/conf.d/app.conf"上記の例では先に出てきたnotifiesの例と同様、templateに変更があった場合にserviceのリロードを行います。
なお、notifiesやsubscribesは1つのリソースに複数指定することも可能です。
複数のリソースをまとめる
defineを使うと、
define :install_and_enable_package, version: nil do
package params[:name] do
version params[:version] if params[:version]
action :install
end
service params[:name] do
action :enable
end
endこのようにリソースを定義すると、install_リソースが使えるようになります。
install_and_enable_package 'nginx' do
version '1.4.6-1ubuntu3.3'
end複数回同じようなリソース定義が出てくる場合はこのようにdefineを使って抽象化をすると見通しが良くなります。
他のレシピを読み込む
レシピを書いていくと、include_を使って他のレシピを読み込み、
# cookbooks/nginx/default.rb
package "nginx"
template "/etc/nginx/conf.d/app.conf"
# cookbooks/nginx/templates/etc/nginx/conf.d/app.conf にテンプレートを置く# cookbooks/ruby/default.rb
package "ruby" do
version "2.2.2"
end# roles/app.rb
include_recipe "../cookbooks/nginx/default.rb"
include_recipe "../cookbooks/ruby/default.rb"
# include_recipeにはレシピがあるディレクトリからの相対パスを指定するこのようにソフトウェアごとにディレクトリを作って、include_でレシピを読み込む形を推奨しています。
実際に実行する際は以下のようにroles以下のファイルを指定します。
$ itamae local roles/app.rb
まとめ
今回は比較的よく使うリソースの解説と、
次回はホストごとに異なる値の渡し方・
