Satélite y torre de integración Ansible

¿Usando Red Hat Satellite y Red Hat Ansible Automation Platform? Comenzando con Satellite 6.3, se pueden integrar entre sí para que Dynamic Inventory en Ansible Tower obtenga listas de hosts de Satellite. Además, si los hosts RHEL se inicializan usando Satélite (lo que significa aprovisionamiento), entonces Ansible Tower se puede integrar en este proceso para que ejecute automáticamente los scripts de configuración en los nuevos hosts.



En esta publicación, veremos cómo configurar Dynamic Inventory en Ansible Tower para que muestre los hosts de Satellite, y mostraremos cómo usarlo con ejemplos. Además, le mostraremos cómo organizar una llamada automática a Ansible Tower después de inicializar un nuevo host desde Satellite.

1. Inventory. Satellite, Dynamic Inventory Ansible Tower


Para que Ansible Tower tenga acceso a la lista de hosts, grupos de hosts y otra información relacionada, necesita una cuenta en Satellite. Esta entrada tiene suficientes permisos mínimos, por lo que crearemos una nueva función en Satellite, le daremos solo los permisos necesarios para Ansible Tower, y luego crearemos una nueva cuenta y le asignaremos esta función.

Satellite 6.6 y versiones posteriores ya tienen lista una función de lector de inventario de torre de Ansible, por lo que puede omitir los pasos a continuación para crear una función.

En Satellite 6.3-6.5, el rol tendrá que ser creado a mano. Para hacer esto, vaya a la interfaz web de Satélite, vaya a la pantalla Administrar, seleccione Roles y haga clic en Crear rol.

Llamamos a este rol ansible_tower_integration_role y establecemos ubicaciones y organizaciones para él :



Haga clic en Enviar para crear el rol. Después de eso, haga clic en su nombre y vaya a la pestaña Filtros. Haga clic en el botón verde Nuevo filtro y agregue los siguientes filtros, uno a la vez:

Tipo de recurso: Host , Permiso: view_hosts
Tipo de recurso: Grupo de host , Permiso: view_hostgroups
Tipo de recurso: Valor de hecho , Permiso: view_facts

Como resultado, los siguientes filtros deberían tener un rol:



Entonces, hemos creado un rol. Ahora comenzaremos un nuevo usuario en Satélite, para lo cual iremos al menú Administrar , seleccionaremos Usuarios y haremos clic en Crear usuario . Llamamos a este usuario ansible_integration , cambiamos el parámetro Autorizado por a INTERNO y establecemos la contraseña. Luego, en las pestañas Ubicaciones y Organizaciones , seleccione las ubicaciones / organizaciones apropiadas. Finalmente, vaya a la pestaña Roles y asigne a este usuario el rol ansible_tower_integration_role recién creado (si tiene Satellite 6.3 - 6.5) o el rol de lector de inventario de torre Ansible incorporado(Satélite 6.6 y superior). Finalmente, haga clic en Enviar para crear una cuenta para este usuario.

Personalizar Torre Ansible


Ahora vaya a la interfaz web de Ansible Tower y vaya a la pantalla Credenciales . Haga clic en el botón verde + (Agregar) para crear una nueva entrada de credencial. Lo llamamos satélite_integración , y en el Tipo de credencial especificamos Red Hat Satellite 6 . Luego ingresamos la URL (en nuestro caso Satellite 6), así como el nombre de usuario (en nuestro caso ansible_integration ), y la contraseña es la que configuramos en Satellite arriba:



Luego haga clic en Guardar .

Ahora vaya a la pantalla Inventarios , haga clic en el botón verde + (Agregar) y seleccione Inventario . Especifique satellite_inventory como nombre y haga clic en Guardar para crear un inventario. Después de eso, vaya a la pestaña Fuentes del inventario recién creado y haga clic en el botón verde + (Agregar) . Usamos satélite como el nombre de la fuente , y especificamos el tipo de fuente como Red Hat Satellite 6 . En el campo Credencial, especifique satellite_integration , que se creó en el paso anterior. Active la casilla de verificación Sobrescribir ,Sobrescribir variables y actualizar al iniciar en el grupo de control Opciones de actualización (puede obtener más información sobre estas opciones utilizando los signos de interrogación a la derecha). Además, en el campo Tiempo de espera de caché (segundos) , ingrese 90 y haga clic en Guardar .



Ahora, sin salir de la pestaña Orígenes , haga clic en el icono Iniciar proceso de sincronización :



Esperamos hasta que el icono se vuelva verde; esto indica que la sincronización se completó con éxito.

Ahora puede ir a la pestaña Hosts y ver los datos que se han extraído del satélite:



