- 更新日: 2014年7月29日
- Vagrant & Chef
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 を作成。
1 2 3 |
$ bundle exec knife cookbook create -o site-cookbooks app_postfix_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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# Cookbook Name:: app_postfix_cookbook # Recipe:: default # stop sendmail and chkconfig off bash 'stop_sendmail' do code <<-EOC service sendmail stop chkconfig sendmail off EOC only_if "chkconfig --list | grep sendmail | grep 3:on" end # install postfix package "postfix" do action :install end # set postfix as MTA bash 'set_postfix_as_mta' do code <<-EOC alternatives --set mta /usr/sbin/sendmail.postfix EOC not_if "ls -la /etc/alternatives/mta | grep /usr/sbin/sendmail.postfix" end # backup /etc/postfix/main.cf main_cf = "/etc/postfix/main.cf" bash 'move_main_cf_original' do code <<-EOC mv #{main_cf} #{main_cf}.org EOC creates "#{main_cf}.org" end # create /etc/postfix/main.cf from template template main_cf do owner "root" group "root" mode 0644 notifies :restart, 'service[postfix]' end # chkconfig on & set service & start bash 'chkconfig_add_postfix' do code <<-EOC chkconfig --add postfix EOC not_if "chkconfig --list postfix" end service "postfix" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end |
# 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
1 2 3 4 5 6 7 8 |
myhostname = <%= node.set['postfix']['myhostname'] %> mydomain = <%= node.set['postfix']['mydomain'] %> myorigin = <%= node.set['postfix']['myorigin'] %> inet_interfaces = <%= node.set['postfix']['inet_interfaces'] %> inet_protocols = <%= node.set['postfix']['inet_protocols'] %> mydestination = <%= node.set['postfix']['mydestination'] %> mynetworks = <%= node.set['postfix']['mynetworks'] %> <%= node.set['postfix']['relay'] %> |
最後の <%= node.set['postfix']['relay'] %> は、LAN 内のメールサーバーからのメール送信で、リレーホストを設定する場合に利用。後述しますが、Gmail の SMTP サーバーを利用しました。
Wrapper Cookbook で各環境に共通の変数の値を設定
Wrapper Cookbook は、app_postfix_cookbook をラップ(include_recipe)して、環境に依存しないテンプレート変数の値を設定する Cookbook です。
site-cookbooks/wrapper_project_cookbook/default.rb
1 2 3 4 5 6 7 8 |
# for postfix node.set['postfix']['myorigin'] = '$mydomain' node.set['postfix']['inet_interfaces'] = '127.0.0.1' node.set['postfix']['inet_protocols'] = 'ipv4' node.set['postfix']['mydestination'] = '$myhostname, localhost.$mydomain, localhost, $mydomain' node.set['postfix']['mynetworks'] = '127.0.0.0/8' include_recipe 'app_postfix_cookbook::default' |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# for postfix node.set['postfix']['myhostname'] = 'mail.localhost.localdomain' node.set['postfix']['mydomain'] = 'localhost.localdomain' node.set['postfix']['relay'] = <<"EOS" # using gmail smtp server to relay mails relayhost = [smtp.gmail.com]:587 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_tls_security_options = noanonymous smtp_sasl_mechanism_filter = plain smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt EOS include_recipe 'wrapper_project_cookbook::default' # for postfix using gmail smtp server relay # install sasl packages %w[cyrus-sasl-plain cyrus-sasl-md5].each do |pkg| package pkg do action :install end end # create /etc/postfix/sasl_passwd sasl_passwd = '/etc/postfix/sasl_passwd' relay_setting = '[smtp.gmail.com]:587 username@gmail.com:password' bash 'create_sasl_passwd' do code <<-EOC echo #{relay_setting} >> #{sasl_passwd} postmap #{sasl_passwd} chown root:root #{sasl_passwd} chmod 600 #{sasl_passwd} service postfix restart EOC not_if "cat #{sasl_passwd} | grep \"#{Regexp.escape(relay_setting)}\"" end |
前半で、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
1 2 3 4 5 6 |
# for postfix node.set['postfix']['myhostname'] = 'mail.mydomain.com' node.set['postfix']['mydomain'] = 'mydomain.com' node.set['postfix']['relay'] = '' include_recipe 'wrapper_project_cookbook::default' |
以上のような感じで、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レイヤーからなります。詳細は冒頭のリンクからどうぞ!
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!