Como preencher muitos arquivos de configuração com o (s) mesmo (s) valor (es) [fechado]

1

Eu tenho muitos programas e todos eles têm alguns valores idênticos em seus arquivos de configuração (a maioria, se não todos, dos quais estão em /etc ).

Digamos que seja hostname, que é armazenado nos arquivos de configuração do Apache, Postfix, SQL, clamAV, etc. Às vezes eu preciso mudar esses valores. O que eu faço agora é editar todos esses arquivos e encontrar e substituir o valor anterior pelo novo.

Eu gostaria de alterá-lo em um lugar e definir todos esses arquivos corretamente. Pensei no comando export da bash, source ou algo parecido; no entanto, como os arquivos de configuração não são executáveis, não acho que funcione.

Outra opção é escrever um script bash que configure tudo como deveria estar usando sed / awk, mas eu não sou um expert em regex e isso vai me levar algum tempo, então eu prefiro fazê-lo com variáveis se possível .

Qual seria o método recomendado?

    
por user2461440 31.05.2017 / 19:56

1 resposta

2

Obviamente, você deve identificar todos os parâmetros que deseja gerenciar, e todos os locais onde eles aparecem. (Duh.) Você já sabia disso.

Veja uma abordagem que pode ajudar você a começar no caminho certo:

  1. Escolha uma sequência de caracteres que nunca, nunca aparecem em um dos arquivos de configuração. (Isso faz parecer que você deve acertar na primeira tentativa. Isso não é verdade; se você escolher uma string (por exemplo, @@ ) e depois você precisa usar essa string em um dos arquivos, você pode consertá-lo. Você precisará refazer muitas dessas configurações.)

    Por exemplo, há muito tempo, o Unix tinha um sistema de controle de versão chamado de Sistema de Controle do Código Fonte (SCCS); usou a string @(#) como uma string que nunca apareceria naturalmente em um arquivo. Até onde eu sei, o SCCS não está mais em uso (pelo menos, não muito) por isso, deve ser seguro usar @(#) . Ou você poderia usar algo como !user2461440? , ou seja qual for o seu nome verdadeiro. Você pode incluir caracteres de controle; por exemplo, Ctrl + A ou Ctrl + G .

  2. Escolha uma convenção de nomenclatura para espaços reservados de parâmetro. Isso poderia ser algo simples e direto como @(#){HOSTNAME} , @(#){IP} , @(#){GATEWAY} , etc.

  3. Crie versões de modelo de todos os seus arquivos de configuração, como apache.template , etc. Edite esses modelos para substituir todas as ocorrências dos parâmetros que você deseja manipular com seus espaços reservados de parâmetro correspondentes (do parágrafo anterior). Você deve colocar estes (e os seguintes) em um lugar seguro e afastado, como um subdiretório de /root .

  4. Escreva um script como este:

    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
    

    Observe que o subcomando que substitui @(#){LOG} por $LOG usa um delimitador diferente ( | ), porque o valor $LOG contém / s. Note que, portanto, a string @(#) não deve conter este delimitador ( | ). (E, claro, não deve conter o delimitador padrão ( / ).)

  5. Matrizes (por exemplo, fullpath[apache] ) não funcionam em todos os shells. Se você não tiver o bash ou outro shell que suporte matrizes, o script precisará ser adaptado para simular ou contorná-los.

  6. Pode ser necessário adicionar os comandos chown e chmod ao script para definir os atributos do sistema dos arquivos corretamente. Ou, se você realmente realmente tiver certeza que você conseguiu o script funcionando corretamente você pode modificá-lo para sobrescrever os arquivos no lugar, como em

        sed  …      > "$path"
    

    retendo assim o inode e seus atributos, e não use o comando mv ou os arquivos .new e .bak .

  7. Quando você quiser alterar um dos parâmetros que você escolheu para automatizar, edite a declaração de atribuição correspondente (por exemplo, HOST=Wonderland ) no início do script. Se você não quiser editar o script, Quebre o script em dois arquivos: um que contenha os valores dos parâmetros ( HOST=… , IP=… , etc…) e aquele que faz todo o manuseio dos arquivos de configuração. O segundo script usaria source o primeiro para obter os valores dos parâmetros. Dessa forma, quando um valor de parâmetro é alterado, você precisa editar apenas o arquivo (script) que contém os valores, e não o roteiro principal.

  8. Não edite manualmente os arquivos no lugar, como essas alterações serão sobrescritas da próxima vez você executa o script de parametrização. Em vez disso, edite o arquivo de modelo correspondente e execute novamente o script. Você pode querer colocar comentários nos arquivos para lembrá-lo disso. (Se você não gosta da ideia de regenerar todos os arquivos de configuração para uma mudança que afeta apenas um deles, você pode modificar o script por isso, tem a capacidade de gerar apenas arquivos selecionados.)

por 31.05.2017 / 22:01