También puedes mirar la pestaña Grupos:



Como puede ver, la sincronización no solo extrajo las listas de hosts de Satellite, sino que también las dividió en grupos de acuerdo con las vistas de contenido correspondientes en Satellite, grupos de hosts, entornos de ciclo de vida, ubicaciones y organizaciones. Esta agrupación se puede usar para apuntar scripts Ansible en hosts de destino, y esto es algo muy poderoso.

Si selecciona un host en la pestaña Hosts, veremos que entre Satellite y Ansible Tower se sincroniza mucha información auxiliar sobre el host, que se presenta en forma de variables. Estas variables se pueden usar en secuencias de comandos Ansible:



Uso del inventario dinámico vinculado al satélite


Entonces, sincronizamos Satellite y Ansible Tower. Ahora consideraremos cómo usarlo en la práctica.

La forma más fácil es usar satellite_inventory como la fuente de inventario en la plantilla de torre de Ansible. Si la opción hosts: all está especificada en el script , el script se ejecutará en todos los hosts Satellite.

Una opción más avanzada es utilizar grupos de inventario creados automáticamente en secuencias de comandos (cómo se crean; consulte más arriba), en otras palabras, especifique el grupo de host deseado en la línea de hosts . Por ejemplo, como en este escenario donde está instalado el paquete de pantalla:

---
- name: Install screen package
  hosts: "foreman_hostgroup_rhel6"
  tasks:
  - yum:
      name: screen
      state: installed

Aquí tenemos hosts registrados : foreman_hostgroup_rhel6 , lo que indica la lista de hosts que forman el grupo de hosts rhel6 en el Satélite. En consecuencia, el script se ejecutará solo en estos hosts.

Además, en el script, puede especificar en la línea de hosts aquellas variables que Ansible Tower recibe durante la sincronización con Satellite. Por ejemplo, puedes hacer esto:

---
- name: Install screen package
  hosts: "{{ hosts_var }}"
  tasks:
  - yum:
      name: screen
      state: installed

Como resultado, podremos cambiar la plantilla de trabajo en Ansible Tower sobre la marcha, lo que indica uno de los grupos de inventario a través de una variable externa.



En este ejemplo, la plantilla solo se ejecutará en hosts que sean miembros del grupo rhel7 en Satellite.

Además, la plantilla de trabajo se puede configurar para que al inicio le pida al usuario el valor de la variable hosts_var (y al mismo tiempo muestre los grupos de inventario disponibles en forma de comentarios):



La pantalla de arriba ilustra la situación cuando, al iniciar la plantilla, se le solicita al usuario que ingrese el nombre del grupo de inventario de Satélite en cuyos hosts desea ejecutar el script.

Además, puede usar las variables de host extraídas de Satellite durante la sincronización. Por ejemplo, así es como se ve un script que muestra cómo hacer referencia a estas variables:

---
- name: Show Satellite variables
  hosts: all
  tasks:
  - name: Show subscription_status
    debug:
      msg: >
        Subscription Status: {{ foreman.subscription_status_label }}
  - name: Show Errata Counts
    debug:
      msg: >
        Bug fixes: {{ foreman.content_facet_attributes.errata_counts.bugfix }},
        Security: {{ foreman.content_facet_attributes.errata_counts.security }},
        Enhancement: {{ foreman.content_facet_attributes.errata_counts.enhancement }},
        Total: {{ foreman.content_facet_attributes.errata_counts.total }}

Si ejecuta este script en Ansible Tower, mostrará los valores de las variables:



Y, por supuesto, estas variables se pueden usar en construcciones condicionales cuando, de modo que las tareas se inician solo bajo ciertas condiciones. Por ejemplo, si el host no tiene parches de seguridad, o cuando la suscripción del host no es válida.

Para resumir


Red Hat Satellite y Red Hat Ansible son herramientas muy poderosas y su integración proporciona una sinergia tangible. Arriba, mostramos cómo hacer que Satellite sea una fuente de datos para Dynamic Inventory en Ansible y usarlo en la práctica.

Parte 2. Configuración automática de nuevos hosts a través de la devolución de llamada de aprovisionamiento


Además de muchas otras características, Satellite también puede inicializar hosts, en otras palabras, realizar el aprovisionamiento. Ansible Tower, a su vez, está diseñado para configurar hosts. La integración le permite asegurarse de que después de la inicialización de un nuevo host RHEL por medio de Satélite, Ansible Tower se conectará automáticamente a este host y ejecutará el script de configuración correspondiente en él. Obviamente, tal esquema ahorra mucho tiempo para los administradores del sistema, ayudándoles a responder rápidamente a las necesidades de la organización.

