Introducción a Cfengine

Cfengine es una herramienta que permite automatizar la gestión de sistemas desde un único punto utilizando un lenguaje de alto nivel basado en políticas de configuración con su propia sintaxis.

Su autor, Mark Burgess, empezó a desarrollarlo en 1993 en la Universidad de Oslo con el objetivo de crear un framework portable para gestionar las diferentes variantes de UNIX basándose en sus propias tesis sobre la convergencia de sistemas y la “Promise Theory“. A día de hoy, es la solución para centralizar la gestión de sistemas más extendida y empresas como Facebook, Google y NASA lo utilizan para controlar infraestructuras con más de 100.000 servidores.

Es software libre (licencia GPL) y desde la versión 3.0 (junio del 2008) existe una distribución comercial, Nova, que cuenta con soporte desde la empresa fundada por Mark Burgess, Cfengine AS. Como alternativas a Cfengine tenemos Chef, Quattor, Puppet, etc. siendo este último el más popular.

Ventajas de utilizar Cfengine

La automatización aporta valor cuando el número de servidores a controlar es importante (más de 10-20) y todos ellos comparten algo en común. De no ser así, no tiene mucho sentido utilizar este tipo de herramientas.

Cfengine es una herramienta pensada para solucionar problemas comunes a la gestión de un centro de datos, estas son algunas de sus principales ventajas:

Centralizar. Cfengine permite automatizar la gestión de toda una infraestructura Linux desde un único punto y con una única herramienta, esto lo convierte en una solución escalable: el esfuerzo necesario para gestionar 1 máquina es el mismo que para 100.000.

- Reducir errores. La automatización elimina tareas repetitivas y como consecuencia directa se evitan errores humanos reduciendo incidencias y mejorando la estabilidad de los servicios. El diseño de Cfengine basado en la “Promise Theory” permite propagar cambios de forma fiable y con garantías.

- Ahorrar tiempo. Al automatizar tareas con Cfengine ganamos tiempo de dos formas: 1) se reduce el tiempo necesario para la puesta en marcha de nuevos servicios y aplicar cambios -aquí es donde nace el concepto DevOps- y 2) al evitar tener que entrar vía SSH a los servidores para “trabajar” manualmente el administrador cuenta con más tiempo para su verdadero trabajo: mejorar la infraestructura evitando que errores conocidos vuelvan a ocurrir.

Documentación. El trabajo del administrador de sistemas queda “auto-documentado“: cada regla en Cfengine define una tarea. Generalmente la configuración de Cfengine se combina con un sistema de control de versiones (Git, Subversion, etc.), por lo que tendremos un registro completo de todos los cambios realizados históricamente en la infraestructura, información que podemos “reciclar” con herramientas tipo “cf-know” y convertirlas en documentación. Cuando entra un nuevo empleado leyendo este código tendría una idea actualizada de la configuración de los sistemas.

¿Qué se puede hacer con Cfengine?

Estos son algunos ejemplos de las diferentes tareas que se pueden llevar a cabo con Cfengine, acompañas de porciones de código para ir familiarizándonos con las sintaxis del lenguaje:

- Copiar ficheros: podemos distribuir cualquier tipo de fichero (configuración, binario, etc.) desde el servidor central de políticas de Cfengine a cualquier número de máquinas (a todas o a un grupo determinado). En una infraestructura Linux es muy común que todos los servidores mantengan actualizada la misma configuración de SSH (sshd_config y authorized_keys), resolución DNS (resolv.conf), etc. En este ejemplo, se distribuye la configuración de “mod_status” para Apache en todos aquellas máquinas que pertenezcan a un determinado grupo (“frontend”), y solo si, se realiza la copia se fuerza un reinicio del servidor web para que entre en funcionamiento la nueva configuración:

copy:

frontend::
	# Configuracion de mod_status para Apache
	$(master_cfinput)/cfengine/apache/mod_status.conf
	dest=/etc/httpd/conf.d/mod_status.conf
	server=$(policyhost)
	trustkey=true
	type=binary
	mode=0644
	define=service_httpd_graceful

- Comprobar y establecer permisos y propietario/grupo en ficheros/directorios. En este ejemplo forzamos a que el directorio /tmp tenga la configuración de seguridad recomendada en UNIX, permisos 777 junto al “sticky bit” y “root” como propietario y grupo:

files:

any::
	/tmp
	mode=1777
	owner=root
	group=root

- Edición de ficheros: es uno de los módulos más potentes de Cfengine que nos permite realizar cualquier tipo edición sobre ficheros: reemplazar una cadena, comentarla, eliminar una línea, agregar un texto, etc. Ejemplo: en todas las máquinas con CentOS-5 se comentan las líneas que contengan “requiretty” en /etc/sudoers:

