<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Woop! &#187; Administración Centralizada</title>
	<atom:link href="http://woop.es/category/administracion-centralizada/feed/" rel="self" type="application/rss+xml" />
	<link>http://woop.es</link>
	<description></description>
	<lastBuildDate>Thu, 11 Jun 2009 14:20:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ejemplo práctico Cfengine: Actualización masiva de PHP</title>
		<link>http://woop.es/2009/01/ejemplo-practico-cfengine-actualizacion-masiva-de-php/</link>
		<comments>http://woop.es/2009/01/ejemplo-practico-cfengine-actualizacion-masiva-de-php/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 10:41:17 +0000</pubDate>
		<dc:creator>Santi Saez</dc:creator>
				<category><![CDATA[Administración Centralizada]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cfengine]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://woop.es/?p=25</guid>
		<description><![CDATA[Tengo prácticamente acabado un post a modo de introducción a los sistemas de administración centralizada + automatización (Cfengine, Puppet, Spacewalk, etc..), mientras tanto iré comentado casos reales donde estos sistemas me han parecido realmente útiles e interesantes. A modo de ejemplo, empiezo explicando -a grandes rasgos- el método que utilizamos en Hostalia para actualizar PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Tengo prácticamente acabado un post a modo de introducción a los <strong>sistemas de administración centralizada</strong> + <strong>automatización</strong> (Cfengine, Puppet, Spacewalk, etc..), mientras tanto iré comentado <strong>casos reales</strong> donde estos sistemas me han parecido realmente útiles e interesantes. A modo de ejemplo, empiezo explicando -a grandes rasgos- el método que utilizamos en Hostalia para actualizar PHP en la plataforma de alojamiento compartido, un cambio que afecta a más de 60.000 dominios distribuidos en unos cuantos cientos de servidores.</p>
<p>Ante un escenario así, donde la máxima de las leyes de Murphy siempre se cumplirá, no podemos actualizar todos los servidores en bloque y tampoco podemos actualizarlos manualmente uno por uno sin saber que pasará: necesitamos un método flexible, totalmente automatizado, que nos alerte de posibles errores antes de que lleguen al usuario, con un método sencillo de rollback para volver al estado anterior a la actualización, y por supuesto, todo ello <strong>sin cortes y totalmente transparente para los usuarios</strong>. Aquí es donde Cfengine nos ayuda día a día en este tipo de tareas <img src='http://woop.es/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Vamos &#8220;directos al grano&#8221; y analizamos el <a href="http://woop.es/wp-content/uploads/2009/01/cfengine-testing.txt">fragmento de la configuración de Cfengine</a> que se encarga de esta tarea:</p>
<p>- La definición de clases o grupos es una de las características mas potentes a la hora de trabajar con cualquier sistema de administración centralizada, <strong>permiten agrupar servidores sobre los que realizar una acción común</strong>, por ejemplo: podemos tener servidores bajo clases con nombre &#8220;PHP4&#8243;, &#8220;PHP5&#8243;, etc.. para diferenciar  servidores que  ejecutan diferentes versiones de PHP.</p>
<p>- Cfengine define internamente una serie de clases (Sistema Operativo, arquitectura, versión del kernel, distribución Linux, etc&#8230;), permitiendo además que el usuario pueda gestionar nuevos grupos y realizar operaciones sobre ellas: sumas de grupos, exclusiones, etc&#8230; por ejemplo, podemos agrupar las clases PHP4 y PHP5 bajo la clase PHP, para realizar una acción común sobre ellas, por ejemplo sincronizar el fichero de configuración <strong>php.ini</strong> en todos las máquinas que pertenezcan a este grupo. Recomiendo la lectura del documento de <a href="http://sial.org/howto/cfengine/classes/">Jeremy Mates</a> sobre las clases en Cfengine, <strong>una buena definición de grupos/clases será un punto clave para el éxito de cualquier sistema de administración centralizada</strong>.</p>
<p>- Para simplificar, en este ejemplo vamos a trabajar únicamente con dos clases: <strong>PHP5 </strong>y<strong> TESTING</strong>. El grupo &#8220;PHP5&#8243;, como podemos intuir, contiene el grupo de servidores que ejecutan la versión 5 de PHP,  y la clase &#8220;TESTING&#8221; agrupa aquellas máquinas donde vamos a actualizar PHP de forma &#8220;controlada&#8221; (desde la versión 5.2.6 a la 5.2.8, nos saltamos la versión 5.2.7 ya que introducía una regresión en el tratamiento de las &#8220;magic quotes&#8221;). De la combinación de estos dos grupos nacen dos nuevos entornos: <strong>PHP5.!TESTING</strong> con servidores que seguirán ejecutando la versión 5.2.6 y <strong>PHP5.TESTING</strong> que tendrá los servidores que serán actualizados a la versión 5.2.8. En Cfengine el operador &#8220;.&#8221; suma las máquinas de una clase y &#8220;!&#8221; es el operador de negación.</p>
<p>- En Cfengine es posible agregar servidores a grupos de muchas formas, una de ellas es con la directiva <strong>FileExists</strong>. En el ejemplo, tras hacer un <strong>touch</strong> del fichero <strong>/etc/cfengine/testing</strong> el servidor pasará a formar parte de la clase &#8220;testing&#8221;, es decir, será un candidato a actualizar desde la versión 5.2.6 a 5.2.8 de PHP &#8220;automágicamente&#8221; <img src='http://woop.es/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>- A partir de aquí tendremos <strong>dos flujos de ejecución en Cfengine</strong>: máquinas que no se verán afectadas por la actualización y las que pasarán a actualizar PHP. En cualquier momento es posible pasar de un estado a otro, con tan solo crear o borrar el fichero <strong>/etc/cfengine/testing</strong>.</p>
<p>- ¿Que pasa si una máquina entra en estado &#8220;<strong>testing</strong>&#8221; Cfengine instalará la nueva versión del módulo DSO para Apache de PHP, sustituyendo para ello el fichero <strong>libphp5.so</strong>. Para mayor flexibilidad en Hostalia compilamos PHP, así no dependemos de paquetes/compilaciones de terceros, y además así podemos personalizar las funcionalidades, aplicar parches, etc.. En cualquier caso, el proceso de actualización podría ser cualquier <strong>acción</strong>: actualizar PHP con el módulo de gestión de paquetes del propio Cfengine, con independencia de si estamos sobre una Debian, CentOS, Solaris, FreeBSD, etc..</p>
<p>- Además, si está definida la clase <strong>testing</strong> se modifica la configuración de PHP para enviar los errores por syslog a una máquina remota, donde los logs están centralizados en un servidor con <strong>syslog-ng</strong>. En un escenario de shared hosting con gran volumen de dominios, es muy habitual que PHP esté constamente reportando errores, por lo que algunos patrones los ignoramos directamente (<a href="http://woop.es/wp-content/uploads/2009/01/syslog-ng.txt">ver fragmento con las regex</a>), para dedicar la atención a aquellos que lo necesitan y pueden llegar a ser realmente graves. Desde un único punto podemos analizar &#8220;en vivo&#8221; lo que ocurre en las máquinas en estado &#8220;testing&#8221;, dejando a un lado las máquinas estables que tienen todavía la versión anterior de PHP. Por defecto, PHP envía a syslog los mensajes con el servicio y prioridad <strong>user.notice</strong> (ver la función <strong>php_syslog</strong> en <strong>main/main.c</strong>), si la queremos modificar el parche para hardening de PHP <a href="http://www.hardened-php.net/suhosin/configuration.html#logging_configuration">Suhosin permite personalizar este comportamiento de logging</a>.</p>
<p>- Solo si se realiza cualquiera de las dos acciones anteriores (copiar el fichero <strong>libphp5.so</strong> y/o <strong>php.ini)</strong> se define la variable <strong>restart_apache</strong> en Cfengine: el resto de servidores no se verán afectados.</p>
<p>- Si la variable <strong>restart_apache </strong>está definida<strong>, </strong>se hace un <a href="http://httpd.apache.org/docs/2.0/stopping.html#graceful">reinicio graceful</a> de Apache para evitar cerrar las conexiones establecidas en ese momento. Los procesos que estén con la versión anterior de PHP una vez terminen de ejecutarse pasarán a tener la nueva versión sin corte, esto es necesario para evitar cualquier corte en el lado cliente.</p>
<p>Al tener los errores de PHP de la nueva plataforma centralizados en un único punto es muy sencillo detectar cualquier problema y automatizar acciones ante determinados errores, por ejemplo: si aparece la cadena &#8220;segmentation fault&#8221; en los logs de Apache, podemos forzar un rollback automático a la versión anterior de PHP, con alguna herramienta de análisis de logs tipo <strong>swatch</strong>, etc.. con tan solo borrar el fichero <strong>/etc/cfengine/testing</strong>.</p>
<p>Cuando consideremos el cambio lo suficientemente maduro como para aplicarlo a todos los servidores en producción, podremos llevarlo acabo con unos <a href="http://woop.es/wp-content/uploads/2009/01/cfengine-testing.txt">pequeños cambios</a> en la configuración de Cfengine, básicamente borrando las referencias a la clase &#8220;testing&#8221;.</p>
<p><strong>Conclusión</strong>: el sistema de clases/grupos de Cfengine es uno de sus puntos mas potentes, en este caso nos ha proporcionado un método de actualización + rollback sencillo para actualizar un componente en un determinado grupo de servidores, sin afectar al resto de servidores.. un método flexible, fiable y sin cortes para una operación crítica, todo ello con apenas 20 líneas de código y dedicándole unos pocos minutos de atención <img src='http://woop.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://woop.es/2009/01/ejemplo-practico-cfengine-actualizacion-masiva-de-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