Cabe señalar que este esquema solo funciona si se cumplen varias condiciones. Primero, Satellite debería usarse como una fuente de datos de inventario dinámico en Ansible Tower (cubrimos este problema en la parte anterior). En segundo lugar, la inicialización del host no solo debe hacerse a través de Satélite, sino también a través del mecanismo del grupo de host (para más detalles, consulte la Guía de aprovisionamiento ).

A continuación mostramos cómo configurar Satellite y Ansible Tower para que después de inicializar el host, ejecute automáticamente el script de configuración de Ansible.

Visión general


Las herramientas de automatización de TI, como Ansible Tower, generalmente se dividen en una de dos categorías: algunas funcionan por el método push, otras por el método pull. En los sistemas push a los que pertenece Ansible Tower, el servidor de automatización inicia una conexión con el host. En los sistemas de extracción, el iniciador es el host, que se comunica con el servidor de automatización.

En nuestro caso, con secuencias de comandos automáticas en nuevos hosts, se utiliza un esquema mixto. El host recién inicializado se pone en contacto con el servidor de automatización con una solicitud de "devolución de llamada" y configuración. Después de eso, el servidor de automatización se conecta a este host y ejecuta el script de configuración solicitado por el host en él. Por lo tanto, en Ansible Tower este mecanismo se denomina devolución de llamada de aprovisionamiento, que se puede traducir como "devolución de llamada de inicialización".

Para mostrar por qué es necesaria la devolución de llamada de aprovisionamiento, considere la siguiente situación: tenemos un cierto script de configuración de host que se ejecuta diariamente a la medianoche. Digamos que a las 8 a.m. estamos inicializando varios servidores nuevos a la vez a través de Satellite. Al mismo tiempo, Satellite se utiliza como una fuente de datos de inventario dinámico en Ansible Tower, por lo que los hosts creados se incluyen automáticamente en Ansible. Sin embargo, el próximo lanzamiento del script de automatización tendrá lugar solo a medianoche, es decir, después de 16 horas. Obviamente, esto está lejos de ser ideal, y me gustaría que el script se ejecute inmediatamente después de la inicialización del nuevo host. Para este propósito, la devolución de llamada de aprovisionamiento también está pensada.

En general, la devolución de llamada de aprovisionamiento se configura y funciona de la siguiente manera:

  1. Ansible Tower credential root, Satellite . Tower , .
  2. Job Template Ansible Tower provisioning callback. URL Host Config Key, Ansible.
  3. Satellite , provisioning callback Ansible Tower, : URL- Ansible Tower, Host Config Key Ansible.
  4. Satellite /etc/systemd/system/ansible-callback.service ( RHEL 7 8; RHEL 6 ). provisioning callback Ansible Tower, , (URL-, Host Config Key ).
  5. Ansible Tower Host Config Key. , Tower , root, Job Template. , .

Ansible Tower Provisioning Callback


Comencemos creando un script de configuración en el servidor de Ansible Tower que cambie el contenido de / etc / motd, cree algún tipo de usuario e instale un paquete específico. Luego usaremos este script para configurar nuevos hosts inmediatamente después de que se inicialicen.

En la vida real, lo más probable es que los scripts de automatización se almacenen en algún sistema de control de versiones, pero por simplicidad, suponemos que se encuentran directamente en el servidor de Ansible Tower. Por lo tanto, ingresamos al servidor Ansible Tower a través de SSH y creamos el directorio / var / lib / awx / projects / provision para ellos ejecutando el siguiente comando:

# mkdir /var/lib/awx/projects/provision

Luego creamos nuestro script en este directorio, lo llamamos provision.yaml y escribimos los siguientes contenidos en él:

---

- name: Provision new host

  hosts: all

  tasks:

  - name: Set content in /etc/motd 

    copy:

      content: Authorized use only!

      dest: /etc/motd

      mode: 644

      owner: root

      group: root


  - name: Create brian user account

    user:

      name: brian

      uid: 10000

      state: present


  - name: Install tmux package

    yum:

      name: tmux

      state: present


Ahora vaya a la interfaz web de Tower y vaya a la pantalla Credenciales. Hacemos clic en el botón con el signo más verde para crear un nuevo registro de credenciales, darle el nombre provisioning_root y también establecer el Tipo de credencial como Máquina. En el campo Nombre de usuario, escriba root, y en el campo Contraseña, especifique la contraseña que se especifica en Satellite para usar en los nuevos hosts del grupo de host correspondiente en Satellite (su nombre se puede encontrar en la interfaz web de Satellite en la pestaña Sistema operativo). Con esta entrada, Ansible Tower podrá iniciar sesión en los nuevos hosts creados durante la inicialización a través de Satélite.



