hacks/mail/Postfix
2010年04月13日
キャリア別に同時接続数制限したい
キャリアのMTAに対して大量にメールを配送すると、接続一時拒否される事がある。
その対策の1つが、配送数制御。
▼検証環境
- Fedora release 8
- Postfix 2.5.5
作業内容
▼/etc/postfix/main.cf 必要に応じて修正
> transport_maps = hash:/etc/postfix/transport
▼/etc/postfix/master.cfに追記
> smtp-softbank.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1 > smtp-ezweb.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1 > smtp-docomo.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1
▼/etc/postfix/transportに追記
> softbank.ne.jp smtp-softbank.ne.jp: > ezweb.ne.jp smtp-ezweb.ne.jp: > docomo.ne.jp smtp-docomo.ne.jp:
▼transport.dbを構築
# cd /etc/postfix # postmap transport
▼Postfixに設定を反映
# /etc/init.d/postfix reload
あとは日々ログを観察しつつ、
システムに似合ったsmtp_destination_concurrency_limitの設定値を割り出して行く。
2008年10月03日
改めてメールサーバ構築のまとめ
久しぶりにメールサーバの設定作業を行った。
自分自身の復習目的に、以前書いたメールサーバ構築関連エントリのまとめなおしてみた。
自宅や中小企業用にはこれで間に合うのではないだろうか。
メールサーバ構成概要

