Script de sincronización sinc_puppet | Algo de Linux

domingo, 22 de mayo de 2016

Script de sincronización sinc_puppet

Escribo este post para explicar un poco la problemática del script sinc_puppet en equipos trusty (o sinc_puppet_inst en wheezy) y las mejoras que le he realizado, con el fin de que alguno de los compañeros que me siguen se anime a probarlo antes de solicitar propagarlo a todos los centros. 

En principio, lo tengo funcionando en mi centro desde hace tiempo  y tan sólo he ido realizando mejoras en él, pero, sería conveniente que se probara en algún centro más.

Os cuento primero los problemas que tiene el script actual:
  • Tiene un bucle de espera activa que hace que el script se esté ejecutando eternamente al esperar una respuesta de ping al puppetinstituto,  si el equipo se encuentra fuera del centro.
  • Es demasiado agresivo. Se ejecuta una sola vez en el arranque y borra el directorio de certificados del cliente completo /var/lib/puppet/ssl/, si el cliente ha estado sin sincronizar con puppet más de 12 horas, lo que sucederá cada día. Como consecuencia, cada día, el cliente solicitará nuevos certificados al servidor.
  • Al borrar el directorio /var/lib/puppet/ssl completo en el cliente, los certificados que tiene el servidor almacenados, ya no serán válidos. Ese es el motivo de que se colocara una tarea cron que borre los certificados firmados cada 10 minutos entre las 8:00 y las 20:00. Y si cada 10 minutos se borran todos los certificados de clientes en el servidor, lo que se está consiguiendo al final es que cada cliente solicite un nuevo certificado cada vez que se ejecute puppet. Por eso digo que el funcionamiento es demasiado agresivo.
Y ahora os cuento las mejoras que le he aplicado:
  • He eliminado la espera activa limitando el número de intentos de hacer ping a puppetinstituto.
  • He trasladado la ejecución de puppet a /etc/network/if-up.d para que se ejecute al levantar el interfaz de red. Así no es necesario comprobar si se ha levantado el interfaz de red.
  • Como no se quiere ejecutar puppet si no ha transcurrido un tiempo determinado, he adelantado esta comprobación al principio para que no se realicen más acciones en ese caso.
  • Compruebo si existe el certificado en el cliente, y, si no existe, ejecuto puppet agent con un waitforcert de 60 para que se ejecute puppet y se solicite un nuevo certificado con una espera máxima de 60 segundos.
  • Si existe el certificado y ha estado más del tiempo determinado sin sincronizar con puppet, se ejecuta puppet agent con los parámetros splay y splaylimit para lograr que se realize en un tiempo pseudoaleatorio como máximo de splaylimit tiempo.
  • He hecho que sinc_puppet sea configurable por el administrador, creando un fichero de configuración /etc/default/sincpuppet que permitirá personalizarlo según necesidades.
  • También me ha parecido interesante añadir un parámetro ENABLE (como hicimos con pkgsync) al fichero de configuración para que podamos desactivarlo fácilmente si fuera necesario.
Aquí tenéis el código, por si queréis echarle un vistazo:
/usr/share/linex-ubuntu-puppet/sinc_puppet
Y el fichero de configuración:
/etc/default/sincpuppet
Todo es mejorable. Así que si alguien tiene alguna propuesta, que la envíe y lo hablamos.

sinc_puppet se distribuye en el paquete linex-ubuntu-puppet para los equipos con Ubuntu. Así que he creado una nueva versión de dicho paquete:
https://mega.nz/#!Fl8mDBDJ!-ELC2x2koIWe9HaYAvuNML8fe64Qe2pt4DpK7fg8c2Q
Como no podemos evitar que en el servidor puppet se borren los certificados firmados del directorio /var/lib/puppet/ssl porque la tarea cron que lo hace está puesta mediante el puppetmaster de Mérida, lo que tenéis que hacer es comentar la línea que dice ssldir=/var/lib/puppet/ssl en la sección [master] del fichero /etc/puppet/puppet.conf del servidor puppet:
[master]
ssldir=/var/lib/puppet/ssl

certname=puppetinstituto
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
#templatedir=/var/lib/puppet/templates
autosign=true
Para que quede tal que así:
[master]
# ssldir original
# ssldir=/var/lib/puppet/ssl
# ssldir cambiado para que no me borren los certificados
ssldir=/var/lib/puppet/ssl.ies

certname=puppetinstituto
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
#templatedir=/var/lib/puppet/templates
autosign=true
De este modo, estamos cambiando la ubicación de certificados del servidor a /var/lib/puppet/ssl.ies

Un detalle importante que se me había pasado comentar y que me ha apuntado nuestro compañero Francisco Paniagua (Gracias, Francis!!!!): 

