Deploy de Servidores com Puppet
O Puppet já nos mostrou que serve para configurar vários clientes de uma vez só, que serve para configurar alguns clientes com configurações específicas e que permite separarmos por arquivos as configurações.
Mas como Sysadmins o que nos importa é como facilitar nosso trabalho e manter a infraestrutura de uma empresa da forma mais simples possível. Desde pequenos ajustes em múltiplos servidores até a configuração completa de um servidor.
Hoje vamos mostrar como ter um servidor Web disponível de forma rápida para substituir um servidor que por algum motivo tenha parado de funcionar.
Primeiro temos que ter arquivos de modelo para poder levantar as configurações necessárias, todos nós sabemos quase tudo no Linux são arquivos de configuração e quase sempre texto plano, o que permite uma máxima personalização dos conteúdos.
Esses arquivos podem ser tanto cópias dos arquivos de uso como modelos para serem alterados por comandos. Hoje não vou falar dos módulos do Puppet pois dependem de ter a linguagem Ruby instalada e isso vou deixar pra depois.
Vamos presumir que temos a seguinte estrutura:
Nosso servidor Firewall recebe as conexões na porta 80 e redireciona para o servidor Web na DMZ. O servidor Web recebe o diretório /var/www via NFS do servidor de arquivos, ou seja, apenas o servidor http e as configurações ficam no servidor Web, o pesado do trabalho que são os sites ficam em armazenamento externo que pode inclusive vir de um storage.
Assim temos uma máquina que precisa de ter disponibilidade e ao mesmo tempo configurações corretas para funcionar. Vamos imaginar que você previu possíveis problemas com o hardware e por não ter outro servidor, fez um plano de contingência que supre emergencialmente a necessidade de um servidor Web, isso mostra que você vale o quanto te pagam :-P.
Precisamos então ter arquivos de configuração do Apache, lista dos módulos ativos e modelos para os sites que estarão ativos, além do nfs e de garantir a montagem automática do compartilhamento, precisamos ter o mesmo IP que o servidor anterior possuía para garantir que o redirecionamento irá funcionar.
Vamos as configurações:
Primeiro vamos criar os arquivos de modelo e saber quais módulos temos que instalar e ativar.
No servidor Web atual digite:
# a2dismod
Sem parâmetro nenhum o servidor mostra quais módulos estão ativos no momento, você vai ver algo tipo:
root@webserver:~# a2dismod
Your choices are: alias auth_basic authn_file authz_default authz_groupfile authz_host authz_user autoindex cgi deflate dir env include mime negotiation php5 reqtimeout rewrite rpaf setenvif ssl status suexec
Which module(s) do you want to disable (wildcards ok)?
Como alguns desses módulos não são instalado automaticamente com o apache, devemos instalar os respectivos pacotes.
Vamos criar no puppet os manifestos.
# cd /etc/puppet/manifests
# vi webserver.pp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] } class install_apache { $pacotes = [ "apache2", "libapache2-mod-php5", "libapache2-mod-rpaf", "nfs-common" ] package { $pacotes: ensure => "installed" } } class enable_modules { exec { 'a2enmod alias auth_basic authn_file authz_default authz_groupfile authz_host authz_user autoindex cgi deflate dir env include mime negotiation php5 reqtimeout rewrite rpaf setenvif ssl status suexec': } } class update_files { file { '82c.bd8.myftpupload.com': path => '/etc/apache2/sites-available/82c.bd8.myftpupload.com', source => 'puppet:///files/82c.bd8.myftpupload.com' } file { 'images.82c.bd8.myftpupload.com': path => '/etc/apache2/sites-available/images.82c.bd8.myftpupload.com', source => 'puppet:///files/images.82c.bd8.myftpupload.com' } file { 'dados.82c.bd8.myftpupload.com': path => '/etc/apache2/sites-available/dados.82c.bd8.myftpupload.com', source => 'puppet:///files/dados.82c.bd8.myftpupload.com' } } class enable_sites { exec { 'a2ensite 82c.bd8.myftpupload.com dados.82c.bd8.myftpupload.com images.82c.bd8.myftpupload.com': } } class change_server { exec { 'sed -i s/"address 172.16.1.101"/"address 172.16.1.252"/ /etc/network/interfaces': } exec { 'service networking restart': } exec { 'ifconfig eth0 172.16.1.252/24 ; route add default gw 172.15.1.254': } exec { 'mount -t nfs nfs-server.local:/sites /var/www/sites/': } exec { 'echo "nfs-server.local:/sites /var/www/sites nfs defaults,hard,bg 0 0" >> /etc/fstab': } exec { 'service apache2 restart': } } |
Após copiar os arquivos dos sites para o diretório /etc/puppet/files edite o arquivo site.pp com o seguinte conteúdo:
# vi site.pp
import ‘webserver.pp’
Agora edite o arquivo hosts.pp com o seguinte conteúdo:
# vi hosts.pp
node ‘webserver1’ {
include install_apache
include enable_modules
include update_files
include enable_sites
include change_server
}
Agora reinicie o serviço:
# /etc/init.d/puppetmaster restart
Agora você pode ter imagens prontas do sistema básico e basta instalar a imagem (já com o cliente do puppet) e quando o servidor detectar o cliente ele vai:
– instalar os pacotes
– habilitar os módulos
– copiar os arquivos de configuração
– habilitar os sites
– alterar o ip
– montar o compartilhamento via nfs
– reiniciar o apache
Assim podemos ter templates de serviços prontos para substituir algum servidor que apresentar falhas, mesmo que temporariamente ou até para balanceamento de carga, dependendo das configurações ou da sua necessidade.
Não se esqueçam de curtir nossa página no Facebook, comentar nos artigos até pra fazer um feedback e sugerir algum tópico.