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 export
variável, source
comando 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:
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.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}
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
.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$LOG
valor contém/
s. Observe que, portanto, a@(#)
string não deve conter esse delimitador (|
). (E, claro, não deve conter o/
delimitador padrão ( ).)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.Talvez seja necessário adicionar comandos
chown
echmod
ao 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 emsed … > "$path"
mantendo assim o inode e seus atributos, e não utilizar o
mv
comando ou os arquivos.new
e.bak
.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 seriasource
o 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.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).