Verificação automática de sintaxe de fantoche e atualização de produção

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