Implementar y eliminar un servidor web con Ansible

TenerAnsible es una herramienta de automatización informática sin agentes que revela el misterio de cómo se realiza el trabajo. Muchos administradores de sistemas ejecutan comandos o playbooks ad hoc de Ansible a diario para administrar sus tareas automatizadas. Se basan en la salida de la interfaz de línea de comandos (CLI) predeterminada de Ansible para visualizar y comprender lo que sucede después de que su comando o playbook termina de ejecutarse.

Dado que la salida estándar de Ansible CLI es limpia y liviana, una opción para realizar un seguimiento de los tiempos de ejecución, obtener métricas, comprender el consumo de recursos y recopilar otra información es modificar la salida para incluir más detalles mediante complementos de devolución de llamada. Este artículo explica cómo usar dos complementos de devolución de llamada de Ansible diferentes para perfilar la actividad del sistema y el uso máximo de la memoria del trabajo y la ejecución completa usando cgroups.

Hay mucho terreno que cubrir con este tema. Este artículo establece el escenario definiendo el entorno y los componentes necesarios. Un segundo artículo cubrirá las pruebas de tiempo de ejecución del libro de jugadas utilizando complementos de refuerzo.

Índice

Configuración del entorno de prueba

Este escenario solo necesita un nodo administrado y una máquina de destino. Utiliza el nodo administrado (ServerA) para definir archivos de configuración y playbooks. Ejecuta las pruebas en la máquina de destino (Servidor B), donde el servicio httpd está instalado y configurado para actuar como un servidor web de prueba. Los servidores A y B tienen la siguiente configuración:

  • UPC: 1 procesador virtual
  • Memoria: 1GB
  • Disco: 10 GB
  • Sistema de explotación : RHEL 8.4
  • Versión de Ansible: 2.9.26

[ Register for our free Ansible essentials online course. ]

Todos los comandos se ejecutan en el nodo administrado. Comience por crear un archivo de inventario con solo el nombre de host de la máquina de destino:

[servera]$ cat << EOF > hosts
[demo]
serverb
EOF

Luego crea un sencillo ansible.cfg archivo con alguna información de configuración de acceso:

[servera]$ cat << EOF > ansible.cfg
[defaults]
inventory=hosts
remote_user=alexon

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
EOF

Como mencioné anteriormente, la máquina de destino es un servidor web básico. Cree dos libros de jugadas simples. La primera, deploy-webserver.yml, instala, configura e inicia el servicio httpd en el destino con un index.html página. La segunda, remove-webserver.yml, elimina toda esta configuración.

Aquí está el primer libro de jugadas:

[servera]$ cat << EOF > deploy-webserver.yml
---
- name: Demo playbook to test callback plugin - Deployment
  hosts: serverb
  tasks:
    
    - name: Install httpd package
      dnf:
        name: httpd
        state: latest
    
    - name: Start and enable httpd service
      service:
        name: httpd
        enabled: true
        state: started

    - name: Create a custom index.html file
      copy:
        dest: /var/www/html/index.html
        content: |
          Enable SysAdmin Demo:
          Ansible Profiling with Callback Plugin
          Custom Web Page
EOF

Y aquí está el segundo libro de jugadas:

[servera]$ cat << EOF > remove-webserver.yml
---
- name: Demo playbook to test callback plugin - Remove
  hosts: serverb
  tasks:

    - name: Stop and disable httpd service
      service:
        name: httpd
        enabled: false
        state: stopped

    - name: Remove httpd package
      dnf:
        name: httpd
        state: absent
EOF

Debe tener los siguientes cuatro archivos en su demo directorio telefónico:

[servera]$ ls -1
ansible.cfg
deploy-webserver.yml
hosts
remove-webserver.yml

Probar el entorno

Primero, pruebe la comunicación con la máquina de destino haciendo ping a través de un comando ad hoc de Ansible:

[servera]$ ansible -i hosts -m ping serverb

serverb | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

Ejecute los libros de jugadas para verificar que funcionan como se esperaba. Primero, ejecute el deploy-webserver.yml libro de jugadas:

[servera]$ ansible-playbook deploy-webserver.yml

PLAY [Demo playbook to test callback plugin - Deployment] *******************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************
ok: [serverb]

TASK [Install httpd package] ************************************************************************************************************************
changed: [serverb]

TASK [Start and enable httpd service] ***************************************************************************************************************
changed: [serverb]

TASK [Create a custom index.html file] **************************************************************************************************************
ok: [serverb]

PLAY RECAP ******************************************************************************************************************************************
serverb                    : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

¡Éxito! que decir de la remove-webserver.yml libro de jugadas?

[servera]$ ansible-playbook remove-webserver.yml

PLAY [Demo playbook to test callback plugin - Remove] ***********************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************
ok: [serverb]

TASK [Stop and disable httpd service] ***************************************************************************************************************
changed: [serverb]

TASK [Remove httpd package] ************************************************************************************************************************
changed: [serverb]

PLAY RECAP ******************************************************************************************************************************************
serverb                    : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Funciona a las mil maravillas. Pero, ¿cómo sabe las respuestas a preguntas como: cuánto tiempo lleva completar cada tarea? ¿Cuántos recursos (memoria y CPU) se han consumido? ¿Cuál fue el tiempo de ejecución total de los libros de jugadas? ¿Y cuánto de los recursos totales consumió la máquina de destino? ¡Parece preguntas para el segundo artículo!

Envoltura

En este artículo, definí el problema del seguimiento de los tiempos de ejecución, la obtención de métricas y el consumo de recursos en la salida de la CLI de Ansible al ejecutar playbooks. He cubierto los ajustes básicos para los libros de jugadas y los archivos de configuración de Ansible. También establecí la infraestructura que usará en el próximo artículo de la serie, que cubre la prueba de perfiles de recursos y la realización de tareas con los complementos de devolución de llamada de Ansible.

Artículos de interés

Subir