Puppet: la herramienta de los administradores de sistemas

Actualmente no es inusual que un desarrollo web opere sobre dos o más servidores.  Por ejemplo utilizando un esquema de un servidor de base de datos principal más replicas por detrás de un grupo de uno o varios frontales web.

Gestionar estos servidores manualmente puede llegar a ser un verdadero quebradero de cabeza, tanto por la maquina en sí misma: actualizaciones de software, creación de usuarios, gestión de permisos; como por la actualización de ficheros web en el caso de los frontales o la configuración de las réplicas en la parte base de datos.

Los cambios manuales aumentan la probabilidad de cometer un error. Los administradores de sistemas más avezados cuentan con scripts bash que ayudan en la automatización de determinadas tareas, pero no son perfectos y muy probablemente conlleven un coste de desarrollo en sí mismos.

Afortunadamente hace algunos años existen herramientas de gestión de la configuración de servidores. Por nombrar alguno tenemos Chef, Ansible, Salt y el que vamos a mostrar aquí, Puppet.

Introduciendo Puppet

puppet logo

La característica más destacable de Puppet es que como administradores, describimos cómo queremos que un servidor esté en un momento dado en el tiempo y Puppet, mediante su agente instalado en la máquina, hace lo necesario, (instalar, borrar, modificar, configurar), para conseguirlo.

Queremos, por ejemplo, que exista el usuario Zabbix, que el servicio de MySql esté instalado y funcionando, que en el listado cron existan dos tareas programadas para ejecutarse a una hora concreta, etc.

Todo ello gestionado desde un servidor central que se encarga de entregar un catálogo de instrucciones a los servidores que lo soliciten. Obviamente estos servidores cuentan con un cliente Puppet y el servidor cuenta con autorizaciones para saber qué servidores tienen acceso a estos catálogos.

Configurar con Puppet

Por ejemplo, para configurar un frontal web necesitaríamos algo del estilo:

[sourcecode]
#
# Indicamos que queremos un servidor web Apache
#
class { 'apache':
}
#
# Necesitamos que estén instalados y
# activos los módulos actions, rewrite
# y headers
#
class { 'apache::mod::actions': }
class { 'apache::mod::rewrite': }
class { 'apache::mod::headers': }
#
# Configuramos un servidor virtual dentro
# de apache para que responda a las solicitudes web.
#
apache::vhost { 'midominio.es':
  servername	=> 'midominio.es',
  port          => '80',
  docroot       => '/var/www/midominio.es/web',
  docroot_owner => 'www-data',
  docroot_group => 'www-data',
  serveraliases => [
  	'www.midominio.es',
  ],
  custom_fragment => 'AddType application/x-httpd-php .php',
  logroot => '/var/www/midominio.es/log',
  override => 'all',
}
#
# Queremos que la versión de PHP activa sea la 5.6
# y que utilizemos FPM.
# Aprovechamos y configuramos alguna de las opciones
# de php.ini como la memoria, timezone, etc.
# Al igual que en el Apache queremos que php tenga
# cargados unos módulos concretos.
#
class { '::php::globals':
	php_version => '5.6',
}
class { '::php':
  ensure       => present,
  manage_repos => true,
  fpm          => true,
  dev          => true,
  composer     => true,
  pear         => true,
  phpunit      => false,
  settings   => {
    'PHP/max_execution_time'  => '90',
    'PHP/max_input_time'      => '300',
    'PHP/memory_limit'        => '64M',
    'PHP/post_max_size'       => '32M',
    'PHP/upload_max_filesize' => '32M',
    'PHP/max_input_vars' => '5000',
    'Date/date.timezone'      => 'Europe/Madrid',
  },
  extensions => {
  	mcrypt => {},
  	apc => {},
  	mysql => {},
  	gd => {},
  	mbstring => {},
  }
}
#
# También indicamos que exista un proceso
# fastcgi para el php-fpm activo.
#
apache::fastcgi::server { 'php':
  host       => '127.0.0.1:9000',
  timeout    => 15,
  flush      => false,
  faux_path  => '/var/www/php.fcgi',
  fcgi_alias => '/php.fcgi',
  file_type  => 'application/x-httpd-php'
}
[/sourcecode]

De esta forma, gracias a Puppet no necesitamos realizar ninguna acción con apt-get/yum ni empezar a modificar ficheros de configuración de los servicios que estamos instalando.

Otra ventaja de este sistema declarativo es que nos abstrae de la plataforma final en la que esté instalado el agente. Por ejemplo, puedo tener un frontal en Ubuntu, otro en CentOS y un tercero en Debian. Puppet sabrá como lidiar con repositorios y herramientas de instalación adecuadas para que al final el servidor contenga lo que necesitamos.

Una facilidad que nos proporciona Puppet de cara al SEO es sin duda la mejora del WPO. Por ejemplo, si detectamos que los frontales actuales de nuestro sitio web soportan una gran cantidad de visitas, podemos crear nuevas instancias y configurar todo el software web en un momento de manera automática. Asegurándonos que serán idénticas a las actuales. Así evitamos problemas de configuración asociados a las diferencias de versiones.

Próximamente ampliaremos este ejemplo para conseguir ver un stack LAMP completo del servidor para un dominio web que pueda ser fácilmente ampliable en horizontal.