[[!toc levels=4]]

Bootstrap da configura��o do puppet 
===================================

Pr�-requisitos
--------------

### DNS

Certifique-se de que existe uma entrada do tipo `puppet.projeto.org` apontando para o host que hospeda (ou hospedar�) o puppetmaster. Caso contr�rio, ser� preciso adicionar o nome do host no `/etc/puppet/puppet.conf` de cada cliente logo ap�s sua instala��o:

    [puppetd]
    server = puppet.projeto.org

E ent�o reiniciar o servi�o:

    /etc/init.d/puppet restart

### Firewall

� importante que o vserver hospedeiro do puppet tenha acesso SSH externo. Assim, certifique-se que seu Debian/Firewall possua uma linha do seguinte tipo no arquivo `/etc/shorewall/rules`:

    DNAT            net             vm:192.168.0.2:22 tcp 2202

No caso, `192.168.0.2` � o IP do vserver, `22` a porta de destino nesse IP e `2202` a porta aberta para a conex�o externa. Para tal configura��o ser efetiva, o `ListenAddress` do `/etc/ssh/sshd_config` do servidor SSH da **m�quina hospedeira** deve estar restrito ao IP real da m�quina.

Gitosis
-------

O gitosis � um gerenciador de reposit�rios git que utiliza chaves p�blicas ssh para controle de acesso. A ferramenta � simples, poderosa, est� nos reposit�rios do debian est�vel, e sua configura��o � feita atrav�s de um reposit�rio git, o que sugere um bom ponto de partida para o bootstrap.

Hoje em dia o Padr�o Sarav� utiliza o gitolite, por�m o bootstrap inicial utilizou o gitosis. Fica aos leitores/as o exerc�cio de utilizar o gitolite.

gitosis via puppetmasterd
-------------------------

O primeiro passo � criar o arquivo de manifesto `/etc/puppet/manifests/classes/gitosis.pp` com o seguinte conte�do:

    class gitosis {
      # directory for gitosis user and repositories
      file { "/var/git":
        ensure => directory,
        mode   => 0755,
        owner  => gitosis,
        group  => gitosis;
      }
    
      # the needed packages
      package { gitosis: ensure => installed; }
      package { sudo:    ensure => installed; }
      package { git:     ensure => installed; }
    
      # alters the user's home dir
      user { gitosis:
        allowdupe => false,
        comment   => "git repository hosting,,,",
        ensure    => present,
        home      => "/var/git",
        shell     => "/bin/sh";
      }
    
      # tries to get rid of ugly directory structure
      file { "/srv/gitosis":
        ensure => absent,
        force  => true;
      }
      file { "/srv": ensure => absent; }
    }

O arquivo acima, al�m de garantir que o git, sudo e gitosis estejam instalados, altera o home do usu�rio gitosis para `/var/git`, dentro do qual ser� criado um diret�rio chamado `repositories` onde ser�o armazendos nossos reposit�rios git.

Para aplicar as configura��es ao n�, adicionanos o seguinte conte�do ao arquivo de manifesto `/etc/puppet/manifests/site.pp`:

    import "classes/gitosis.pp"
    
    node 'admin.projeto.org' {
      include gitosis
    }

Para dar acesso ao primeiro usu�rio do gitosis, basta executar o seguinte comando:

    sudo -H -u gitosis gitosis-init < FILENAME.pub
    # (ou simplesmente copie e cole a chave p�blica aqui)

Um coment�rio importante sobre a op��o `-H`:

    .. warning::
    
    	For now, ``gitosis`` uses the ``HOME`` environment variable to
    	locate where to write its files. If you use ``sudo -u``
    	without ``-H``, ``sudo`` will leave the old value of ``HOME``
    	in place, and this will cause trouble. There will be a
    	workaround for that later on, but for now, always remember to
    	use ``-H`` if you're sudoing to the account.

Agora podemos clonar o reposit�rio administrativo do gitosis remotamente:

    git clone ssh://gitosis@servidor.projeto.org:porta/gitosis-admin

A configura��o n�o deve ser feita diretamente no reposit�rio do gitosis no servidor, como indicam os autores:

    You should always edit the configuration file via ``git``. The file
    symlinked to ``~/.gitosis.conf`` on the server will be overwritten
    when pushing changes to the ``gitosis-admin.git`` repository.

puppetmasterd via gitosis 
-------------------------

Agora que podemos alterar a configura��o do gitosis remotamente, vamos criar a permiss�o de acesso ao novo reposit�rio de configura��es do puppet, alterando `gitosis-admin/gitosis.conf`:

    [gitosis]
    
    [group gitosis-admin]
    writable = gitosis-admin
    members = usuario@maquina
    
    [group puppet]
    writable = puppet
    members = usuario@maquina

E atualizamos as configura��es no servidor atrav�s do git local:

    git commit -a
    git push origin master

Agora, de volta ao servidor, inicializamos um reposit�rio git em `/etc/puppet` e clonamos para o diret�rio do gitosis:

    cd /etc/puppet
    git init
    git add *
    git commit
    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 puppet remotamente:

    git clone ssh://gitosis@servidor.projeto.org:porta/puppet.git

Agora adicionamos um manifesto para o puppetmasterd em `puppet/manifests/classes/puppetmasterd.pp`:

    class puppetmasterd {
      package { puppetmaster: ensure => installed }
    
      # updates the puppet configuration dir with git repositories
      # every 5 minutes.
      cron { puppet-conf:
        command => "git --git-dir=/etc/puppet/.git/ pull /var/git/repositories/puppet.git master && \
                    git --git-dir=/etc/puppet/.git/ --work-tree=/etc/puppet/ checkout -f",
        user    => root,
        hour    => '*',
        minute  => '*/5',
        ensure  => present;
      }
     
      # runs the service
      service { puppetmasterd: ensure => running; }
    }

E atualizamos `puppet-conf/manifests/site.pp`:

    import "classes/gitosis.pp"
    import "classes/puppetmasterd.pp"
    
    node 'admin.projeto.org' {
      include gitosis
      include puppetmasterd
    }

Enviamos as novas configura��es para o servidor:

    git add classes/puppetmasterd.pp
    git add site.pp
    git commit
    git push origin master

Finalmente, no servidor, fazemos a �ltima atualiza��o do reposit�rio de configura��es do puppet na m�o:

    git --git-dir=/etc/puppet/.git/ pull /var/git/repositories/puppet.git && \
    git --git-dir=/etc/puppet/.git/ --work-tree=/etc/puppet/ checkout -f

Agora a nova regra do cron garantir� que o reposit�rio em `/etc/puppet` estar� sempre atualizado com o reposit�rio em `/var/git/puppet-conf`.

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`.

Stored Configs
--------------

Para utilizar [storeconfigs](http://reductivelabs.com/trac/puppet/wiki/UsingStoredConfiguration) via mysql, proceda com os seguintes comandos:

    apt-get install mysql-server
    mysqladmin -u root -p create puppet
    mysql -u root -p

Comandos para o mysql:

    GRANT ALL PRIVILEGES ON puppet.* TO puppet@"%" IDENTIFIED BY 'senha';
    flush privileges;

Linhas adicionadas no puppet.conf do nodo master, na se��o `[puppetmasterd]`:

    storeconfigs = true
    dbadapter    = mysql
    dbserver     = localhost
    dbuser       = puppet
    dbpassword   = senha

Refer�ncias
-----------

* [Puppet no Riseup](https://we.riseup.net/riseup+tech/puppet). 

Adicionando mais masters
========================

[Como adicionar mais puppetmasters](master).