Bootstrap de uma configuração completa¶
Este documento tem como objetivo descrever o processo de bootstrap de uma configuração completa de um servidor utilizando o Padrão Saravá. O processo de bootstrap pode ser compreendido como "o processo de coordenar diversos processos interdepententes de forma que seja atingida uma configuração sistêmica estável".
Para este processo, utilizaremos as seguintes ferramentas:
Os seguintes estágios fazem parte de uma instalação padrão completa:
Instalação do sistema padrão na máquina hospedeira¶
Documentação aqui.
Configuração da máquina hospedeira¶
Configure algumas variáveis de ambiente:
export domain="projeto.org"
export hostname=`hostname | sed -e s/\\\\..*$//`
export puppet_bootstrap_dir=/var/tmp/puppet-bootstrap
export PUPPETLIB=${puppet_bootstrap_dir}/modules
Configure o arquivo /etc/hosts
(a ordem dos hostnames influencia nos resultados do facter
):
cat > /etc/hosts <<EOF
127.0.0.1 ${hostname}.${domain} ${hostname}
127.0.0.1 localhost
EOF
Instale o git e o puppet e clone o repositório puppet-bootstrap
:
apt-get -y install git-core puppet wipe
git clone git://git.sarava.org/puppet-bootstrap ${puppet_bootstrap_dir}
Altere o arquivo ${puppet_bootstrap_dir}/manifests/config.pp
de acordo com suas necessidades.
Prepare o servidor para a utilização do puppet.
puppet apply -d -v ${puppet_bootstrap_dir}/manifests/stage0.pp
Crie um vserver para abrigar o nó administrativo:
puppet apply -d -v ${puppet_bootstrap_dir}/manifests/host-stage1.pp
Anote a fingerprint da chave ssh do vserver:
vserver ${hostname}-master exec ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
Configuração do nó administrativo¶
A partir deste momento, vamos trabalhar apenas no nó administrativo recém criado.
Copie o puppet-bootstrap
e a configuração padrão para o vserver e limpe os rastros:
echo LANG=C > /var/vservers/${hostname}-master/etc/default/locale
cp -r ${puppet_bootstrap_dir} \
/var/vservers/${hostname}-master/${puppet_bootstrap_dir}
cp -r /usr/local/puppet \
/var/vservers/${hostname}-master/usr/local/puppet
wipe -rcfq -S r -R /dev/urandom ${puppet_bootstrap_dir} /usr/local/puppet
Acesse o vserver e instale algumas ferramentas:
vserver ${hostname}-master enter
apt-get update
apt-get -y upgrade
apt-get -y install git puppet puppetmaster wipe
Configure o hostname e domínio do nó administrativo:
cat > /etc/hosts <<EOF
127.0.0.1 ${hostname}-master.${domain} ${hostname}
127.0.0.1 localhost
EOF
Prepare o vserver para a utilização do puppet.
puppet apply -d -v ${puppet_bootstrap_dir}/manifests/stage0.pp
puppet apply -d -v ${puppet_bootstrap_dir}/manifests/admin-stage1.pp
Criação de repositórios padrão¶
Dê acesso ao repositório administrativo do gitosis a um usuário:
sudo -H -u gitosis gitosis-init < FILENAME.pub
Clone o repositório administrativo do gitosis remotamente:
git clone ssh://gitosis@servidor.${domain}:2202/gitosis-admin
Altere o arquivo gitosis-admin/gitosis.conf
do repositório clonado e crie um
repositório para a configuração do puppet e um repositório para suas chaves
criptográficas:
[gitosis]
daemon = no
gitweb = no
public_http = no
[group admin]
writable = gitosis-admin puppet keyring
members = usuario@maquina
Empurre as mudanças para o servidor:
git commit -a -m "Adicionando repositórios para puppet e keyring"
git push origin master
Para adicionar um novo usuário ao gitosis, basta adicionar as chaves públicas
ssh ao diretório gitosis-admin/keydir/
com um nome de arquivo do tipo
usuario@maquina.pub
.
Configuração do repositório puppet¶
Altere as configurações padrão do puppet em /usr/local/puppet/default-conf
de
acordo com suas necessidades e incialize os repositórios em /etc/puppet
e
/var/git/repositories/puppet
):
/etc/init.d/puppetmaster stop
rm -rf /etc/puppet && mkdir /etc/puppet
cd /etc/puppet
cp -r /usr/local/puppet/default-conf/* .
wipe -rcfq -S r -R /usr/local/puppet
git init
git add *
puppet-bootstrap add-submodules /etc/puppet
git commit -m "Initial config."
git clone --bare /etc/puppet/ /var/git/repositories/puppet.git
chown -R gitosis:gitosis /var/git/repositories/puppet.git
Agora já podemos clonar o repositório de configurações do puppet remotamente:
git clone ssh://gitosis@${hotname}.${domain}:2202/puppet.git
Configuração da hydra¶
Esta parte da instalação gera chaves criptográficas e portanto deve ocorrer em uma máquina com um nível de segurança significativo (criptografia de disco, bootless, etc).
Instale hydra
e keyringer
:
sudo apt-get -y install git-core
# hydra
sudo git clone git://git.sarava.org/hydra /usr/local/hydra
sudo ln -sf /usr/local/hydra/hydra /usr/local/sbin/hydra
sudo ln -sf /usr/local/hydra/hydra /usr/local/sbin/hydractl
# keyringer
sudo git clone git://git.sarava.org/keyringer /usr/local/keyringer
sudo ln -sf /usr/local/keyringer/keyringer /usr/local/bin/keyringer
Tenha certeza que possui em seu chaveiro gpg as chaves dos usuários que irão acessar o repositório de chaves. Crie um keyring para o projeto clonando o repositório configurado:
keyringer projeto init ~/projeto/keyring
cd ~/projeto/keyring
git init
git remote add origin ssh://gitosis@servidor.${domain}:2202/keyring.git
git add *
git commit -m "initial commit"
git push origin master
Clone o repositório de configuração do puppet e registre uma nova hydra:
puppet_dir=~/projeto/puppet
git clone git://gitosis@servidor.${domain}:2202/puppet $puppet_dir
hydra projeto register $puppet_dir
Gere novas chaves para os nós configurados e as envie para os nós:
hydra projeto newkeys
hydra projeto import servidor.pub
Partida do puppetmaster¶
/etc/init.d/puppetmaster start
Configuração de backups¶
- Backup local criptografado:
- Criação de chaves GPG.
- Configuração do backup local.
- Backup remoto:
- Criação de chaves SSH para armazenamento remoto de backup.
- Configuração do backup remoto.
Criação de outros vservers/nós¶
- Nó de armazenamento ("storage") para agrupamento de backups.
- Proxy.
- Web.
- Test.
Pedaços de código úteis para o bootstrap¶
Configuração de submódulos padrão¶
apt-get -y install puppetmaster puppet git-core openssh-server
cd /etc/puppet
mkdir modules
git init
git add .
repos="`lynx -dump http://git.sarava.org/?a=project_index | awk '{ print $1 }' | grep ^puppet-`"
for repo in $repos; do
module="`basename $repo .git | sed -e s/^puppet-//`"
if [ ! -d "modules/$module" ]; then
git submodule add git://git.sarava.org/puppet-$module.git modules/$module
fi
done
No caso de bootstrap para um novo projeto, substitua as referências de git.sarava.org
para git.projeto.org
.
Configurando referências remotas em massa¶
# Configuracao
origin="sarava.org"
remotes="sarava.org:${port}"
repos="`lynx -dump http://git.$origin/?a=project_index | awk '{ print $1 }' | grep ^puppet-`"
# Adicionando referencias
for repo in $repos; do
module="`basename $repo .git | sed -e s/^puppet-//`"
if [ -d "puppet-$module" ]; then
cd puppet-$module
for remote in $remotes; do
ref="`echo $remote | cut -d . -f 1`"
domain="`echo remote | cut -d : -f 1`"
port="`echo remote | cut -d : -f 2`"
git remote add $ref ssh://gitosis@git.$domain:$port/puppet-$module.git
git push $ref master
done
cd ..
fi
done
Mudando referências em submódulos¶
# Configuracao
origin="sarava.org"
dest="exemplo.org"
cd puppet
sed -i -e "s/git.$origin/git.$dest/" .gitmodules
cd modules
for module in `ls`; do
cd $module
git remote rm origin
git remote add origin git://git.$dest/puppet-$module.git
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
cd ..
done
Exemplo de criação em massa de módulos¶
# Configuracao
origin="sarava.org"
remotes="sarava.org:${port}"
mkdir puppet-{ikiwiki,moin,mysql,trac}/manifests -p
touch puppet-{ikiwiki,moin,mysql,trac}/manifests/init.pp
for module in ikiwiki moin mysql trac; do
cd puppet-$module
cp ../puppet-git/LICENSE .
git init
git add .
git commit -a -m "Initial import"
for remote in $remotes; do
ref="`echo $remote | cut -d . -f 1`"
domain="`echo remote | cut -d : f 1`"
port="`echo remote | cut -d : f 2`"
git remote add $ref ssh://gitosis@git.$domain:$port/puppet-$module.git
git push $ref master
done
cd ..
done