Chef で Postfix のインストールと設定

昨日行った作業 Postfix のインストールと設定 〜 CentOS6 を、Chef の Cookbook で自動で行えるようにします。

スポンサーリンク

このエントリーは、CentOS サーバー設定用 Chef Cookbook/Recipe の目次 の一部です。

私は Cookbook の管理方針として、The Environment Cookbook Pattern を簡略化した我流な方法を採用しています。

大規模にchefを使い倒すためのcookbook pattern – Qiita
Chef Cookbook の管理方針、The Environment Cookbook Pattern について | EasyRamble
Chefでrbenvとruby-buildをインストール | EasyRamble

Postfix のインストールと設定を行う Recipe

まずは、postfix 用の Application Cookbook を作成。

以下の処理を行う Recipe を作成します。Application Cookbook レイヤーの Recipe です。

1. sendmail の停止
2. postfix インストール
3. postfix を MTA として設定
4. 設定ファイル /etc/postfix/main.cf のオリジナルをバックアップ
5. 設定ファイル /etc/postfix/main.cf をテンプレートから作成
6. postfix を自動起動のサービスに追加して起動

site-cookbooks/app_postfix_cookbook/recipes/default.rb

# set postfix as MTA の処理では、not_if ガードで /etc/alternatives/mta が /usr/sbin/sendmail.postfix へのシンボリックリンクになっていない場合にのみ、postfix を MTA にセットするコマンドを実行するようにしています。

/etc/postfix/main.cf 用テンプレート

続いて、Postfix の設定ファイル(/etc/postfix/main.cf)用のテンプレート main.cf.erb を作成します。変数を設定する箇所だけ抜粋、これらのパラメータ以外はデフォルトのままです。

site-cookbooks/app_postfix_cookbook/templates/default/main.cf.erb

最後の <%= node.set['postfix']['relay'] %> は、LAN 内のメールサーバーからのメール送信で、リレーホストを設定する場合に利用。後述しますが、Gmail の SMTP サーバーを利用しました。

Wrapper Cookbook で各環境に共通の変数の値を設定

Wrapper Cookbook は、app_postfix_cookbook をラップ(include_recipe)して、環境に依存しないテンプレート変数の値を設定する Cookbook です。

site-cookbooks/wrapper_project_cookbook/default.rb

Wrapper Cookbook は、プロジェクト毎(ノード毎)に特有の値を変数に設定し、利用する Recipe を include_recipe してラップするための Cookbook となります。プロジェクト毎(ノード毎)のサーバー仕様書のようなもの。

さらに以降の Environment Cookbook で Wrapper Cookbook をラップ(include_recipe)して、各環境(test, produciton, staging など) に特有の値を変数にセットします。

Vagrant 仮想マシン上での Chef テスト環境用の Recipe

Environment Cookbook は、env_project_cookbook という名前の Cookbook で、レシピ名は project-name_env-name.rb という名前で作成しています。project_vagrant.rb(Vagrantテスト環境), project_production(プロダクション環境)など。

LAN 内のテスト環境用の Vagrant 仮想マシン上からだと、sendmail によるメール送信が、リレーを使わないとできませんでした。なので、Gmail の SMTP サーバーをリレー(経由)してメール送信を行う設定をします。

site-cookbooks/env_project_cookbook/recipes/project_vagrant.rb

前半で、Vagrant テスト環境に特有の node.set 変数の値を設定し、Wrapper Cookbook(wrapper_project_cookbook)の default.rb レシピをラップしています(include_recipe)。

後半は、必要となる sasl 関連のパッケージのインストールと、メールのリレーに必要な /etc/postfix/main.cf から利用する /etc/postfix/sasl_passwd の作成と設定です。'[smtp.gmail.com]:587 username@gmail.com:password’ の箇所のメールアドレスとパスワードは利用するものに変更が必要です。

Production 環境用の Recipe

こちらは、Gmail の SMTP リレーを使用しないので、以下のように設定するだけ。

site-cookbooks/env_project_cookbook/recipes/project_production.rb

以上のような感じで、Postfix 用の Cookbook を作成しまして、プロビジョニングも上手く実行できました。sendmail コマンドを使ってのメール送信テストもOK。

The Environment Cookbook Pattern で、Application Cookbook, Wrapper Cookbook, Environment Cookbook の3レイヤーに分ける方法は、個人的にはかなりしっくり来ている感じです。私の場合は、Wrapper Cookbook と Environment Cookbook は Cookbook を1つにまとめて、Recipe 単位で分割するように簡略化していますけれど。

とりあえず、この構成にしておけば、Application Cookbook 1つ1つの使い回しがすごく簡単になります。それから、Wrapper Cookbook(wrapper_project_cookbook)と Environment Cookbook(env_project_cookbook)は、.gitignore に追加しています。サーバー(ノード)固有の仕様やパスワードが含まれていますので。

The Environment Cookbook Pattern は、これら3つに加え Base Cookbook(全てのプロジェクトに共通の処理)、Library Cookbook(ライブラリ用)の計5レイヤーからなります。詳細は冒頭のリンクからどうぞ!

スポンサーリンク
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!