特集
» 2008年06月17日 11時11分 公開

Linux Hacks: /etc/ファイル群の編集を簡単化するAugeas (2/2)

[Ben-Martin,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2       

 後記に示してあるのは、Augeasの諸機能を試す目的で/etcの内容を別途コピーしておくコマンド操作例である。なお/etcの直下にあるgconfおよびselinuxというディレクトリに収められているファイル群は数が多い上に簡単なAugeasの機能テストをする対象として適していないため、ここでは/etcにある設定ファイル群をtarボール化する際の前処理として、これら2つのディレクトリをfindコマンドを用いて明示的に除外させている。

export AUGEAS_ROOT=/tmp/augeas-`id -u`-root

rm -rf $AUGEAS_ROOT

mkdir $AUGEAS_ROOT

find /etc \( -path /etc/gconf -o -path /etc/selinux \) \

-prune -o -type f \

-print0 | xargs -0 tar cf $AUGEAS_ROOT/etc.tar

tar -C $AUGEAS_ROOT -xf $AUGEAS_ROOT/etc.tar

sudo chown -R $USER $AUGEAS_ROOT

augtool -b


 この段階でわたしが気づいたのは、Augeas WebサイトにあるQuick Tourページの解説では/etc/hostsが表示されているのに、わたしのhostsファイルは表示されていないということだ。この問題に関しては、わたしのhostsファイルに空行があるのが原因であったようで、こうした空行をすべて削除したところ/etc/hostsファイルはAugeasにより認識されるようになった。

$ augtool

augtool> ls /files/etc

sysconfig/ = (none)

...

hosts/ = (none)

inittab/ = (none)

...

augtool> ls /files/etc/hosts

1/ = (none)

2/ = (none)

...

augtool> ls /files/etc/hosts/1

ipaddr = 127.0.0.1

canonical = localhost.localdomain

alias[1] = localhost

alias[2] = lincomvm


 前記実行例中のlsコマンドの出力にあるlocalhostの定義を見ると分かるように、1つのアイテムに複数のエントリが存在する場合は、nをインデックス番号とした連番[n]がつけられるようになっている。このようにhostsファイル中の定義情報を示す目的でサブディレクトリ群に1、2……、nという連番をつけるシンタックスは、10.10.10.10など特定のIPアドレスに対するエントリが既に存在するかのチェックを困難にしているようにも思われるが、Augeasのパス指定ではワイルドカードがサポートされており、XPath系の一部シンタックスも使用できるようになっている。例えば後記の実行例における1つ目のコマンドは、/etc/hosts中に10.10.10.10という定義が既に存在しているかのチェックを行うものである。そして2つ目のコマンドでは、当該エントリの詳細を表示させている。次にわたしが実行したのは、setコマンド中にalias[1]を指定することで、当該ホストに対する直接のエイリアスを1つ作成することである。

 ドキュメントの記載によると最終ノードのインデックス番号はlast()関数の戻り値として取得できるはずだが、現行のAugeasではこうした状況での算術演算ができないため、last()+1をインデックス番号とした2つ目のエイリアス作成は失敗に終わってしまった。この問題に対する1つの簡易的な回避法は、事前にinsコマンドによる新規ノード追加を行っておき、その後でlast()の返す最終ノードのインデックス番号を用いたエイリアス作成を行うというものである。その後のmatchコマンドで実施しているのはエイリアスが存在するかのチェックであるが、ここではエイリアスのパスにおけるインデックス番号指定を省略することで、すべてのエイリアスノードをチェックさせている。最終行のsaveコマンドは、変更した内容を確定して保存させるための指示である。

augtool> match /files/etc/hosts/*/ipaddr 10.10.10.10

/files/etc/hosts/10/ipaddr

augtool> print /files/etc/hosts/10

/files/etc/hosts/10

/files/etc/hosts/10/ipaddr = "10.10.10.10"

/files/etc/hosts/10/canonical = "linux.com.example.com"

augtool> set /files/etc/hosts/10/alias[1] "l.c.alias"

augtool> print /files/etc/hosts/10

/files/etc/hosts/10

/files/etc/hosts/10/ipaddr = "10.10.10.10"

/files/etc/hosts/10/canonical = "linux.com.example.com"

/files/etc/hosts/10/alias = "l.c.alias"

augtool> set /files/etc/hosts/10/alias[last()+1] "l.c2.alias"

Failed

augtool> ins alias after /files/etc/hosts/10/alias[last()]

augtool> set /files/etc/hosts/10/alias[last()] "l.c2.alias"

augtool> print /files/etc/hosts/10

/files/etc/hosts/10

/files/etc/hosts/10/ipaddr = "10.10.10.10"

/files/etc/hosts/10/canonical = "linux.com.example.com"

/files/etc/hosts/10/alias[1] = "l.c.alias"

/files/etc/hosts/10/alias[2] = "l.c2.alias"

augtool> match /files/etc/hosts/10/alias l.c2.alias

/files/etc/hosts/10/alias[2]

augtool> save


 このようにAugeasを利用することで、設定ファイルのアップデート時に独自のスクリプトを構築するという負担は大幅に軽減できるだろう。もちろんごく単純に、特定の設定ファイルに新規の設定行を1つ追加するだけという作業であれば、Perl、awk、grep、wc、catなどでも対処可能だが、過去に変更を施した既存の設定行を操作するとなると話はそれほど簡単には進まないはずだ。つまり過去に施した変更内容が複雑なものであればあるほどスクリプト処理による設定ファイルの編集作業は困難となり、オリジナル状態からの相違点が大きくなった各種の設定ファイル群に対処可能なスクリプトを整備する負担は過度に大きくなっていくはずなのである。

 確かにAugeasは誕生間もないプロジェクトであり、本文中で触れたような/etc/hostsファイルに空行があるだけで正常に対処できないなど若干の不備は残されているものの、設定ファイルの編集作業を大幅に簡単化するという本来の目的は現状の完成度においてもほぼ達成されていると評していいだろう。いずれにせよこうしたhostsファイルの空行認識などは構文解析にまつわる不備なのであり、今後Augeas用のlensファイルの改良が進んでいけば、この種の問題点も一括して解消されていくものと期待できるはずだ。

Ben Martinは10年以上にわたってファイルシステムに取り組んでおり、博士課程の修了後、現在はlibferris、ファイルシステム、検索ソリューションを中心としたコンサルティング業に従事している。


関連キーワード

Linux Hacks | Linux | 運用管理


前のページへ 1|2       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