Después de eso, en la interfaz de Ansible Tower, vaya a la pantalla Proyectos y haga clic en el signo más verde para crear un nuevo proyecto. Llámelo provisión, cambie el Tipo de SCM a Manual y especifique provisión como el Directorio de Playbook:



Luego, en la interfaz de Ansible Tower, vaya a la pantalla Plantillas, haga clic en el signo más verde para crear una nueva Plantilla de trabajo. Lo llamaremos provision, en el campo Inventory escribiremos Satellite, en el campo Project - provision, en el campo Playbook - provision.yaml, y en el campo Credential - provisioning_root. Además, debe habilitar la casilla de verificación Permitir devoluciones de llamadas de aprovisionamiento y hacer clic en el icono de la varita mágica a la derecha del campo Clave de configuración del host para generar una clave secreta. Esta clave es necesaria para solicitar una devolución de llamada de aprovisionamiento que no podría ser nadie, sino solo alguien que conozca la clave de configuración del host. Sin la clave correcta, el servidor de Ansible Tower simplemente no responderá a la solicitud.



Ahora debemos recordar para el futuro el valor de la clave de configuración del host, así como la ID de la plantilla, que se puede encontrar en la URL de esta plantilla de trabajo:

https://tower.example.com/#/templates/job_template/11

En este ejemplo, la ID es 11.

Configuración de satélite para aprovisionamiento de devolución de llamada


Ahora vaya a la interfaz web satelital, vaya a la pantalla Configurar y haga clic en Grupos de hosts. Seleccionamos el grupo de hosts existente, que se utiliza al inicializar nuevos hosts, en nuestro ejemplo, esto es RHEL 8.

En la pantalla de edición del grupo de hosts, vaya a la pestaña Parámetros y cree 4 nuevos parámetros:

ansible_host_config_key: aquí ingresamos la clave de configuración del host desde nuestra plantilla de torre de Ansible.
ansible_job_template_id: aquí escribimos el ID de la plantilla, que descubrimos previamente en la URL de la plantilla.
ansible_tower_fqdn es el nombre de dominio completo del servidor de Ansible Tower.
ansible_tower_provisioning: establecer verdadero.



Mira cómo funciona todo


Ahora inicialice el nuevo host desde Satellite y verifique que la devolución de llamada de aprovisionamiento funcione y ejecute automáticamente nuestro script en ese host.

En la interfaz web del satélite, vaya a la pantalla Hosts, haga clic en Crear host y verifique que se utiliza el grupo para el que acabamos de crear 4 nuevos parámetros, es decir, el grupo RHEL 8.



Una vez completada la inicialización del host, debemos asegurarnos de que la plantilla se haya iniciado correctamente. Para hacer esto, vaya a la pantalla Plantillas en la interfaz web de Ansible Tower, busque nuestra plantilla en la lista y vea si el cuadrado más a la izquierda de su indicador se ha vuelto verde:



Hacemos clic en este cuadro verde para ver los detalles del lanzamiento, que en nuestro caso fue exitoso. Tenga en cuenta que esta tarea tiene un límite (Límite): el lanzamiento de solo nuevos hosts que se crean durante la inicialización. Bueno, esto no es sorprendente, ya que el mecanismo de devolución de llamada de aprovisionamiento solo ejecuta la plantilla en los hosts que lo solicitan.



Ahora vayamos al host recién creado y verifiquemos si coincide con lo que está escrito en el script:

[root@provision-test-rhel8 ~]# rpm -qa | grep tmux
tmux-2.7-1.el8.x86_64

[root@provision-test-rhel8 ~]# id brian
uid=10000(brian) gid=10000(brian) groups=10000(brian)

[root@provision-test-rhel8 ~]# cat /etc/motd
Authorized use only!

Solución de problemas


Si la plantilla de Ansible Tower no se inicia automáticamente en un nuevo host inicializado a través de Satélite, hay algunas cosas que debe verificar.

El primer paso es averiguar si la Torre Ansible recibió una solicitud de devolución de llamada de aprovisionamiento, cómo fue el script y si comenzó en absoluto. Para hacer esto, vaya a la pantalla de Plantillas en la interfaz de la Torre y observe el color del indicador al lado del nombre de la plantilla: verde - el lanzamiento fue exitoso, rojo - el lanzamiento falló.



Si el cuadrado es rojo, hacemos clic en él y buscamos información adicional para entender por qué falló el inicio (estos pueden ser errores de sintaxis en el script y otros problemas).

