読者です 読者をやめる 読者になる 読者になる

ぺーぺーSEのブログ

備忘録・メモ用サイト。

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 指定したスクリプト言語bashcshperlpythonruby)でコマンドを実行する
cookbook_file cookbookのサブディレクトリ/files内のファイルを配布する
deploy ソースコード管理システムからデプロイを行う
log Chef実行時のログを出力する

LinuxWindowsとOSの違いによって使用できるResourceに違いがあるので注意が必要。

他のResouceについては以下を参照のこと。(公式)
http://docs.opscode.com/resource.html

Resourceタイプの詳細

以降はLinuxを基本として記載する。
LinuxWindowsによって使用できる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


条件分岐

casewhenelseキーワードを使用。

case {Attributes|Ohai}
when 'A', 'B', 'C'
  : # {Attributes|Ohai}の値がA or B or C のときの処理
when 'D', 'E'
  : # {Attributes|Ohai}の値がD or E のときの処理
else
  # その他
end

なんかすげーまとめあったからまとめなくてよかったかも。。。