¿Cómo limpiar cosas de roles que ya no se usan en un servidor?

15

Supongamos que tengo un host que es, entre otras cosas, un servidor web, donde se instala el rol Ansible relacionado nginx, realiza una configuración esencial /etc/nginxy abre los puertos 80 y 443 en el firewall.

En algún momento quiero que ese host en particular ya no sea un servidor web, porque por alguna razón mudé ese servicio a otra parte. Simplemente eliminar el servidor del [webservers]inventario dejaría basura en el servidor. Idealmente, me gustaría desinstalar nginx, eliminar el /etc/nginxdirectorio (y algunos otros directorios) y cerrar los puertos 80 y 443 en el firewall.

En Puppet puedo hacer esto. Un host que es un servidor web tendrá algo como esto en su configuración:

class { 'nginx':
  ensure => present,
}

y todo lo que tengo que hacer es reemplazar "presente" con "ausente". Si la nginxclase está bien escrita, deshacerá los cambios que ha realizado. (Normalmente, un administrador reemplazará "presente" por "ausente", y más tarde, cuando esté seguro de que todos los hosts afectados hayan deshecho la configuración, eliminará el elemento del manifiesto).

Además, creo que el módulo de firewall Puppet elimina automáticamente las reglas de firewall que ya no se pueden encontrar en el manifiesto; así que creo que, para el cortafuegos, ni siquiera necesita hacer esa cosa "ausente" anterior, el cortafuegos se cerrará automáticamente de todos modos.

¿Cómo puedo lograr estas cosas con Ansible?

Antonis Christofides
fuente
1
Las preguntas hipotéticas no están realmente sobre el tema aquí, creo, aunque su pregunta en sí no carece de mérito. En lugar de "simulemos ..." reformulemos y digamos, por ejemplo, "En Puppet puedo cambiar una función de servidor y desinstalar nginx que se instaló previamente cambiando ensure => present a ensure => absentque también ... Cómo hacer lo mismo con ansible", etc. Idealmente con un ejemplo de cualquier cosa que ya hayas probado.
HBruijn
2
Yo diría que Ansible no está realmente diseñado para este tipo de cosas. Está dirigido a servidores reproducibles y desechables. Si ya no desea que una máquina sea un servidor web, simplemente límpiela (o finalícela si es una instancia de la nube) en lugar de reutilizarla.
ceejayoz
@ceejayoz lo más que he leído sobre Ansibles es en Ender's Game & sequals de Orson Scott Card Card, pero lo que dices tiene mucho sentido en la orquestación de nubes
HBruijn
@ceejayoz: Actualmente no uso Ansible para la configuración de varios servidores, sino para configurar pequeños servidores autónomos. Creo que este es un uso válido. Entonces, un servidor puede tener nginx + django + PostgreSQL. Si más tarde decido poner nginx o nginx + django en otro lugar, eliminar todo el servidor y necesitar recuperar PostgreSQL de la copia de seguridad parecería subóptimo (sin mencionar el tiempo de inactividad).
Antonis Christofides

Respuestas:

10

Con Ansible, realmente no haría esto de manera diferente a como lo haría con Puppet.

En su ejemplo donde establecería

class { 'nginx':
  ensure => absent,
}

confía en que el autor de ese módulo títere haya escrito el código necesario para tratar de eliminar todo. No todos los módulos de marionetas tienen esto.

Del mismo modo, con Ansible, es posible que tenga roles que tengan los pasos necesarios para instalarlo y eliminarlo. La diferencia está solo en cómo invocar a los dos.

Un enfoque podría ser uno en el que el rol en cuestión exponga una variable para alternar el comportamiento. Por ejemplo, ese rol nginx podría tomar una variable nginx_stateque toma los valores installedy absent.

En los roles tasks/main.yml, el autor del rol podría tener algo parecido a ...

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

..con la respectiva lógica de instalación / desinstalación dividida entre esos dos archivos incluidos condicionalmente.

Los roles de respuesta también se pueden anidar. Como otra forma de hacer lo mismo, un autor de roles podría, por ejemplo, proporcionar un rol nginxcon otro rol dentro de él, llamado uninstalled. Entonces podrías hacer:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

Ansible, en comparación con Puppet, podría decirse que tiene menos reglas y pautas sobre cómo deben hacerse las cosas, por lo que las prácticas varían un poco más en la naturaleza, pero se aplican los mismos conceptos.

Nick Groenen
fuente
1
Aunque técnicamente también puede pasar argumentos directamente a los roles, recomendaría usar el rol anidado. Me resultaría realmente extraño ver en un libro de jugadas algún papel, que en realidad se desinstalará en la ejecución del libro de jugadas ya que en las variables se define como tal. Tenerlo explícito a través del rol anidado parece mucho más limpio. Técnicamente es posible pasar argumentos al rol ( - { role: nginx, state: absent }), pero me parece extremadamente detallado. El único inconveniente del rol anidado que he visto fue que necesitaba vincular los valores predeterminados del padre.
bogdan.mustiata
¿Qué necesitas hacer para algo como roles: -nginx/uninstalledtrabajar? He buscado por todas partes, pero no puedo encontrar ninguna documentación sobre los roles de anidación de una manera que me permita hacer eso.
agregado11686877
1

Dado que tiene su configuración / aprovisionamiento en Ansible, simplemente puede volar todo el servidor, reinstalar / aprovisionar uno nuevo y tener un buen estado limpio y conocido para que funcione.

Si realmente desea "reconfigurarlo" para otros fines, deberá crear un nuevo libro de jugadas que realice las tareas de limpieza necesarias.

Que yo sepa, todos los módulos de empaquetado de Ansible son compatibles state=absentpara garantizar que un paquete determinado no esté instalado en su servidor. Además, el aptmódulo tiene un purge=yesparámetro que limpiará los archivos de configuración personalizados restantes.

También puede crear tareas para confirmar que el puerto 80 tiene firewall. Sin embargo, dado que no tendrá ningún proceso ejecutándose en ese puerto, el firewall no hará ninguna diferencia en la seguridad de su servidor.

Mxx
fuente
Para agregar a esto, apuesto a que la mayoría de las jugadas en ese papel podrían haber state=absentagregado. Existe una buena posibilidad de que elimine o deshaga una buena mayoría de los cambios de configuración que ha realizado. Dependiendo de cuán grande sea el rol, esto podría ser un verdadero PITA para probar.
Christopher Karel