[[!toc levels=4]] 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: * [Debian GNU/Linux 6.0](http://www.debian.org/releases/squeeze/). * [Linux-VServer](http://linux-vserver.org/) ([pacote do debian](http://packages.debian.org/squeeze/linux-image-2.6-vserver-686)). * [Git](http://git-scm.com/) e [gitosis](http://swik.net/gitosis). * [puppet-bootstrap](http://git.sarava.org/?p=puppet-bootstrap.git;a=summary). * [hydra](http://git.sarava.org/?p=hydra.git;a=summary). 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](/install). Configuração da máquina hospedeira ---------------------------------- Preencha o hostname e domínio da máquina no arquivo `/etc/hosts`. A ordem dos hostnames é importante para os facts `hostname` e `domain`. Troque `servidor` pelo hostname da máquina e `projeto.org` pelo domínio: 127.0.0.1 localhost xxx.yyy.zzz.www servidor.projeto.org servidor Clone o repositório `puppet-bootstrap`: export puppet_bootstrap_dir=/tmp/puppet-bootstrap export PUPPETLIB=$puppet_bootstrap_dir/modules apt-get install git-core puppet 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. Os comandos a seguir realizam as seguintes tarefas: * Instalação dos módulos do puppet em `/tmp/puppet-bootstrap/modules`. * Criação de um vserver para abrigar o nó administrativo. * Configuração do firewall para acesso externo ao vserver via ssh. puppet apply -d -v $puppet_bootstrap_dir/manifests/stage0.pp puppet apply -d -v $puppet_bootstrap_dir/manifests/host-stage1.pp Configuração do nó administrativo --------------------------------- A partir deste momento, vamos trabalhar apenas no nó administrativo recém criado. Acesse o nó administrativo e clone o `puppet-bootstrap` novamente: vserver servidor-master enter export PUPPETLIB=$puppet_bootstrap_dir/modules git clone git://git.sarava.org/puppet-bootstrap $puppet_bootstrap_dir Os comandos a seguir realizam as seguintes tarefas: * Instalação dos módulos do puppet. * Geração de uma configuração padrão do puppet em `/var/local/puppet/default-conf`. * Instalação do gitosis. * Instalação do puppetmaster com configuração de atualização periódica do repositório em `/etc/puppet` (que criaremos em instantes). 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.projeto.org:porta/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 `/var/local/puppet/default-conf` de acordo com suas necessidades, faça uma cópia das configurações para o `/etc/puppet`, crie um novo repositório git neste local e clone o repositório para o diretório do gitosis: cd /etc/puppet cp -r /var/local/puppet/default-conf/* . git init git add * 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@servidor.projeto.org:porta/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 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 ssh://gitosis@servidor.projeto.org:porta/keyring.git Clone o repositório de configuração do puppet e registre uma nova hydra: puppet_dir=~/projeto/puppet git clone git://gitosis@servidor.projeto.org:porta/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: ------------------------ 1. Backup local criptografado: 1. Criação de chaves GPG. 2. Configuração do backup local. 2. Backup remoto: 1. Criação de chaves SSH para armazenamento remoto de backup. 2. 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 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 | cut -d - -f 2`" 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:porta" 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 | cut -d - -f 2`" 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:porta" 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