editfiles:

centos_5::
	{ /etc/sudoers
		SetCommentStart '#'
		CommentLinesMatching '.*requiretty.*'
	}

- Borrar ficheros: podemos borrar ficheros temporales, eliminar aquellos que por seguridad no queremos que estén presentes, etc. En este ejemplo se borran aquellos ficheros del directorio “/var/spool/repackage” con más de un mes de antigüedad:

tidy:

any::
	# Borrar RPMs temporales para rollback de operaciones con Yum
	/var/spool/repackage
	pattern=*
	recurse=inf
	links=stop
	rmdirs=false
	age=30
	inform=off

- Ejecución de comandos: se utiliza básicamente en dos escenarios: 1) ejecutar un comando si una determinada condición/clase está definida y 2) definir una clase tras la condición de salida de un script. En este primer ejemplo, si la clase “service_sshd_restart” está definida se realiza un reinicio del servicio SSH (la clase “service_sshd_restart” se puede definir, por ejemplo, si se realiza un cambio en el fichero de configuración de OpenSSH):

copy:

any::
	$(master_cfinput)/cfengine/sshd/sshd_config
	dest=/etc/ssh/sshd_config
	server=$(policyhost)
	trustkey=true
	type=binary
	mode=0600
	define=service_sshd_restart

shellcommands:
	service_sshd_restart::
		"/etc/init.d/sshd restart"

En este segundo ejemplo ejecutamos el script “halfduplex.sh” (detecta interfaces en half-duplex) y si el código de retorno de este script es “cero” se define la clase “halfduplex”, posteriormente si dicha clase está definida se genera una alerta que le llegará al administrador (por email, syslog, etc.), el código en lenguaje Cfengine:

classes:
	# Clase para detectar si existen interfaces en Half-Duplex
	halfduplex = ( ReturnsZero("/root/scripts/halfduplex.sh") )

alerts:
	!halfduplex::
		"ERROR! El servidor tiene interfaces de red en Half-Duplex!"

- Gestión de paquetes software RPM y DPKG. Cfengine cuenta con un módulo con el que podemos realizar tareas básicas relacionadas con la gestión de paquetes de software: instalar, borrar, actualizar, etc. abstrayendo el sistema operativo sobre el que se ejecuta el agente (Linux, FreeBSD, etc.) y el gestor de paquetes utilizado (RPM, DPKG, etc.). En este ejemplo, nos aseguramos de que todas las máquinas tengan el paquete “rsync” instalado y que las máquinas del cluster “backend” el compilador GCC no esté instalado:

packages:

any::
	rsync
	action=install

!backend::
	gcc
	action=remove
	version=0.1
	cmp=ge

- Gestión de procesos y servicios del sistema. Podemos definir políticas en Cfengine para gestionar que servicios se ejecutan al arrancar la máquina, comprobar que un determinado proceso se está ejecutando (monitorización) y que no tenga más de un determinado número de hijos, memoria consumida, tiempo en ejecución, etc. En este ejemplo nos aseguramos de que el servicio “cron” se ejecuta al arrancar la máquina y que “cups” está deshabilitado:

classes:
	# Clase para comprobar si esta DESACTIVADO el servicio "cups"
	service_cups_off = (ReturnsZero("/sbin/chkconfig --level 3 cups"))

	# Clase para comprobar si esta ACTIVADO el servicio "crond"
	service_crond_on = (ReturnsZero("/sbin/chkconfig --level 3 crond"))

shellcommands:
	service_cups_off::
		"/sbin/chkconfig --del cups ; /etc/init.d/cups stop"

	!service_crond_on::
		"/sbin/chkconfig crond on ; /etc/init.d/crond start"

Todas estas tareas se pueden aplicar con independencia del sistema operativo (Solaris, FreeBSD, etc.) y distribución Linux. Es decir, si añadimos una regla para instalar el paquete “sudo” en todos los servidores, Cfengine se encargará de “traducir” el código en cada servidor y ejecutar los comandos corrrespondientes (en Debian se utilizaría APT, en RHEL se usaría Yum, etc.).

Cfengine es una herramienta sencilla de manejar pero con una curva de aprendizaje importante. La introducción ha sido algo extensa pero necesaria para comprender las ventajas y familizarnos con los conceptos de la automatización en Linux. Los siguientes posts serán más prácticos y al final acabaremos montado un laboratorio que se podrá gestionar en su totalidad desde un único punto con Cfengine :)

This entry was posted in Linux, System Automation and tagged . Bookmark the permalink.
  • http://www.anacondawebhosting.com/ anacondaweb

    Buena información.

  • jordi

    Muy útil, y muy bien explicado