主な機能
- Submissionポート
- SMTP-Auth
- IMAP4
- メールアカウント管理ツール
- 複数バーチャルドメイン
PostfixAdminの設定
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| db_pass | ******** |
ユーザー用Maildirディレクトリデザイン補足
今回、
- 『$(local-part)@$(domain)』のメールボックスを、
- 『$(domain)/$(local-part)』となるようにする
PostfixAdminで設定する。
設定すべき変数が下記2つ。
| $CONF['domain_path'] | 'NO' | (無し) |
| 'YES' | $(domain)/ | |
| $CONF['domain_in_mailbox'] | 'YES' | $(local-part)@$(domain) |
| 'NO' | $(local-part) |
今回の設定。
| $CONF['domain_path'] | 'YES' |
| $CONF['domain_in_mailbox'] | 'NO' |
作業内容
# mkdir -p /var/lib/postfixadmin # cd /var/lib/postfixadminostfixadmin; pwd /var/lib/postfixadmin # wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0 # tar zxvf postfixadmin_2.2.0.tar.gz # ln -s postfixadmin-2.2.0 htdocsApacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd /etc/httpd/conf/vhosts-available # vi postfixadmin.example.com .....(省略)..... # cd ../; pwd /etc/httpd/conf # ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/問題なければ反映(reload)
# /usr/sbin/apachectl configtest Syntax OK # /etc/init.d/httpd reload Reloading httpd: [ OK ]ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。
DBアクセス用アカウント作成
$ mysql -uroot mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********'; mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';PostfixAdminの設定
# pwd /var/lib/postfixadmin/htdocs # cp -pi config.inc.php config.inc.php.0 # vi config.inc.php # diff config.inc.php.0 config.inc.php 31c31 < $CONF['configured'] = false; --- > $CONF['configured'] = true; 51,53c51,53 < $CONF['database_host'] = 'localhost'; < $CONF['database_user'] = 'postfixadmin'; < $CONF['database_password'] = 'postfixadmin'; --- > $CONF['database_host'] = 'localhost'; > $CONF['database_user'] = 'postfix'; > $CONF['database_password'] = '********'; 123c123 < $CONF['domain_path'] = 'NO'; --- > $CONF['domain_path'] = 'YES'; 129c129 < $CONF['domain_in_mailbox'] = 'YES'; --- > $CONF['domain_in_mailbox'] = 'NO';再び http://postfixadmin.example.com/setup.php を確認。
- 各項目がOKとなる事を確認。
- 管理アカウント作成を要請されるので、管理アカウントを作成する。
- この時点でPostfixAdminがtableを生成してくれる
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/
この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。
Postfixの設定
- vpopmailの様なディレクトリ構成にする
- SMTP-Authの認証はDovecotに任せる
- Submissionポート(tcp/587)
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/ | |
| 設定ファイル | /var/lib/vpostmail/etc/*.cf |
作業内容
masterにsubmissionポートを追加。
# cd /etc/postfix/ # vi master.cf > submission inet n - n - - smtpdバーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmailバーチャルドメイン用にmain.cf修正
また、SASLの設定も追加する。
# pwd /etc/postfix # cp -pi main.cf main.cf.0 # vi main.cf # diff main.cf.0 main.cf > virtual_gid_maps = static:12000 > virtual_uid_maps = static:12000 > virtual_mailbox_limit = 51200000 > virtual_minimum_uid = 1001 > virtual_transport = virtual > virtual_mailbox_base = /var/lib/vpostmail/domain > virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf > virtual_mailbox_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf > virtual_alias_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cf > > smtpd_sasl_auth_enable = yes > smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination > smtpd_sasl_type = dovecot > smtpd_sasl_path = private/authメールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/ # cd /var/lib/vpostmail/; pwd /var/lib/vpostmail # mkdir etc domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc
# vi mysql_virtual_alias_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'
# vi mysql_virtual_domains_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT description FROM domain WHERE domain='%s'
# vi mysql_virtual_mailbox_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。
etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd /var/lib/vpostmail # chown -R postfix:postfix etc/ # ls -ld etc/ drwx------ 2 postfix postfix 4096 May 7 20:35 etc/設定内容確認
# /etc/init.d/postfix check問題なければ反映
# /etc/init.d/postfix reload Reloading postfix: [ OK ]送信テスト
$ telnet localhost 25 helo localhost mail from:foo@example.net rcpt to:bar@example.com data Subject: test test test . quitログ確認
# tail -F /var/log/maillog .....エラーが出てなければOK
Dovecotの設定
メールを受信
PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/ | |
| 設定ファイル | /etc/dovecot-mysql.conf |
作業内容
dovecotをMySQL対応にする。
# yum install dovecot-mysqldovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3
auth default {
mechanisms = plain
passdb pam {
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb passwd {
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
user = root
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
MySQL用の設定。※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload Stopping Dovecot Imap: [ OK ] Starting Dovecot Imap: [ OK ]POPの確認
$ telnet localhost 25 user foo@example.com pass ******** list retr 1 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
まとめ
- この構成にはスパムメール対策がない事に気づいた
- そのうちスパムメール対策も追加した物をまとめる…かも知れない
2008年05月08日
メールを受信
PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/ | |
| 設定ファイル | /etc/dovecot-mysql.conf |
作業内容
dovecotをMySQL対応にする。
# yum install dovecot-mysqldovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3
auth default {
mechanisms = plain
passdb pam {
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb passwd {
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
user = root
}
MySQL用の設定。※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload Stopping Dovecot Imap: [ OK ] Starting Dovecot Imap: [ OK ]POPの確認
$ telnet localhost 25 user foo@example.com pass ******** list retr 1 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(4/n) - Postfixの設定
構成イメージはvpopmail
vpopmailの様なディレクトリ構成にする。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/ | |
| 設定ファイル | /var/lib/vpostmail/etc/*.cf |
作業内容
バーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmailバーチャルドメイン用にmain.cf修正
# pwd /etc/postfix # cp -pi main.cf main.cf.0 # vi main.cf # diff main.cf.0 main.cf > virtual_gid_maps = static:12000 > virtual_uid_maps = static:12000 > virtual_mailbox_limit = 51200000 > virtual_minimum_uid = 1001 > virtual_transport = virtual > virtual_mailbox_base = /var/lib/vpostmail/domain > virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf > virtual_mailbox_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf > virtual_alias_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cfメールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/ # cd /var/lib/vpostmail/; pwd /var/lib/vpostmail # mkdir etc domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc
# vi mysql_virtual_alias_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'
# vi mysql_virtual_domains_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT description FROM domain WHERE domain='%s'
# vi mysql_virtual_mailbox_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。
etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd /var/lib/vpostmail # chown -R postfix:postfix etc/ # ls -ld etc/ drwx------ 2 postfix postfix 4096 May 7 20:35 etc/設定内容確認
# /etc/init.d/postfix check問題なければ反映
# /etc/init.d/postfix reload Reloading postfix: [ OK ]送信テスト
$ telnet localhost 25 helo localhost mail from:foo@example.net rcpt to:bar@example.com data Subject: test test test . quitログ確認
# tail -F /var/log/maillog .....エラーが出てなければOK
次回はPOP3サーバの設定
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
管理ツールで管理負荷軽減
エンジニアであればコマンドラインからの作業で事足りる。
納品する場合など、相手がエンジニアとは限らない。
管理ツールを導入する事により、覚える事は最小限。
今回はメールアカウント管理ツールとしてPostfixAdminを使う。
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| db_pass | ******** |
ユーザー用Maildirディレクトリデザイン補足
今回、
『$(local-part)@$(domain)』のメールボックスを、
『$(domain)/$(local-part)』となるようにする。
これは単にvpopmailの構成が好きだったから。
PostfixAdminで設定する。
設定すべき変数が下記2つ。
| $CONF['domain_path'] | 'NO' | (無し) |
| 'YES' | $(domain)/ | |
| $CONF['domain_in_mailbox'] | 'YES' | $(local-part)@$(domain) |
| 'NO' | $(local-part) |
今回の設定。
| $CONF['domain_path'] | 'YES' |
| $CONF['domain_in_mailbox'] | 'NO' |
作業内容
# mkdir -p /var/lib/postfixadmin # cd /var/lib/postfixadminostfixadmin; pwd /var/lib/postfixadmin # wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0 # tar zxvf postfixadmin_2.2.0.tar.gz # ln -s postfixadmin-2.2.0 htdocsApacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd /etc/httpd/conf/vhosts-available # vi postfixadmin.example.com .....(省略)..... # cd ../; pwd /etc/httpd/conf # ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/問題なければ反映(reload)
[root@www conf]# /usr/sbin/apachectl configtest Syntax OK [root@www conf]# /etc/init.d/httpd reload Reloading httpd: [ OK ]ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。
DBアクセス用アカウント作成
$ mysql -uroot mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********'; mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';PostfixAdminの設定
# pwd /var/irokoi/postfixadmin/htdocs # cp -pi config.inc.php config.inc.php.0 # vi config.inc.php # diff config.inc.php.0 config.inc.php 31c31 < $CONF['configured'] = false; --- > $CONF['configured'] = true; 51,53c51,53 < $CONF['database_host'] = 'localhost'; < $CONF['database_user'] = 'postfixadmin'; < $CONF['database_password'] = 'postfixadmin'; --- > $CONF['database_host'] = 'localhost'; > $CONF['database_user'] = 'postfix'; > $CONF['database_password'] = '********'; 123c123 < $CONF['domain_path'] = 'NO'; --- > $CONF['domain_path'] = 'YES'; 129c129 < $CONF['domain_in_mailbox'] = 'YES'; --- > $CONF['domain_in_mailbox'] = 'NO';再び http://postfixadmin.example.com/setup.php を確認。
- 各項目がOKとなる事を確認。
- 管理アカウント作成を要請されるので、管理アカウントを作成する。
- この時点でPostfixAdminがtableを生成してくれる
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/
この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。
続きは次回。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
RHEL4のPostfixでは駄目
出鼻をくじかれる。
Postfixが対応するルックアップテーブル一覧を確認してみた。
$ /usr/sbin/postconf -m btree cidr environ hash ldap nis pcre proxy regexp static unixmysqlが無い!!
Postfixを作り直す
参考にしたページはPostfix + Courier-IMAP。
$ pwd
/home/admin/work/rpms
$ mkdir -p {SOURCES,SPECS,BUILD,SRPMS,RPMS/i386}
$ echo "%_topdir $HOME/work/rpms" > ~/.rpmmacros
$ cat ~/.rpmmacros
%_topdir /home/admin/work/rpms
SRPMを取得する$ cd SRPMS/; pwd /home/admin/work/rpms/SRPMS $ wget http://ftp.riken.jp/Linux/centos/5/os/SRPMS/postfix-2.3.3-2.src.rpm $ rpm -ivh postfix-2.3.3-2.src.rpmquota修正用パッチ
$ cd ../SOURCES/; pwd /home/admin/work/rpms/SOURCES $ wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz $ gunzip -d postfix-2.3.3-vda.patch.gz $ cd ../SPECS/; pwd /home/admin/work/rpms/SPECSspecファイル修正。
MySQLを使えるようにする。
$ cp -pi postfix.spec /tmp/ $ vi postfix.spec $ diff /tmp/postfix.spec postfix.spec 2c2 < %define MYSQL 0 --- > %define MYSQL 1 82a83 < Patch10: postfix-2.3.3-vda.patch 136a138 > %patch10 -p1 -b .vda $ rpmbuild -ba postfix.spec標準パッケージと入れ替える
$ su Password: # apt-get remove postfix # rpm -ivh ../RPMS/i386/postfix-2.3.3-2.i386.rpmmysqlが入っている事を確認
$ /usr/sbin/postconf -m btree cidr environ hash ldap mysql nis pcre proxy regexp static unixOK
関連ページ
2008年01月06日
envelope情報
友達に聞かれたので再度確認メモ
「MAIL FROM」「RCPT TO」を取得する方法ないの?
以前書いたメールの時間範囲指定配送を考察 Postfix編では情報不足。
| envelope | 環境変数 | 内容 | SMTP |
|---|---|---|---|
| envelope from | SENDER | 送信者メールアドレス | MAIL FROM |
| envelope to | RECIPIENT | 受信者メールアドレス | RCPT TO |
検証方法
下準備
$ cat ~/.forward "| /usr/bin/env > /tmp/env.log.$$"
- 環境変数を/tmp/env.log.$$へ出力
SMTP
$ telnet [maa ipaddr] 25 HELO smtp.example.com MAIL FROM:<foo+envelope@example.com> RCPT TO:<bar+envelope@example.com> DATA Subject: envelope To: foo+heder@example.com From: bar+header@exampel.com envelope/tmp/env.log.$$の内容のうち、
RECIPIENTとSENDERが、
envelope-to,envelope-fromと一致している事を確認した。
2007年11月16日
2007年08月13日
自分は良くmakeを使う(Makefileを書く)。
▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。
この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。
Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。
効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。
▼confを結合する時のイメージ

※画像クリックで拡大表示
▼/etc/postfix/main.cfを結合生成プロセス
・/etc/postfix/parts.d-common/main.cf 管理サーバ群共通設定
・/etc/postfix/parts.d-local/main.cf サーバ特有設定
↓
↓2つを結合する
↓
・/etc/postfix/master.cf
▼Makefile例
▼実行結果
makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。
結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。
makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。
広がるmakeの世界。
▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。
この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。
Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。
効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。
▼confを結合する時のイメージ

※画像クリックで拡大表示
▼/etc/postfix/main.cfを結合生成プロセス
・/etc/postfix/parts.d-common/main.cf 管理サーバ群共通設定
・/etc/postfix/parts.d-local/main.cf サーバ特有設定
↓
↓2つを結合する
↓
・/etc/postfix/master.cf
▼Makefile例
PARTS_COMMON=parts.d-common
PARTS_LOCAL=parts.d-local
MAIN_CFS=$(PARTS_COMMON)/main.cf $(PARTS_LOCAL)/main.cf
all: main.cf
main.cf: $(MAIN_CFS)
cat $(MAIN_CFS) > $@
echo $@ done.
PARTS_LOCAL=parts.d-local
MAIN_CFS=$(PARTS_COMMON)/main.cf $(PARTS_LOCAL)/main.cf
all: main.cf
main.cf: $(MAIN_CFS)
cat $(MAIN_CFS) > $@
echo $@ done.
▼実行結果
$ make
cat parts.d-common/main.cf parts.d-local/main.cf > main.cf
echo main.cf done.
main.cf done.
cat parts.d-common/main.cf parts.d-local/main.cf > main.cf
echo main.cf done.
main.cf done.
makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。
結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。
makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。
広がるmakeの世界。