Cuando tienes uno, dos, cuatro, siete servidores de Zimbra, es fácil gestionarlos y no inviertes un tiempo excesivo en realizar cambios. El problema viene, cuando tienes quince, veinte, treinta servidores de Zimbra, entonces empezamos a tener un problema, ya que los cambios en dichos sistemas operativos, o simplemente modificaciones en nuestros servidores de Zimbra, nos pueden ocasionar un trabajo excesivo.
Existen muchas utilidades para poder gestionar nuestros sistemas, una de ellas es Puppet (marioneta en inglés). En concreto he escogido la versión OpenSource, ya que la versión Enterprise, es gratuita hasta los 10 nodos y a partir de aquí hay que pagar.
Desde Puppet, podremos gestionar todos nuestro sistema operativos (Linux, BSD, W$, etc….) de una forma centralizada.
En este howto, simplemente realizo un cambio en el fichero de “hosts”, pero es un buen punto donde empezar. Para hacerlo más ameno, he dividido el procedimiento en tres fases:
Fase – 1
- Implementeación de puppet en Centos 6
Fase – 2
- Instalación del agente de puppet en Centos 7
- Conexión agente con nuestro puppet
Fase – 3
- Jugando con ficheros hosts
Fase – 1
Instalación de puppet en Centos 6
Añadimos los repositorios de puppet a nuestro servidor de CentOS e instalamos puppet
[syntax type=”php”]
[root@puppet ~]# rpm -ivh https://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-10.noarch.rpm
[root@puppet ~]# yum install -y puppet-server
[/syntax]
Arrancamos el servicio y lo habilitamos para que cuando se reinicie el servidor, puppet arranque con el equipo:
[syntax type=”php”]
[root@puppet ~]# service puppetmaster start
[root@puppet ~]# puppet resource service puppetmaster ensure=running enable=true
[/syntax]
Instalamos las herramientas que necesitará passanger y posteriormente instalamos passanger. Passanger es un módulo del apache, el cual nos permite interactuar con Puppet:
[syntax type=”php”]
[root@puppet ~]# yum install -y httpd httpd-devel mod_ssl ruby-devel rubygems gcc-c++ curl-devel zlib-devel make automake
[root@puppet ~]# gem install passenger –version 3.0.21
[/syntax]
Instalaremos openssl, ya que toda la comunicación es encriptada con certificados autogenerados, e instalaremos el módulo de passanger para apache:
[syntax type=”php”]
[root@puppet ~]# yum install -y openssl-devel
[root@puppet ~]# passenger-install-apache2-module
[/syntax]
Crearemos la estructura de directorios:
[syntax type=”php”]
[root@puppet ~]# mkdir -p /usr/share/puppet/rack/puppetmasterd
[root@puppet ~]# mkdir /usr/share/puppet/rack/puppetmasterd/public /usr/share/puppet/rack/puppetmasterd/tmp
[root@puppet ~]# cp /usr/share/puppet/ext/rack/config.ru /usr/share/puppet/rack/puppetmasterd/
[root@puppet ~]# chown puppet /usr/share/puppet/rack/puppetmasterd/config.ru
[/syntax]
Configuraremos nuestro virtualhost de apache, el cual cargará el módulo de passanger y los certificados:
[syntax type=”php”]
[root@puppet ~]# cat /etc/httpd/conf.d/puppetmaster.conf
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.21/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.21
PassengerRuby /usr/bin/ruby
PassengerHighPerformance On
PassengerMaxPoolSize 6
PassengerMaxRequests 1000
PassengerPoolIdleTime 600
Listen 8140
<VirtualHost *:8140>
SSLEngine On
SSLProtocol All -SSLv2
SSLCipherSuite HIGH:!ADH:RC4+RSA:-MEDIUM:-LOW:-EXP
SSLCertificateFile /var/lib/puppet/ssl/certs/puppet.ilba.cat.pem
SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/puppet.ilba.cat.pem
SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem
SSLCACertificateFile /var/lib/puppet/ssl/ca/ca_crt.pem
SSLCARevocationFile /var/lib/puppet/ssl/ca/ca_crl.pem
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars +ExportCertData
RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
DocumentRoot /usr/share/puppet/rack/puppetmasterd/public/
<Directory /usr/share/puppet/rack/puppetmasterd/>
Options None
AllowOverride None
Order Allow,Deny
Allow from All
</Directory>
</VirtualHost>
[/syntax]
Nos olvidaremos del servidor web que viene por defecto con puppet (puppetmaster) y dejaremos habilitado y corriendo apache:
[syntax type=”php”]
[root@puppet ~]# service puppetmaster stop
[root@puppet ~]# httpd -t
[root@puppet ~]# service httpd start
[root@puppet ~]# chkconfig puppetmaster off
[root@puppet ~]# chkconfig httpd on
[/syntax]
Verificaremos que el puerto que escucha puppet, lo haya levantado apache:
[syntax type=”php”][root@puppet syntax]# netstat -nlpt | grep 8140[/syntax]
Fase – 2
Instalación del agente de puppet en Centos 7
Como cliente, usaré CentOS 7. Añadiré los repositorios e instalaré el agente de puppet. Ya que puede ser que el servidor de destino no lo administremos nosotros, pero sí que lo gestionemos. Deshabilitaré este repositorio, para que se tenga que forzar el uso y no hayan errores.
[syntax type=”php”]
[root@node1 ~]# rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
[root@node1 ~]# sed -i ‘s/enabled=1/enabled=0/g’ /etc/yum.repos.d/puppetlabs.repo
[root@node1 ~]# yum install -y puppet –enablerepo=puppetlabs*
[/syntax]
Editaremos el fichero de configuración y le añadiremos los siguientes parámetros:
[syntax type=”php”]
[root@node1 ~]# vim /etc/puppet/puppet.conf
[agent]
…
server = puppet
report = true
pluginsync = true
[/syntax]
Habilitamos el agente de puppet, para que cuando se reinicie el servidor arranque con el sistema:
[syntax type=”php”][root@node1 ~]# systemctl enable puppet.service[/syntax]
Conexión agente con nuestro puppet
Una vez montado el servidor y el agente, hemos de solicitar el certificado desde el cliente:
[syntax type=”php”][root@node1 ~]# puppet agent –daemonize[/syntax]
Desde el servidor de Puppet, aceptaremos el certificado y lo firmaremos:
[syntax type=”php”]
[root@puppet ~]# puppet cert list
“node1.ilba.cat” (SHA256) FC:E9:9D:6B:B5:4A:23:F8:CE:0D:7F:D6:94:09:FD:48:18:4E:C7:42:59:2D:41:14:8F:07:1F:EB:1D:F9:1A:CE
[root@puppet ~]# puppet cert sign –all
Notice: Signed certificate request for node1.ilba.cat
Notice: Removing file Puppet::SSL::CertificateRequest node1.ilba.cat at ‘/var/lib/puppet/ssl/ca/requests/node1.ilba.cat.pem’
[/syntax]
Una vez hecha la gestión del certificado, verificaremos el correcto funcionamiento del agente contra nuestro servidor de puppet:
[syntax type=”php”]
[root@node1 ~]# puppet agent –test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for node1.ilba.cat
Info: Applying configuration version ‘1408006984’
Notice: Finished catalog run in 0.02 seconds
[/syntax]
Fase – 3
Jugando con ficheros hosts
Como práctica y para verificar que todo funciona correctamente, modificaremos el fichero hosts de nuestro cliente. Os dejo un esquema muy ilustrativo de cómo funciona el sistema.
Soy un entusiasta y un enamorado del VIM, de hecho recuerdo con nostalgia, la época cuando usaba muttng + vim. Lo que haremos a continuación, es añadir el fichero puppet.vim, para que al editar nuestros ficheros de configuración, nos muestre la sintaxis en colores, de esta manera, conseguiremos eliminar fallos tipográficos:
[syntax type=”php”]
[root@puppet ~]# mkdir -p ~/.vim/syntax
[root@puppet ~]# cd ~/.vim/syntax
[root@puppet syntax]# yum install -y wget
[root@puppet syntax]# wget http://downloads.puppetlabs.com/puppet/puppet.vim
[/syntax]
Creamos la estructura para nuestro modulo:
[syntax type=”php”]
[root@puppet ~]# mkdir /etc/puppet/modules/hosts
[root@puppet ~]# mkdir /etc/puppet/modules/hosts/files
[root@puppet ~]# mkdir /etc/puppet/modules/hosts/manifests
[root@puppet ~]# mkdir /etc/puppet/modules/hosts/templates
[root@puppet ~]# touch /etc/puppet/modules/hosts/files/hosts
[root@puppet ~]# touch /etc/puppet/modules/hosts/manifests/init.pp
[/syntax]
Creamos el site:
[syntax type=”php”]
[root@puppet ~]# vim /etc/puppet/manifests/site.pp
import “nodes”
[/syntax]
Creamos el node, en el cual añadiremos la clase “hosts”:
[syntax type=”php”]
[root@puppet ~]# vim /etc/puppet/manifests/nodes.pp
node oscarmas {
include hosts
}
node ‘node1.ilba.cat’ inherits oscarmas {
}
[/syntax]
Defimos el manifest:
[syntax type=”php”]
[root@puppet ~]# vim /etc/puppet/modules/hosts/manifests/init.pp
class hosts {
file { “/etc/hosts”:
owner => root,
group => root,
mode => 644,
content => template(“hosts/hosts”),
}
}
[/syntax]
Y creamos el fichero de hosts, que queremos que se aplique a nuestro servidor de demo:
[root@puppet ~]# vim /etc/puppet/modules/hosts/templates/hosts
[syntax type=”php”]
127.0.0.1 localhost
192.168.250.10 puppet.ilba.cat puppet
192.168.250.21 node1.ilba.cat node1
192.168.250.22 node2.ilba.cat node2
192.168.250.23 node3.ilba.cat node3
[/syntax]
La estructura nos ha de quedar de la siguiente manera:
[syntax type=”php”]
[root@puppet ~]# cd /etc/puppet/modules/hosts/
[root@puppet hosts]# yum install tree –y
[root@puppet hosts]# tree –charset=ASCII
[/syntax]
Y ahora ya podemos verificar el funcionamiento. Desde el servidor de puppet, verificaremos que no nos hayamos equivocado en la sintaxis:
[syntax type=”php”][root@puppet hosts]# puppet parser validate /etc/puppet/manifests/nodes.pp[/syntax]
Revisaremos el fichero de hosts de nuestro cliente de puppet
[syntax type=”php”]
[root@node1 ~]# cat /etc/hosts
127.0.0.1 localhost
192.168.250.10 puppet.ilba.cat puppet
192.168.250.21 node1.ilba.cat node1
[/syntax]
Cargamos el agente:
[syntax type=”php”][root@node1 ~]# puppet agent –test –verbose –debug[/syntax]
Y ya podemos ver los cambios realizados
[syntax type=”php”]
[root@node1 ~]# cat /etc/hosts
127.0.0.1 localhost
192.168.250.10 puppet.ilba.cat puppet
192.168.250.21 node1.ilba.cat node1
192.168.250.22 node2.ilba.cat node2
192.168.250.23 node3.ilba.cat node3
[/syntax]
Espero que os sirva de ayuda para implementar tanto Zimbra, como para gestionar vuestras infraestructuras.



















Leave a Reply