同じ値で多くの設定ファイルを埋める方法[閉じる]

同じ値で多くの設定ファイルを埋める方法[閉じる]

私は多くのプログラムを持っており、すべてのプログラムは設定ファイルに同じ値を持っています(ほとんどはすべてではありませんが/etc)。

Apache、Postfix、SQL、clamAVなどの設定ファイルに保存されているホスト名であるとしましょう。時にはこれらの値を変更する必要があります。今やるべきことは、これらのファイルをすべて編集し、古い値を見つけて新しい値に置き換えることです。

1か所で変更し、すべてのファイルを正しく設定したいと思います。私はbashexport変数、コマンド、または同様のことを考えましたが、source設定ファイルは実行可能ではないので動作しないと思います。

推奨されるアプローチは何ですか?

答え1

当然、管理するすべてのパラメータと、パラメータが発生するすべての場所を識別する必要があります。  (Duh。)   あなたはすでにそれを知っていました。

次の方法では、正しいパスに移動できます。

  1. 構成ファイルのいずれかに表示されない文字列を選択します。 (これはあなたのようです。〜しなければならない最初の試みですぐに学びましょう。しかし、実際にはそうではありません。文字列(たとえば@@)を選択し、後でファイルのいずれかでその文字列を使用する必要がある場合は、この問題を解決できます。多くの設定をやり直してください。 )

    たとえば、以前はUnixにはソースコード制御システム(SCCS)というバージョン管理システムがあり、@(#)ファイルには自然に現れない文字列を使用していました。私が知っている限り、SCCSはそれ以上(少なくとも多くは)使用されていないため、安全に使用できます@(#)。または、同じ!user2461440?名前を使用するか、本名が何でも使用できます。Ctrl+AまたはCtrl+などの制御文字を含めることができます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
    

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

  5. 配列(例fullpath[apache]:)は、すべてのシェルでは無効です。 bashや配列をサポートする他のシェルがない場合は、それをエミュレートまたは解決するようにスクリプトを調整する必要があります。

  6. chownファイルのシステムプロパティを適切に設定するには、スクリプトにコマンドを追加する必要があります。chmodまたは本当に本物スクリプトが正しく機能していることを確認してください。スクリプトを変更して、次の適切なファイルを上書きできます。

        sed  …      > "$path"
    

    これはinodeとその属性を保持し、コマンドmv.newファイルを使用しません.bak

  7. 自動化するために選択したパラメータの1つを変更するには、スクリプトの先頭でそのHOST=Wonderlandディレクティブを編集します(例:)。スクリプトを編集したくない場合は、スクリプトを 2 つのファイルに分割します。 1つはパラメータ値(HOST=…IP=…etc...)を含み、もう1つは設定ファイルのすべての処理を実行します。 2番目のスクリプトは、sourceパラメータ値を取得する最初のスクリプトになります。これにより、パラメータ値が変更されたときにメインスクリプトではなく、その値を含む(スクリプト)ファイルのみを編集できます。

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

関連情報