前回はItamaeをインストールし、
リソースとは
レシピにはリソースと呼ばれる、
package "nginx" do
action :install # nginxパッケージをインストールする
version "1.4.6-1ubuntu3.3" # 特定のバージョンをインストールする
end
package "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 "..." # ファイルの内容
end
fileリソースをつかうと実行時にdiffが表示されます。--dry-run
オプションをつけた場合にも表示されるので、
editアクション
edit
アクションをつかうと、
file "/etc/ssh/sshd_config" do
action :edit
block do |content|
content.gsub!(/^Port .+$/, "Port 12322")
end
end
edit
アクションの場合にもdiffが出力されます。
remote_fileリソース
createアクション
remote_
remote_file "/etc/my.cnf" do
action :create # デフォルトなので省略可
source "my.cnf" # このファイルを/etc/my.cnfに配置する(レシピがあるディレクトリからの相対パス)
end
content
をファイルに書けること以外、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"
end
remote_
と同様に、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"
end
removeアクション
remove
アクションはパッケージのアンインストールを行います。
package "nginx" do
action :remove
end
serviceリソース
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
まとめ
今回は比較的よく使うリソースの解説と、
次回はホストごとに異なる値の渡し方・