1. まとめトップ

概要

Chefのレシピを書く上で一番重要な"リソース(Resources)"について自分の備忘のためにまとめてみました。

※ 2013/08/10 追記
各リソースタイプでのLinuxプラットフォームでの利用可否とWindowsプラットフォームでの利用可否をそれぞれ追記しました。

1. はじめに

1.1. 目的

Chefのレシピを書いていく中で、一番重要な"リソース(Resources)"について理解します。

1.2. 範囲

ここには、以下を書いています。
1. レシピの中でリソースを定義するための基本的な構文
2. Chefであらかじめ定義されているリソースタイプの構文と記述例(一部)

以下については(少なくとも現在は)書いていません。
1. "プロバイダー(Providers)"について
2. LWRP(Lightweight Resources and Providers)について

1.3. 用語

Chef

Chefとは、Opscode社によって開発されているITインフラ環境のデプロイ自動化と構成管理を行うツールです。現在、Chefはオープンソース版とプロプライエタリ版、SaaS版(Hosted Chef)があります。最近、Facebookがサービスのインフラ管理にプロプライエタリ版の"Chef11"の採用を発表、AmazonがChef互換のデプロイサービス「AWS OpsWorks」を発表したことで話題になっています。

レシピ(Recipe)

Chefでは、ITインフラストラクチャー環境の各パーツがどんな風に作られてほしいのかを"レシピ(recipe)"と呼ばれるRubyのコードで定義します。各パーツのあるべき状態は、後述の"リソース(Resources)"を定義するという形でレシピに書いていきます。

リソース(Resources)

Chefには、あらかじめリソースタイプがいくつか定義されています。レシピ(Recipe)の開発者は、このリソースタイプを使って、ITインフラストラクチャー環境の各パーツ(サービスやファイルなど)をリソースとして定義していきます。

冪等性(べき等性)

冪等性(べき等性)とは、数学用語で、"ある操作を1回行っても複数回行っても結果が同じであること"をいいます。Chefはレシピに書かれた情報と実際の環境を比較し、差異があればレシピに書かれた内容を複数回実行します。そのため、Chefのレシピは"冪等性(べき等性)"を意識した上で書く必要があります。

1.4. 注意事項

1. 整形のためインデントに"全角スペース"を使用しています。コピー・アンド・ペーストをして使用する場合などは気をつけてください。

2. OSプラットフォームとして"Linux"と"Windows"のみを対象に書いています。Chef自体は、"Solaris"、"FreeBSD"など様々なOSにも対応しています。

2. リソースの定義方法

リソースは、"実行条件"、"アクション"、"通知"、"属性"の4つを使って定義します。

リソース定義の基本構文

{リソースタイプ} "{リソース名}" do
 # ①実行条件
 {only_if | not_if} { {条件文} }

 # ②アクション
 action {アクション}

 # ③通知
 {notifies|subscribes} {アクション}, "{リソースタイプ[リソース名]}",{:immediately|:delayed}
 :

 # ④属性
 {属性名} {属性値}
 :
end

2.1. 実行条件 (Conditional Execution)

リソース定義を適用する条件を定義します。

行頭に"only_if" もしくは "not_if" と書き、その後の{}の中にRubyで条件文を書きます。
実行条件は、省略することもでき、その場合は無条件にリソース定義が適用されます。

また、条件文には、"attributes"ディレクトリ下のファイルで定義した変数をや"Ohai"で自動取得した値も使用できます。

[参考]Ohaiによって自動収集されるものの例
- node['platform'] … "Node"のプラットフォーム名(例:fedora)
- node['platform_version'] … "Node"のプラットフォームのバージョン(例:18)
- node['ipaddress'] … "Node"に設定されているIPアドレス
- node['macaddress'] … "Node"のMACアドレス
- node['fqdn'] … "Node"のFQDN名
- node['hostname'] … "Node"のホスト名
- node['domain'] … "Node"の所属するドメイン名
- node['recipes'] … "Node"に設定されているChefのレシピ名
- node['roles'] … Chefで設定した"Node"の"Role(役割)"

例:ホスト名が"web"から始まるNodeのみリソース定義を適用する

リソースタイプ "リソース名" do
 only_if { node[:hostname] =~ "/^web/" }
 action :run
 :
end

例:ファイルが存在する場合はリソース定義を適用しない

リソースタイプ "リソース名" do
 not_if { File.exists?("ファイルパス") }
 action :run
 :
end

1 2 3 4 5 6





久木田 圭亮。新日鉄住金ソリューションズで働くインフラエンジニアです。現在は自社提供クラウドサービスのITサービスマネジメントをやっています。TwitterID: @k_kukita

このまとめに参加する