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:
-
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 . -
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. -
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
. -
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 (/
).) -
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. -
Pode ser necessário adicionar os comandos
chown
echmod
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 emsed … > "$path"
retendo assim o inode e seus atributos, e não use o comando
mv
ou os arquivos.new
e.bak
. -
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 usariasource
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. -
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.)