##############################################################

# Ejercicio con CFEngine (Ubuntu)

# Talleres WALC (Gestión de Redes)

#

# Carlos Vicente 

# Servicios de Red - Universidad de Oregon

##############################################################



* Objetivos:

----------------

 - Utilizar el servidor del laboratorio como repositorio de configuraciones 

 - Iniciar un repositorio en Subversion con:

     - Configuraciones para cfengine

     - Configuraciones para servicios


 - Gestionar la configuración de los siguientes servicios:

     - ntp

     - aliases


* Requisitos:

----------------

 - Paquete cfengine2 instalado (apt-get install cfengine2)

 - Paquete subversion instalado (apt-get install subversion)


* Ubicación de Archivos:

-----------------------


http://server/track4/presentaciones/Ejercicio_cfengine/


***************************************************************************************

* Instrucciones 

***************************************************************************************


En el servidor:

 - Ir al directorio /etc/cfengine (/var/lib/cfengine2/inputs)

 - Crear los siguientes archivos incluídos en este ejercicio:


cfservd.conf

update.conf

cf.common

cf.aliases

cfagent.conf


En los clientes:


  *) Solamente es necesario tener una copia del archivo update.conf en /var/lib/cfengine2/inputs


  *) Copiar la llave pública del cliente en el servidor:


cd /var/lib/cfengine2/ppkeys

scp localhost.pub root@server:/var/lib/cfengine2/ppkeys/root-<su-direccion-IP>.pub


   *) cfagent -Kqv


***************************************************************************************

 * Integración con Subversion (Control de Versiones)

***************************************************************************************


 Repaso de comandos principales de Subversion (SVN):

svn checkout - Hacer una copia del repositorio en el directorio local

svn update - Actualizar al copia local

svn status - Revisar el estatus de los archivos locales

svn diff - Revisar las diferencias entre el repositorio y la copia local

svn commit -  Actualizar el repositorio con los cambios realizados localmente


Instrucciones.

-------------------


En el servidor:


 *) Crear un repositorio Subversion:


    mkdir /usr/local/svn

    svnadmin create /usr/local/svn/cfengine


 *) Crear directorios temporales para importar el repositorio:


    mkdir -p /tmp/master/cfengine/inputs

    mkdir -p /tmp/master/services/aliases


 *) Copiar las configuraciones de cfengine:


    cp /etc/cfengine/* /tmp/master/cfengine/inputs


 *) Importar el directorio temporal en el repositorio Subversion


    svn import /tmp/master file:///usr/local/svn/cfengine

   ( abrirá un editor para escribir una nota explicatoria.  Se puede Ignorar. )


 *) Crear una copia del repositorio donde se van a ir bajando las actualizaciones


    svn checkout file:///usr/local/svn/cfengine/ /var/lib/cfengine2/master


 *) Crear un cron job para mantener la copia del repositorio actualizada


    vi /etc/cron.d/cfengine


    * * * * * root /usr/bin/svn update --quiet /var/lib/cfengine2/master



En el servidor y los clientes:



 *) Ejecutar el agente manualmente para verificar su operación


    cfagent -Kqv


 *) Verificar que el archivo /etc/aliases es ahora el que queríamos


 *) Activar los "daemons" de cfengine

 

    vi /etc/default/cfengine2


        RUN_CFSERVD=1

RUN_CFEXECD=1

RUN_CFENVD=1


    /etc/init.d/cfengine2 start


 *) Es posible configurar Subversion para permitir actualizaciones remotas (vía https con Apache).

    Así, el administrador puede elaborar sus cambios en su estación de trabajo, y luego hacer un

    "check-in" de sus cambios, con lo cual el servidor actualizará su copia cada minuto, y éstos

    cambios se reflejarán en las máquinas cliente.

    

    En el servidor:


*) Instalar la biblioteca de Subversion para Apache:


apt-get install libapache2-svn


*) Actualizar el archivo /etc/apache2/httpd.conf con el siguiente bloque:

  (ojo: preferiblemente hacerlo sobre SSL)


<Location /cfengine>

DAV svn

    SVNPath /usr/local/svn/cfengine

    AuthType Basic

    AuthName "Autenticacion Subversion"

    AuthUserFile /etc/apache2/passwords

    require valid-user

</Location>


*) Crear el usuario y password para proteger el repositorio:


htpasswd -c /etc/apache2/passwords walc


*) Ajustar los permisos del repositorio para que el usuario de Apache pueda escribir:


sudo chown -R www-data:root /usr/local/svn/cfengine/


    En el cliente:


cd /home/walc

    svn checkout http://server/cfengine configuraciones


    Crear un archivo de aliases válido:

    (copiar y editar el /etc/aliases actual para agregar un alias)

    

cp /etc/aliases /home/walc/configuraciones/services/aliases/aliases

    vi /home/walc/configuraciones/services/aliases/aliases

  

     ej: agregar una línea con:


su-nombre: walc


     Luego:


cd /home/walc/configuraciones

svn update   (para asegurarse de que está trabajando con la copia más reciente)

OJO: Si el update marca conflicto "C":

Editar el archivo para arreglar el conflicto

Borrar las líneas con "<<<<<<" y "========" y ">>>>>>>>"

svn resolved services/aliases/aliases

svn commit -m "Agregando nombre"

(esperar un minuto para que la copia del servidor se actualice)

    

cfagent -Kqv


     Por último, verificar que los cambios se han efectuado en su máquina



* Conclusiones:

-----------------------

  Este ejercicio muestra un caso muy sencillo pero poderoso que permite desarrollar una instalación más completa. Utilizando el archivo aliases como ejemplo puede extenderse la misma funcionalidad a tantos servicios y archivos como sea necesario.  



Buena suerte!