Normalmente, eu uso um repositório subversion para gerenciar meus módulos e manifestos fantoches.
Isso é realmente útil para historicizar a evolução das minhas instalações e minhas modificações nos servidores de produção que gerencio; e, isso é mais útil se você tiver mais de um usuário que gerencia as configurações do fantoche em seus ambientes.
Então, esta é minha arquitetura típica de repositório de subversão:
subversion puppet repository
|
|---- production environment checkout on /etc/puppet
|
|---- matteo environment checkout on /home/matteo/puppet
|
|---- johndoe environment checkout on /home/johndoe/puppet
|
.....
Portanto, se eu precisar atualizar minhas definições de infraestrutura com o puppet:
1. Faça login no master com meu usuário
2. svn up
3. Edite o código do puppet
4. Faça login em um servidor de teste
5. Executando o puppet com –environment = matteo
6. Se tudo estiver ok, posso fazer commit no meu repositório
7. Tornando-se root no master
8. svn up do checkout de produção
Mas, há algumas situações em que não verifico minhas alterações com uma execução específica do ambiente em um cliente e me comprometo diretamente com o repositório, seja por pequenas modificações ou atualizações rápidas e loucas.
Como você pode imaginar, às vezes eu escrevi algum código inútil em meus arquivos .pp e .erb, e a atualização de produção interrompeu toda a execução nos servidores de produção (às vezes, apenas porque escrevi um ponto, em vez de um ponto) .
Então, eu escrevi alguns scripts de pré e pós-commit para tornar mais seguros os commits nas produções. Agora, meu procedimento de edição rápida é assim:
1. Faça login no master com meu usuário
2. svn up
3. Edite o código do fantoche
4. Commit
Em primeiro lugar, escrevi este script de pré-confirmação (com base no fantoche fornecido):
#!/bin/sh
# SVN pre-commit hook to check Puppet syntax for .pp files
REPOS="$1"
TXN="$2"
tmpfile=`mktemp`
export HOME=/
SVNLOOK=/usr/bin/svnlook
# Validate *.pp files
$SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[^D].*.pp$/ {print $2}' | while read line
do
$SVNLOOK cat -t "$TXN" "$REPOS" "$line" > $tmpfile
if [ $? -ne 0 ]
then
echo "Warning: Failed to checkout $line" >&2
fi
# Validation
puppet parser validate --color=false --confdir=/tmp --vardir=/tmp --ignoreimport $tmpfile 2>/dev/null
if [ $? -ne 0 ]
then
echo "Puppet syntax error in $line." >&2
exit 2
fi
done
# Validate *.erb files
$SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[^D].*.erb$/ {print $2}' | while read line
do
$SVNLOOK cat -t "$TXN" "$REPOS" "$line" > $tmpfile
if [ $? -ne 0 ]
then
echo "Warning: Failed to checkout $line" >&2
fi
# Validation
erb -x -T '-' $tmpfile | ruby -c 2>/dev/null
if [ $? -ne 0 ]
then
echo "Template syntax error in $line." >&2
exit 2
fi
done
res=$?
rm -f $tmpfile
if [ $res -ne 0 ]
then
exit $res
fi
Eu coloquei esse arquivo, chamado “pre-commit”, no diretório $ SVNROOT / puppet / hooks, e tornei esse executável.
Isso será ativado quando você executar um comando commit (svn ci) e validar a sintaxe de todos os arquivos * .pp e * .erb modificados, antes de colocar as alterações no repositório.
Então criei um script de atualização realmente fácil para a produção, salvo em /usr/local/sbin/updatePuppetProduction.sh
#!/bin/bash
svn up --username=root --password=mysvnrootuserpw /etc/puppet
exit $?
E dar ao meu usuário a capacidade de iniciá-lo com sudo:
matteo ALL = NOPASSWD: /usr/local/sbin/updatePuppetProduction.sh
No final, escrevi o script $ SVNROOT / puppet / hooks / post-commit:
#!/bin/sh
REPOS="$1"
REV="$2"
sudo /usr/local/sbin/updatePuppetProduction.sh
exit $?
Feito!!!
Agora, quando eu lanço meu commit “svn ci”, meu mestre faz essas operações:
1. Obtenha a lista de todos os arquivos .pp e * .erb
modificados * 2. ** Verifique a sintaxe desses arquivos
3. Se a sintaxe estiver ok, confirme o commit e carregue as alterações no repositório
4. Execute o script updatePuppetProduction.sh como root para atualizar o ambiente de produção
5. Feito.
Aproveitar