Itamaeが構成管理を仕込みます! ~新進気鋭の国産・構成管理ツール~

第2回 レシピの書き方

この記事を読むのに必要な時間:およそ 4 分

前回はItamaeをインストールし,簡単なレシピを実行してみました。今回はさらに実践的なレシピの書き方について解説します。前回述べたようにItamaeはChefに強く影響を受けているため,概ねChefと同じように書けます。

リソースとは

レシピにはリソースと呼ばれる,サーバ上のコンポーネント(ソフトウェア,ファイル,コマンドなど)を抽象化したものを記述します。リソースにはアクションをはじめとする属性を指定でき,操作の種類を指定することができます。前回も使ったpackageのリソースを例にすると

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

任意のコマンドをリソースとして定義できるため,Itamaeのリソースとして用意されていない操作を実行することができます。

繰り返し似たようなコマンドを書く場合や抽象化出来る場合は,プラグイン機構を利用して独自のリソースを定義するほうがお勧めですが,手っ取り早く実行するには便利です。プラグイン機構については次回,解説します。

executeリソースを利用する際は,冪等性が保たれるように記述する必要があります。例えば,2度以上実行する必要がなかったり,2度実行すると失敗するようなコマンドの場合は,実行すべきかどうかを事前に確認するようにします。

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_ifまたはnot_ifを使うと,特定のコマンドが成功または失敗した場合のみアクションを実行することができます。

fileリソース

fileリソースはサーバ上のファイルを表すリソースです。

createアクション

デフォルトはcreateアクションで,ファイルを作成します。なお,既にファイルが存在して,変更がある場合は上書きします。

file "/etc/nginx/conf.d/app.conf" do
  action :create # デフォルトなので省略可
  content "..."  # ファイルの内容
end

fileリソースをつかうと実行時にdiffが表示されます。--dry-runオプションをつけた場合にも表示されるので,実行前に変更される部分がわかります。

editアクション

editアクションをつかうと,ファイルの内容変更をRubyのスクリプトで書くことができます。

file "/etc/ssh/sshd_config" do
  action :edit
  block do |content|
    content.gsub!(/^Port .+$/, "Port 12322")
  end
end

editアクションの場合にもdiffが出力されます。

remote_fileリソース

createアクション

remote_fileはfileリソースの一種で,ローカルにあるファイルをサーバに置きます。

remote_file "/etc/my.cnf" do
  action :create  # デフォルトなので省略可
  source "my.cnf" # このファイルを/etc/my.cnfに配置する(レシピがあるディレクトリからの相対パス)
end

contentをファイルに書けること以外,fileリソースと同じですが,レシピと設定ファイルなどのsourceを分離でき管理しやすくなります。sourceは省略すると自動的に決定されます。sourceを省略した場合は,上記のmy.cnfの例だと以下のパスを上から順番に探索し,最初に見つかったものが使われます。

  • (レシピがあるディレクトリ)/files/etc/my.cnf
  • (レシピがあるディレクトリ)/files/my.cnf

著者プロフィール

荒井良太(あらいりょうた)

クックパッド株式会社 インフラエンジニア。ソフトウェアでのインフラの改善,運用の自動化に興味があり,オペレーションのない世界を夢見ている。休日はOSS活動をしていることが多い。ItamaeInfratasterの開発者。

URL:http://ryotarai.info

コメント

コメントの記入