Chefのrecipeの書き方
レシピ職人になろうかな。
recipeにはシステムのあるべき姿を記述する。
recipeはResourceという命令単位で記述する。
Resourceの基本構文
{Resourceタイプ} "Resource名" do # (1)実行条件 {only_if | not_if} { {条件文} } # (2)Action action :action # 後述のResourceタイプ毎のActionテーブルを参照 # (3)Notifications {notifies|subscribes} :action, "{Resourceタイプ[Resource名]}",{:immediately|:delayed} # (4)Attribute {attribute} "value" # 後述のResourceタイプ毎のAttributeテーブルを参照 end
(1)実行条件
「only_if」か「not_if」を選択し、条件文にRubyで記述する。
条件文中ではattributes(recipeのattributeではない)やOhaiを使用できる。
※Ohaiとは、サーバ情報をJSON形式で出力してくれるツール(※)。また、ResourceにはOhaiタイプが存在する。
(2)Action
後述のResourceタイプ毎のActionテーブルを参照。
(3)Notifications
- notifies
- 該当のResourceが実行された際、他のResourceに通知してそのResourceの実行を促す。
- notifiesは複数行記述することができる。
- subscriibes
- notifiesと逆で、他のResourceの実行終了後に該当ResourceのActionを指定して実行する。
■notifiesの例 〜templateでファイルを更新したらserviceでrestartを行う〜
service "httpd" do action :enable end template "/etc/httpd/conf/httpd.conf" do action :create notifies :restart, "service[httpd]", :immediately source "httpd.conf.erb" mode 0644 end
■subscriibesの例 〜httpdをstartしてからechoする〜
execute "service_start_echo" do command "echo start!" action :nothing subscriibes :start, "service[httpd]", :immediately
(4)Attribute
後述のResourceタイプ毎のAttributeテーブルを参照。
よく使われるResourceタイプ一覧
Resourceタイプ | 説明 |
---|---|
execute | コマンドを実行する |
file | ファイルの作成や削除等を行う |
directory | ディレクトリを設定する |
user | ユーザを設定する |
group | グループを設定する |
package | パッケージのインストール等のコントロールを行う |
template | erb形式でテキストファイルを設置する |
service | サービスの起動等の管理を行う |
ifconfig | インターフェースを設定する |
route | ルーティングテーブルを設定する |
cron | cronを設定する |
script | 指定したスクリプト言語(bash、csh、perl、python、ruby)でコマンドを実行する |
cookbook_file | cookbookのサブディレクトリ/files内のファイルを配布する |
deploy | ソースコード管理システムからデプロイを行う |
log | Chef実行時のログを出力する |
Linux、WindowsとOSの違いによって使用できるResourceに違いがあるので注意が必要。
他のResouceについては以下を参照のこと。(公式)
http://docs.opscode.com/resource.html
Resourceタイプの詳細
以降はLinuxを基本として記載する。Linux、Windowsによって使用できるAttributeに違いがあるので注意が必要。
execute
Action | 説明 |
---|---|
:run | コマンドを実行する(default) |
:nothing | コマンドを実行しない ただし、他のResourceでnotifiesされた場合は実行される |
Attribute | 説明 |
command | 実行するコマンド デフォルトは"Resource名"に指定した文字列 |
creates | ここに指定したファイルが存在する場合、ファイルを作成するコマンドは実行されない |
cwd | カレントディレクトリ |
environment | 環境変数 「{"ENV_VARIABLE" => "VALUE"}」形式で設定 |
group | コマンド実行時のグループ |
path | コマンドを探すパスの配列 環境変数PATHには追加されない(default:環境変数PATH) |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
returns | 正常時の返り値を設定 |
timeout | タイムアウト(秒)を設定(default: 3600) |
user | コマンド実行時のユーザ |
umask | ファイルモード作成マスク |
file
Action | 説明 |
---|---|
:create | 作成(default) |
:create_if_missing | ファイルが存在しないときだけ作成 |
:delete | 削除 |
:touch | touch |
Attribute | 説明 |
atomic_update | atomic file updateするか否か{true/false} (default:true) |
backup | バックアップ世代数(default:5) |
content | ファイルの内容(default:nil) |
force_unlink | 対象がシンボリックリンクだった場合、新規にファイルを作成するか否か{true/false} (default:false、シンボリックリンクの場合エラー) |
group | グループ名 "domain\group"か"group@domain"の形式 |
manage_symlink_source | 対象がシンボリックリンクだった場合、リンク先のファイルを編集するか否か{nil:警告をあげて編集/true:警告をあげず編集/false:編集しない} |
mode | パーミッション 頭に0をつける(0777とか) |
owner | ユーザ名 "domain\group"か"group@domain"の形式 |
path | ファイルパス デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
directory
Action | 説明 |
---|---|
:create | 作成(default) |
:delete | 削除 |
Attribute | 説明 |
group | グループ名 "domain\group"か"group@domain"の形式 |
mode | パーミッション 頭に0をつける(0777とか) |
owner | ユーザ名 "domain\group"か"group@domain"の形式 |
path | ディレクトリパス デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
recursive | 親ディレクトリの作成、および子ディレクトリの削除を行うか否か {true/false} |
user
Action | 説明 |
---|---|
:create | 作成(default) ユーザが存在する場合は:modifyと同様 |
:remove | 削除 |
:modify | 変更(ユーザが存在しない場合はエラー) |
:manage | 変更(ユーザが存在しない場合は何も起こらない) |
:lock | ユーザパスワードのロック |
:unlock | ユーザパスワードのロック解除 |
Attribute | 説明 |
comment | ユーザについてのコメント |
gid | グループID |
home | ホームディレクトリ |
password | パスワードのshadow hash(要ruby-shadow) |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
shell | ログインシェル |
support | デフォルトは{:manage_home => false, :non_unique => false} manage_homeはディレクトリの作成、non_uniqueはudiの重複を認めるか否か |
system | システムユーザが否か{true/false} (default:nil) |
uid | ユーザID(数値) |
username | ユーザ名 デフォルトは"Resource名"に指定した文字列 |
■例
user "random" do supports :manage_home => true comment "Random User" uid 1234 gid "users" home "/home/random" shell "/bin/bash" password "$1$JJsvHslV$szsCjVEroftprNn4JHtDi." end
group
Action | 説明 |
---|---|
:create | 作成(default) グループが存在する場合は:modifyと同様 |
:remove | 削除 |
:modify | 変更(グループが存在しない場合はエラー) |
:manage | 変更(グループが存在しない場合は何も起こらない) |
Attribute | 説明 |
append | membersが追加ユーザであるか否か{true/false} |
gid | グループID |
group_name | グループ名 デフォルトは"Resource名"に指定した文字列 |
members | ユーザIDのセット |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
system | システムグループが否か{true/false} (default:nil) |
■例
group "www-data" do action :modify members "maintenance" append true end
package
Action | 説明 |
---|---|
:install | パッケージのインストール(default) |
:upgrade | パッケージのアップグレード |
:reconfig | パッケージの再設定(response fileが必要) |
:remove | パッケージのアンインストール |
Attribute | 説明 |
option | コマンドの追加オプション |
package_name | パッケージ名 デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
response_file | response fileのパス |
source | パッケージファイルのパスやURL |
version | パッケージのバージョン |
template
Action | 説明 |
---|---|
:create | 作成(default) |
:create_if_missing | ファイルが存在しないときだけ作成 |
:delete | 削除 |
:touch | touch |
Attribute | 説明 |
atomic_update | atomic file updateするか否か{true/false} (default:true) |
backup | バックアップ世代数(default:5) |
cookbook | Cookbook名(default:現在のCookbook名) |
force_unlink | 対象がシンボリックリンクだった場合、新規にファイルを作成するか否か{true/false} (default:false、シンボリックリンクの場合エラー) |
group | グループ名 "domain\group"か"group@domain"の形式 |
helper | helper methodの定義 よくわかんないので一旦無視(ruby使いにはわかる?) |
helpers | helper moduleの定義 よくわかんないので一旦無視(ruby使いにはわかる?) |
local | テンプレートのローカルパスを使用するか否か{true:sourceで指定した内容/false:default(Cookbookの/templates)} |
manage_symlink_source | 対象がシンボリックリンクだった場合、リンク先のファイルを編集するか否か{nil:警告をあげて編集/true:警告をあげず編集/false:編集しない} |
mode | パーミッション 頭に0をつける(0777とか) |
owner | ユーザ名 "domain\group"か"group@domain"の形式 |
path | 配置先のファイルパス デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
source | テンプレートのローカルパス |
variables | テンプレートに渡す変数と値 |
service
Action | 説明 |
---|---|
:enable | ブート時の起動を有効化 |
:disable | ブート時の起動を無効化 |
:nothing | 何もしない(default) |
:start | サービスを起動 |
:stop | サービスを停止 |
:restart | サービスを再起動 |
:reload | サービスの設定をリロード |
Attribute | 説明 |
init_command | 「 /etc/init.d/SERVICE_NAME」を指定(default:Chefが判断) |
pattern | プロセステーブル名(default:service_name) |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
reload_command | リロードコマンド(default:Chefが判断) |
restart_command | リスタートコマンド(default:Chefが判断) |
service_name | サービス名 デフォルトは"Resource名"に指定した文字列 |
start_command | スタートコマンド(default:Chefが判断) |
status_command | ステータスコマンド(default:Chefが判断) |
stop_command | ストップコマンド(default:Chefが判断) |
supports | Action、Attributeの有効・無効を設定 |
ifconfig
Action | 説明 |
---|---|
:add | 追加(default) |
:delete | 削除 |
:enable | 有効化 |
:disable | 無効化 |
Attribute | 説明 |
bcast | ブロードキャストアドレス |
bootproto | static(固定アドレス)かdhcpを指定 |
device | デバイス名 |
hwaddr | MACアドレス |
inet_addr | ホストアドレス |
mask | ネットマスク(XXX.XXX.XXX.XXX) |
metric | ルートメトリックを指定 |
mtu | MTU(Maximun Transmission Unit)値を指定(byte) |
network | ネットワークアドレス |
onboot | yes(有効)かno(無効)を指定 |
onparent | nil(指定しない:default)かyes(エイリアスである)かno(エイリアスでない)を指定 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
target | IPアドレス デフォルトは"Resource名"に指定した文字列 |
■例
ifconfig "192.168.33.10" do device "eth0" end
route
Action | 説明 |
---|---|
:add | 追加(default) |
:delete | 削除 |
Attribute | 説明 |
device | デバイス名を指定 |
gateway | ゲートウェイアドレスを指定 |
netmask | ネットマスク(XXX.XXX.XXX.XXX)を指定 |
provider | Chef::Provider::Long::Nameのようなプロバイダを指定 |
target | ターゲットルートのIPアドレス デフォルトは"Resource名"に指定した文字列 |
■例
route "10.0.1.10/32" do gateway "10.0.0.20" device "eth1" end
cron
Action | 説明 |
---|---|
:create | crontabにエントリを追加 存在する場合は更新 |
:delete | crontabからエントリを削除 |
Attribute | 説明 |
command | コマンド %Q{〜} |
day | 「1〜31」の日(default:*) |
home | 環境変数「HOME」設定 |
hour | 「0〜23」の時間(default:*) |
mailto | 環境変数「MAILTO」設定 |
minute | 「0〜59」の分(default:*) |
month | 「1〜12」の月(default:*) |
path | 環境変数「PATH」設定 |
provider | Chef::Provider::Long::Nameのようなプロバイダを指定 |
shell | 環境変数「SHELL」設定 |
user | ユーザ名(default:root) |
weekday | 「0〜6」の曜日(default:*) Sunday=0 |
script
Action | 説明 |
---|---|
:run | スクリプトを実行 |
:nothing | なにもしない |
Attribute | 説明 |
code | 実行するスクリプトのコード |
command | 実行するコマンド デフォルトは"Resource名"に指定した文字列 |
creates | ここに指定したファイルが存在する場合、ファイルを作成するコマンドは実行されない |
cwd | カレントディレクトリ |
environment | 環境変数 {"ENV_VARIABLE" => "VALUE"} |
flags | One (or more) command line flags that are passed to the interpreter when a command is invoked. |
group | コマンド実行時のグループ |
interpreter | スクリプトを実行するインタープリタ bash/csh/perl/python/ruby |
path | コマンドを探すパスの配列 環境変数PATHには追加されない(default:環境変数PATH) |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
returns | 正常時の返り値を設定 |
timeout | タイムアウト(秒)を設定(default: 3600) |
user | コマンド実行時のユーザ |
umask | ファイルモード作成マスク |
cookbook_file
Action | 説明 |
---|---|
:create | ファイルの配布(default) |
:create_if_missing | ファイルが存在しない場合に配布 |
:delete | ファイルの削除 |
:touch | touch |
Attribute | 説明 |
atomic_update | atomic file updateするか否か{true/false} (default:true) |
backup | バックアップ世代数(default:5) |
cookbook | |
force_unlink | 対象がシンボリックリンクだった場合、新規にファイルを作成するか否か{true/false} (default:false、シンボリックリンクの場合エラー) |
group | グループ名 "domain\group"か"group@domain"の形式 |
manage_symlink_source | 対象がシンボリックリンクだった場合、リンク先のファイルを編集するか否か{nil:警告をあげて編集/true:警告をあげず編集/false:編集しない} |
mode | パーミッション 頭に0をつける(0777とか) |
owner | ユーザ名 "domain\group"か"group@domain"の形式 |
path | 配布先のファイルのパス デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
source | /filesディレクトリ配下のファイル名 |
■例
cookbook_file "/tmp/testfile" do source "testfile" mode 00644 end
deploy
Action | 説明 | |
---|---|---|
:deploy | アプリケーションのデプロイ(default) | |
:force_deploy | 既存のアプリケーションを削除して、デプロイ | |
:rollback | 前バージョンのアプリケーションにロールバック | |
Attribute | 説明 | |
deploy_to | デプロイ先 デフォルトは"Resource名"に指定した文字列 | |
environment | 環境変数 {"ENV_VARIABLE" => "VALUE"} | |
group | チェックアウトするグループ名 | |
keep_releases | デプロイ時にバックアップされる世代数(default:5) | |
migrate | マイグレートコマンドを実行するか否か {true/false} | |
migrate_command | マイグレートコマンド | |
provider | Chef::Provider::Long::Nameのようなプロバイダ | |
repo | リポジトリのエイリアス | |
repository | リポジトリのURI | |
repository_cache | デプロイする前のアプリケーションコードの置き場ディレクトリ(default:cached-copy) | |
restart_command | リスタートコマンド | |
revision | チェックアウトするリビジョン番号(default:HEAD) | |
rollback_on_error | デプロイ時にエラーが発生した場合、前バージョンにロールバックするか否か {true/false} | |
scm_provider | SCMプロバイダの指定(default:Chef::Provider::Git、その他:Chef::Provider::Subversion) | |
user | チェックアウトするユーザ名 |
※gitやsubversionによって特殊なAttributeがある。
deployはなんかややこしそうなので詳細は下記で。
http://docs.opscode.com/resource_deploy.html
log
Action | 説明 |
---|---|
:write | ログを書く(default) |
Attribute | 説明 |
level | ログレベル |
message | ログメッセージ デフォルトは"Resource名"に指定した文字列 |
provider | Chef::Provider::Long::Nameのようなプロバイダ |
応用
ループ
%w{配列}.eachを使用。
%w{httpd tomcat java}.each do |package_name| package "#{package_name}" do action :install end end
条件分岐
case、when、elseキーワードを使用。
case {Attributes|Ohai} when 'A', 'B', 'C' : # {Attributes|Ohai}の値がA or B or C のときの処理 when 'D', 'E' : # {Attributes|Ohai}の値がD or E のときの処理 else # その他 end
なんかすげーまとめあったからまとめなくてよかったかも。。。