2011年7月13日水曜日

あるファイルのあるディレクティブの下段にawkを利用して一行追加


あるファイルのあるディレクティブの下段に追加で一行を追加させる。
awkを使ったのだが、久しぶりに書いたらてこずったのでメモしておく。

例えば下記のようなことをしたい。

【変更前】
# cat /etc/snmp/snmpd.conf
(略)
rwcommunity public 10.0.0.1
rwcommunity public 10.0.0.2
rwcommunity public 10.0.0.3

trapsink 10.0.0.1 public
trapsink 10.0.0.2 public
trapsink 10.0.0.3 public

trap2sink 10.0.0.1 public
trap2sink 10.0.0.2 public
trap2sink 10.0.0.3 public
(略)


【変更後】
# cat /etc/snmp/snmpd.conf
(略)
rwcommunity public 10.0.0.1
rwcommunity public 10.0.0.2
rwcommunity public 10.0.0.3
rwcommunity public 10.0.0.4 ← 追加

trapsink 10.0.0.1 public
trapsink 10.0.0.2 public
trapsink 10.0.0.3 public
trapsink 10.0.0.4 public ← 追加

trap2sink 10.0.0.1 public
trap2sink 10.0.0.2 public
trap2sink 10.0.0.3 public
trap2sink 10.0.0.4 public ← 追加
(略)


サーバが何台もあった場合、手動ではやってられないだろう。

上の例のようにファイルが共通であれば同じものをコピーするだけでいいだろう。
しかし追加する行は共通であるが、それ以外の設定はサーバごとに異なっている場合もあるだろう。

$ cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.YYYYMMDD

$ awk '{if (/rwcommunity/) {print; flag+=1} \
else if (!/rwcommunity/ && flag > 0) {flag=0; print "rwcommunity public 10.0.0.4"; print} \
else print}' /etc/snmp/snmpd.conf > /var/tmp/snmpd.conf1

$ awk '{if (/trapsink/) {print; flag+=1} \
else if (!/trapsink/ && flag > 0) {flag=0; print "trapsink 10.0.0.4 public"; print} \
else print}' /var/tmp/snmpd.conf1 > /var/tmp/snmpd.conf2

$ awk '{if (/trap2sink/) {print; flag+=1}  \
else if (!/trap2sink/ && flag > 0) {flag=0; print "trap2sink 10.0.0.4 public"; print} \
else print}' /var/tmp/snmpd.conf2 > /var/tmp/snmpd.conf3

$ diff /var/tmp/snmpd.conf3 /etc/snmp/snmpd.conf

$ mv /var/tmp/snmpd.conf3 /etc/snmp/snmpd.conf

$ /etc/init.d/snmpd restart

$ rm /var/tmp/snmpd.conf*