複数の設定ファイルに同じ値を設定する方法

複数の設定ファイルに同じ値を設定する方法

私は多くのプログラムを持っていますが、そのすべてにおいて設定ファイル内に同一の値がいくつか存在します (すべてではないにしても大部分は にあります/etc)。

たとえば、Apache、Postfix、SQL、clamAV などの設定ファイルに保存されているホスト名があるとします。これらの値を変更しなければならない場合もあります。私が今行っているのは、これらのファイルをすべて編集し、以前の値を見つけて新しい値に置き換えることです。

1 か所で変更し、すべてのファイルを適切に設定したいと思います。bash のexport変数、sourceコマンド、または同様のものを検討しましたが、設定ファイルは実行可能ではないため、機能しないと思います。

推奨される方法は何でしょうか?

答え1

当然ですが、管理するすべてのパラメータと、それらが表示されるすべての場所を特定する必要があります。  (当然です。)  それはすでにご存知でしょう。

正しい方向に進むためのアプローチは次のとおりです。

  1. 設定ファイルに決して現れない文字列を選択してください。(そうすると、しなければならない一度で正しく実行できるとは限りません。これは実際には正しくありません。文字列 (たとえば、@@) を選択し、後でその文字列をファイルの 1 つで使用する必要がある場合は、修正できます。ただし、この設定の多くをやり直す必要があります。

    たとえば、昔、Unix には Source Code Control System (SCCS) と呼ばれるバージョン管理システムがありました@(#)。このシステムでは、ファイルに自然に現れることのない文字列として という文字列が使用されていました。私の知る限り、SCCS はもう使われていない (少なくともあまり使われていない) ので、 を使っても問題ないはずです@(#)。または、!user2461440?や、実際の名前などを使用することもできます。制御文字 (複数可)、たとえばCtrl+ACtrl+などを含めることができますG

  2. パラメータ プレースホルダの命名規則を選択します。これは@(#){HOSTNAME}、、、@(#){IP}などのように単純でわかりやすいものになります@(#){GATEWAY}

  3. などのすべての設定ファイルのテンプレート バージョンを作成します。apache.templateこれらのテンプレートを編集して、操作するすべてのパラメータを、対応するパラメータ プレースホルダ (前の段落から) に置き換えます。これら (および次のもの) は、 のサブディレクトリなど、安全で目立たない場所に置く必要があります/root

  4. 次のようなスクリプトを記述します。

    HOST=Zanzibar
    IP=10.11.12.42
    LOG=/var/log/lumber
    
    fullpath[apache]=/etc/apache.conf
    fullpath[postfix]=/etc/postfix/configuration
    
    for file in apache postfix …
    do
        path=${fullpath[$file]}
        sed -e "s/@(#){HOSTNAME}/$HOST/g" \
            -e "s/@(#){IP}/$IP/g" \
            -e "s|@(#){LOG}|$LOG|g" \
            "$file.template" > "$path.new"  &&
            mv "$path" "$path.bak"          &&
            mv "$path.new" "$path"
    done
    

    値に s が含まれているため、を置き換えるサブコマンド@(#){LOG}では$LOG 異なる区切り文字 ( ) が使用されていることに注意してください。したがって、文字列にはこの区切り文字 ( ) を含めることはできません。(もちろん、標準の区切り文字 ( ) も含めることはできません。)|$LOG/@(#)|/

  5. 配列 (例: fullpath[apache]) はすべてのシェルで機能するわけではありません。配列をサポートする bash または他のシェルがない場合は、配列をシミュレートまたは回避するようにスクリプトを調整する必要があります。

  6. ファイルのシステム属性を正しく設定するには、スクリプトにコマンドをchown追加する必要があるかもしれません。または、本当にchmod本当にスクリプトが正しく動作していることを確認したら、次のようにファイルを上書きするようにスクリプトを修正します。

        sed  …      > "$path"
    

    したがって、inode とその属性は保持され、mvコマンドや.newファイルは使用されません.bak

  7. 自動化対象として選択したパラメータのいずれかを変更する場合は、HOST=Wonderlandスクリプトの先頭にある対応する割り当てステートメント (例: ) を編集します。スクリプトを編集したくない場合は、スクリプトを 2 つのファイルに分割します。1 つはパラメータ値 ( HOST=…IP=…など) を含むファイル、もう 1 つは構成ファイルのすべての処理を行うファイルです。2 番目のスクリプトは、sourceパラメータ値を取得する最初のスクリプトになります。こうすることで、パラメータ値が変更された場合、メイン スクリプトではなく、値を含む (スクリプト) ファイルのみを編集する必要があります。

  8. ファイルを手動で編集しないでください。これらの変更は、次回パラメータ化スクリプトを実行するときに上書きされます。代わりに、対応するテンプレート ファイルを編集して、スクリプトを再実行します。このことを思い出すために、ファイルにコメントを入れるとよいでしょう。(1 つの構成ファイルにのみ影響する変更のためにすべての構成ファイルを再生成したくない場合は、スクリプトを変更して、選択したファイルのみを再生成できるようにすることができます。)

関連情報