aboutsummaryrefslogtreecommitdiff
path: root/bootstrap.md
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap.md')
-rw-r--r--bootstrap.md295
1 files changed, 295 insertions, 0 deletions
diff --git a/bootstrap.md b/bootstrap.md
new file mode 100644
index 0000000..c02bfd2
--- /dev/null
+++ b/bootstrap.md
@@ -0,0 +1,295 @@
+[[!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
+----------------------------------
+
+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:
+------------------------
+
+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 -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