/etc/hostsとhttpd.conf、ssl.confからドメインとIPの対応を一覧化する

2017/02/24

全サーバの/etc/hostsとhttpd.conf、ssl.confからドメインとIPの対応を一覧化するスクリプトを、egrep, xargs, sedのような一般的なコマンドを使って作成してみる。

/etc/hostsは以下のようになっているとする。

スクリプトは次のように、for loopとsshで各サーバにegrep, xargs, sedなどのコマンドを発行している。現在いるサーバで定義した変数を展開できるように、sshのコマンド部分はダブルクォーテーションで括る必要がある。

出力結果は以下のようになる。

egrep -oでhttpd.confとssl.confからドメインの正規表現に一致する部分を取り出している。' $domain_regex'の部分で、$domain_regexの前にスペース一文字を入れているのは、ServerName xxx.xxx.jpあるいはServerAlias yyy.xxx.jp zzz.xxx.jpのように各ドメインの区切りとなっている文字がスペースだから。
httpd.confとssl.confのように複数ファイルをegrepに渡した時に、どのファイルにマッチしているかという情報が出てしまうと後の処理が面倒なため、-hオプションをつけてファイル名を出力しないようにしている。

httpd.confとssl.confで重複したドメインがあるかもしれないので、各サーバ内でsort -uを実行して一意にしている。

sort -uまででconfに書かれているドメインが一列に出力されている状態になる。各行、ドメインの横にサーバのグローバルIPアドレスを記載するために、xargsとechoを組み合わせている。echoの中ではsedのコマンド置換を行っており、sedで/etc/hostsからグローバルIPアドレス部分のみを抽出している。ifconfigなど別の方法でグローバルIPアドレスが取得できるのであればそれでも問題ないし、sedではなくgrepで抽出してもいい。

また、ドメイン名の長さがバラバラだと出力結果の見た目がガタガタになってしまうので、echoではなくprintfで表示を整えてあげるのも良い。ただこの場合ドメイン名の最長文字数プラスアルファを適当に決め打ちしてあげる必要がある。

今回はhttpd.confとssl.confにしたが、confs変数にnginx/nginx.confやnginx/conf.d/ssl.confを入れることでnginxのconfも検索対象にできる。

-Linux