Como preencher muitos arquivos de configuração com os mesmos valores

Como preencher muitos arquivos de configuração com os mesmos valores

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

Digamos que seja o hostname, que está armazenado nos arquivos de configuração do Apache, Postfix, SQL, clamAV, tanto faz... Às vezes preciso alterar esses valores. O que faço agora é editar todos esses arquivos e localizar e substituir o valor anterior pelo novo.

Gostaria de alterá-lo em um só lugar e definir todos esses arquivos corretamente. Pensei na exportvariável, sourcecomando ou algo semelhante do bash; entretanto, como os arquivos de configuração não são executáveis, não acho que funcione.

Qual seria o método recomendado?

Responder1

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

Aqui está uma abordagem que pode ajudá-lo a começar no caminho certo:

  1. Escolha uma sequência de caracteres que nunca aparecerá em um dos arquivos de configuração. (Isso faz parecer que vocêdeveacertar na primeira tentativa. Isso não é verdade; se você escolher uma string (por exemplo, @@) e posteriormente precisar usar essa string em um dos arquivos, poderá corrigi-la. Você apenas terá que refazer muitas dessas configurações.)

    Por exemplo, há muito tempo, o Unix tinha um sistema de controle de versão chamado Source Code Control System (SCCS); ele usou a string @(#)como uma string que nunca apareceria naturalmente em um arquivo. Pelo que eu sei, o SCCS não está mais em uso (pelo menos não muito), então deve ser seguro usá-lo @(#). Ou você pode usar algo como !user2461440?ou qualquer que seja seu nome verdadeiro. Você pode incluir caracteres de controle; por exemplo, Ctrl+ Aou Ctrl+ G.

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

  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 pelos espaços reservados de parâmetros correspondentes (do parágrafo anterior). Você deve colocá-los (e os seguintes) em um local 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 utiliza um delimitador diferente ( |), pois o $LOGvalor contém /s. Observe que, portanto, a @(#)string não deve conter esse 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 possui o bash ou outro shell que suporte arrays, o script precisará ser adaptado para simulá-los ou contorná-los.

  6. Talvez seja necessário adicionar comandos chowne chmodao script para definir corretamente os atributos do sistema dos arquivos. Ou, se você estiver realmenterealmenteCertifique-se de que o script esteja funcionando corretamente, você pode modificá-lo para substituir os arquivos no lugar, como em

        sed  …      > "$path"
    

    mantendo assim o inode e seus atributos, e não utilizar o mvcomando ou os arquivos .newe .bak.

  7. Quando você quiser alterar um dos parâmetros que escolheu para automatizar, edite a instrução de atribuição correspondente (por exemplo, HOST=Wonderland) no início do script. Se você não quiser editar o script, divida-o em dois arquivos: um que contém os valores dos parâmetros ( HOST=…, IP=…, etc…) e outro que faz todo o tratamento dos arquivos de configuração. O segundo script seria sourceo primeiro a obter os valores dos parâmetros. Dessa forma, quando o valor de um parâmetro for alterado, será necessário editar apenas o arquivo (script) que contém os valores, e não o script principal.

  8. Certifique-se de não editar manualmente os arquivos no local, pois essas alterações serão substituídas na próxima vez que você executar 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 alteração que afeta apenas um deles, você pode modificar o script para que ele tenha a capacidade de regenerar apenas os arquivos selecionados).

informação relacionada