Как заполнить несколько файлов конфигурации одинаковыми значениями

Как заполнить несколько файлов конфигурации одинаковыми значениями

У меня много программ, и все они имеют одинаковые значения в своих конфигурационных файлах (большинство из которых, если не все, находятся в /etc).

Допустим, это hostname, который хранится в файлах конфигурации Apache, Postfix, SQL, clamAV, чего угодно... Иногда мне нужно изменить эти значения. Теперь я редактирую все эти файлы и нахожу и заменяю предыдущее значение новым.

Я хотел бы изменить это в одном месте и правильно настроить все эти файлы. Я думал о exportпеременной bash, sourceкоманде или чем-то подобном; однако, поскольку файлы конфигурации не являются исполняемыми, я не думаю, что это сработает.

Какой метод будет рекомендован?

решение1

Очевидно, вам необходимо определить все параметры, которыми вы хотите управлять, и все места, где они появляются.  (Ну да.)   Вы это уже знали.

Вот подход, который может помочь вам встать на правильный путь:

  1. Выберите строку символов, которая никогда, никогда не появится ни в одном из файлов конфигурации. (Это звучит так, как будто выдолжен(Сделать это правильно с первой попытки. Это не совсем так; если вы выбрали строку (например, @@) и вам позже понадобится использовать эту строку в одном из файлов, вы можете это исправить. Вам просто придется переделать большую часть этой настройки.)

    Например, давным-давно в Unix была система контроля версий, которая называлась Source Code Control System (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}на, $LOG использует другой разделитель ( |), поскольку $LOGзначение содержит /s. Обратите внимание, что, следовательно, @(#)строка не должна содержать этот разделитель ( |). (И, конечно, она не должна содержать стандартный /разделитель ( ).)

  5. Массивы (например, fullpath[apache]) не работают во всех оболочках. Если у вас нет bash или другой оболочки, поддерживающей массивы, скрипт нужно будет адаптировать для их имитации или обхода.

  6. Вам может понадобиться добавить команды chownи chmodв скрипт, чтобы правильно установить системные атрибуты файлов. Или, если вы действительноДействительноУбедившись, что скрипт работает правильно, вы можете изменить его, чтобы перезаписать файлы на месте, как в

        sed  …      > "$path"
    

    таким образом сохраняя inode и его атрибуты, и не используя mvкоманду или файлы .newи .bak.

  7. Если вы хотите изменить один из параметров, которые вы выбрали для автоматизации, отредактируйте соответствующий оператор присваивания (например, HOST=Wonderland) в начале скрипта. Если вы не хотите редактировать скрипт, разбейте его на два файла: один, содержащий значения параметров ( HOST=…, IP=…, и т. д.), и один, который выполняет всю обработку файлов конфигурации. Второй скрипт будет sourceпервым, чтобы получить значения параметров. Таким образом, когда значение параметра изменится, вам нужно будет редактировать только файл (скрипта), содержащий значения, а не основной скрипт.

  8. Не редактируйте вручную файлы на месте, так как эти изменения будут перезаписаны при следующем запуске скрипта параметризации. Вместо этого отредактируйте соответствующий файл шаблона и перезапустите скрипт. Вы можете добавить комментарии в файлы, чтобы напомнить себе об этом. (Если вам не нравится идея повторной генерации всех файлов конфигурации для изменения, которое затрагивает только один из них, вы можете изменить скрипт так, чтобы он мог повторно генерировать только выбранные файлы).

Связанный контент