Como estamos utilizando puppet con apache2 mediante passenger, al cambiar la ruta /var/lib/puppet/ssl por  /var/lib/puppet/ssl.ies, tendremos que cambiar la ubicación de los certificados en el fichero /etc/apache2/sites-available/puppetmaster.conf para que apunten también al directorio /var/lib/puppet/ssl.ies

/etc/apache2/sites-available/puppetmaster.conf antes del cambio:
# This Apache 2 virtual host config shows how to use Puppet as a Rack
# application via Passenger. See
# http://docs.puppetlabs.com/guides/passenger.html for more information.

# You can also use the included config.ru file to run Puppet with other Rack
# servers instead of Passenger.

# you probably want to tune these settings
PassengerHighPerformance on
PassengerMaxPoolSize 12
PassengerPoolIdleTime 1500
# PassengerMaxRequests 1000
PassengerStatThrottleRate 120

Listen 8140

<VirtualHost *:8140>
        SSLEngine on
        SSLProtocol             ALL -SSLv2 -SSLv3
        SSLCipherSuite          EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
        SSLHonorCipherOrder     on

        SSLCertificateFile      /var/lib/puppet/ssl/certs/puppetinstituto.pem
        SSLCertificateKeyFile   /var/lib/puppet/ssl/private_keys/puppetinstituto.pem
        SSLCertificateChainFile /var/lib/puppet/ssl/certs/ca.pem
        SSLCACertificateFile    /var/lib/puppet/ssl/certs/ca.pem
        # If Apache complains about invalid signatures on the CRL, you can try disabling
        # CRL checking by commenting the next line, but this is not recommended.
        SSLCARevocationFile     /var/lib/puppet/ssl/ca/ca_crl.pem
        # Apache 2.4 introduces the SSLCARevocationCheck directive and sets it to none
        # which effectively disables CRL checking; if you are using Apache 2.4+ you must
        # specify 'SSLCARevocationCheck chain' to actually use the CRL.
        # SSLCARevocationCheck chain
        SSLVerifyClient optional
        SSLVerifyDepth  1
        # The `ExportCertData` option is needed for agent certificate expiration warnings
        SSLOptions +StdEnvVars +ExportCertData

        # This header needs to be set if using a loadbalancer or proxy
        RequestHeader unset X-Forwarded-For

        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/
        RackBaseURI /
        <Directory /usr/share/puppet/rack/puppetmasterd/>
                Options None
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>
/etc/apache2/sites-available/puppetmaster.conf después del cambio:
# This Apache 2 virtual host config shows how to use Puppet as a Rack
# application via Passenger. See
# http://docs.puppetlabs.com/guides/passenger.html for more information.

# You can also use the included config.ru file to run Puppet with other Rack
# servers instead of Passenger.

# you probably want to tune these settings
PassengerHighPerformance on
PassengerMaxPoolSize 12
PassengerPoolIdleTime 1500
# PassengerMaxRequests 1000
PassengerStatThrottleRate 120

Listen 8140

<VirtualHost *:8140>
        SSLEngine on
        SSLProtocol             ALL -SSLv2 -SSLv3
        SSLCipherSuite          EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
        SSLHonorCipherOrder     on

        SSLCertificateFile      /var/lib/puppet/ssl.ies/certs/puppetinstituto.pem
        SSLCertificateKeyFile   /var/lib/puppet/ssl.ies/private_keys/puppetinstituto.pem
        SSLCertificateChainFile /var/lib/puppet/ssl.ies/certs/ca.pem
        SSLCACertificateFile    /var/lib/puppet/ssl.ies/certs/ca.pem
        # If Apache complains about invalid signatures on the CRL, you can try disabling
        # CRL checking by commenting the next line, but this is not recommended.
        SSLCARevocationFile     /var/lib/puppet/ssl.ies/ca/ca_crl.pem
        # Apache 2.4 introduces the SSLCARevocationCheck directive and sets it to none
        # which effectively disables CRL checking; if you are using Apache 2.4+ you must
        # specify 'SSLCARevocationCheck chain' to actually use the CRL.
        # SSLCARevocationCheck chain
        SSLVerifyClient optional
        SSLVerifyDepth  1
        # The `ExportCertData` option is needed for agent certificate expiration warnings
        SSLOptions +StdEnvVars +ExportCertData

        # This header needs to be set if using a loadbalancer or proxy
        RequestHeader unset X-Forwarded-For

        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/
        RackBaseURI /
        <Directory /usr/share/puppet/rack/puppetmasterd/>
                Options None
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>
Está pensado para Ubuntu. Así que probadlo en Ubuntu aquellos que queráis, más que nada para testear su funcionamiento en otros centros y, si a todo el que lo haya probado le va bien, solicitamos su propagación mediante puppet. O, si le encontramos fallos, los corregimos.
Publicado por primera vez en http://enavas.blogspot.com.es