Si el cuadro es verde, entonces hacemos clic y miramos de todos modos, ya que la tarea podría informar una ejecución exitosa, pero en realidad no comenzó en nuestro host. Por ejemplo, si la línea de hosts en la secuencia de comandos indica hosts y grupos específicos, pero no incluye los hosts creados durante la inicialización, la tarea informará de éxito, pero la información adicional dirá "omitiendo: no hay hosts coincidentes".

Si el cuadrado del indicador no es verde ni rojo, entonces debe comenzar verificando los parámetros del grupo host en Satélite. Asegúrese de que la URL del servidor de Ansible Tower, la clave de configuración del host y el ID de la plantilla estén correctamente especificados allí.

Luego, vaya al host recién inicializado y verifique que haya un archivo /etc/systemd/system/ansible-callback.service (en los sistemas RHEL 7 u 8) o un archivo /root/ansible_provisioning_call.sh (RHEL 6).

Si el archivo no existe, verifique que el parámetro ansible_tower_provisioning esté establecido en verdadero para este grupo de hosts y que los patrones de inicialización en el servidor Satellite no hayan cambiado.
Si el archivo /etc/systemd/system/ansible-callback.service está presente en el host, ábralo y busque la URL donde se envía la solicitud de devolución de llamada de aprovisionamiento:

[root@provision-test-rhel8 ~]# cat /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=aa5ebe82-491c-4fbb-bd36-a6657549451e" https://tower.example.com/api/v2/job_templates/11/callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target

Puede ejecutar curl y duplicar manualmente los comandos especificados en este archivo para iniciar manualmente una devolución de llamada de aprovisionamiento:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=aa5ebe82-491c-4fbb-bd36-a6657549451e" https://tower.example.com/api/v2/job_templates/11/callback/

Si se especifica una clave de configuración de host no válida, recibimos el siguiente mensaje de error:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=wrong-key-here" https://tower.example.com/api/v2/job_templates/11/callback/

{"detail":"You do not have permission to perform this action."}

Si la ID de plantilla se especifica incorrectamente (aquí - 43 en lugar de 11), la respuesta será la siguiente:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=wrong-key-here" https://tower.example.com/api/v2/job_templates/43/callback/

{"detail":"Not found."}

También puede deshabilitar el modo silencioso (-s) en el comando curl para que muestre errores relacionados con la resolución del nombre de host, como en el ejemplo a continuación, donde reemplazamos el nombre correcto ansible.example.com con el ansible-tower.example.com incorrecto :

[root@provision-test-rhel8 ~]# /usr/bin/curl -k  --data "host_config_key=wrong-key-here" https://ansible-tower.example.com/api/v2/job_templates/11/callback/

curl: (6) Could not resolve host: ansible-tower.example.com

Además, al descubrir la causa del error, el archivo /var/log/tower/tower.log en el servidor de Ansible Tower puede ser útil.
Por ejemplo, este archivo registra el uso de una clave de configuración de host no válida:

2019-11-19 23:19:17,371 WARNING  awx.api.generics status 403 received by user AnonymousUser attempting to access /api/v2/job_templates/11/callback/ from 192.168.0.138

Esto también corrige el uso de una ID de plantilla no válida:

2019-11-19 23:19:49,093 WARNING  awx.api.generics status 404 received by user AnonymousUser attempting to access /api/v2/job_templates/43/callback/ from 192.168.0.138

2019-11-19 23:19:49,095 WARNING  django.request Not Found: /api/v2/job_templates/43/callback/

Para resumir


La integración de Satellite y Ansible Tower puede optimizar en gran medida la inicialización y configuración de nuevos hosts, lo que ahorra mucho tiempo para los administradores del sistema, ayudándoles a responder más rápidamente a las necesidades de la organización.

El 24 de marzo, de 11:00 a 12:30, Red Hat llevará a cabo un seminario web "Lo que necesita saber sobre la automatización: habilidades básicas y sensibles". La

automatización es un tema que se acerca en popularidad y la cantidad de solicitudes de transformación digital. Le informaremos sobre nuestra visión de la automatización, junto con Ansible y Ansible Tower, y esta será la información básica que le abrirá la puerta al valiente y nuevo mundo de las herramientas de automatización declarativa.
Después de este seminario web, comprenderá las entidades Ansible básicas, como el libro de jugadas, el inventario y el módulo. Junto con usted, dominaremos la sintaxis básica de YAML para que pueda escribir sus propios scripts. También considerará lanzar scripts y aumentar los privilegios.

Como resultado, obtendrá un conjunto básico de habilidades que le permitirán estudiar con éxito la documentación y otra literatura sin la constante sensación de que le falta algo. ¡Regístrate y ven!

All Articles