GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo utilicé Ansible para automatizar las actualizaciones en casa

En casa, tengo algunos dispositivos de TI que funcionan las 24 horas del día, los 7 días de la semana. Para mantenerlos actualizados e instalar actualizaciones automáticamente, dejo el trabajo a Ansible. En caso de que sea completamente nuevo en Ansible, encontrará una buena introducción en:

  • Introducción a Ansible
  • Desmitificando Ansible para administradores de sistemas Linux
  • Guía de inicio rápido de Ansible para administradores de sistemas Linux

Mi red doméstica incluye los siguientes dispositivos:

  • Dos Raspberry Pi con sistema operativo Raspbian
  • Mi host KVM que ejecuta Debian 10 Buster
  • Dos hosts RHEL 8
  • Un Synology DS213air
  • Cuatro hosts RHEL en una red aislada

El host marcado con el cuadrado rojo es mi nodo de control de Ansible. Su trabajo es actualizar mi entorno Linux. Lo elegí porque este host puede llegar a todos los demás hosts del entorno. Otros hosts, por ejemplo, los hosts Red Hat Enterprise Linux 7 (RHEL)-Ansible, solo pueden acceder a los hosts dentro de la red aislada.

[ También te puede interesar: Cómo crear un Playbook de Ansible ]

Requisitos

En todos mis hosts, hay una cuenta de usuario que puede usar sudo para ejecutar comandos con privilegios de root. Para mayor comodidad, creé un par de claves SSH y distribuí la clave pública SSH a los hosts que me gustaría actualizar con Ansible. Si necesita ayuda para generar las claves SSH, consulte Usar ssh-keygen y compartir para la autenticación basada en claves en Linux de Tyler Carrigan.

Para utilizar el host RHEL8-Squid como nodo de control de Ansible, tendré que habilitar un repositorio que proporcione Ansible e instalarlo:

$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible

Para otras distribuciones, consulte la documentación oficial.

El archivo de configuración predeterminado de Ansible se encuentra en /etc/ansible/ansible.cfg . Dado que este archivo es enviado y controlado por el paquete RPM, me gusta crear un archivo de configuración personalizado en ~/.ansible.cfg simplemente copiando el original y editándolo. Solo he hecho algunos cambios:

$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory      = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa

Como puede ver, he creado un ansible directorio en mi HOME directorio para almacenar mi archivo de inventario de host. También especifiqué la ruta a la clave privada SSH que Ansible debe usar para conectarse a los nodos en la red.

Con esta configuración, toda la magia se controla desde mi HOME directorio, y no necesitaré ningún privilegio de root en mi Ansible Control Node para realizar el siguiente trabajo.

Cree un archivo de inventario estático

En este caso de uso, utilizo un archivo de inventario estático colocando mis hosts con su FQDN en ~/ansible/hosts archivo.

[special]
localhost
tower-pc.lan

[yum]
rhel7-ansible.private1
rhel7-t1.private1
rhel8-t1.private1
rpm-repo-r8.private1
podhost-r8-1.lan

[apt]
raspi-sht21.lan
pi-hole.lan

[ipkg]
diskstation.lan

Como puede ver, agrupé los hosts en mi red por el administrador de paquetes que usan. Esto es útil al crear el libro de jugadas para actualizarlos. El grupo [especial] contiene mi propio Ansible Control Node y mi hipervisor KVM, donde se ejecuta mi Ansible Control Node.

Para obtener más información sobre el inventario de Ansible, consulte:Cómo crear su inventario.

Comprueba la conectividad

Antes de crear el libro de jugadas que actualiza mis hosts, compruebo si mi Ansible Control Node RHEL8-Squid puedo conectarme a todos mis hosts usando el siguiente comando ad-hoc:

$ ansible all -m ping -T 30
rhel7-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rhel7-ansible.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rpm-repo-r8.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
rhel8-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
podhost-r8-1.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host tower-pc.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
tower-pc.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: sftp transfer mechanism failed on [diskstation.lan]. Use
ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Platform linux on host diskstation.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
diskstation.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host pi-hole.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
pi-hole.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host raspi-sht21.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
raspi-sht21.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

El tiempo de espera predeterminado para una conexión de Ansible es de 10 segundos. Porque mi Synology Diskstation está en modo de espera la mayor parte del tiempo, estoy usando la opción -T para especificar un tiempo de espera de 30 segundos para darle algo de tiempo para despertarse.

Las advertencias no me molestan en este momento, así que paso a crear el libro de jugadas.

En caso de que desee obtener más información sobre los comandos ad-hoc, lea Introducción a los comandos ad-hoc en los documentos oficiales.

El libro de jugadas

Mi libro de jugadas contiene tres jugadas. Cada juego ejecuta una tarea en hosts que pertenecen a un determinado grupo en mi inventario excepto [especial] . En este ejemplo simple, cada reproducción se conecta a un grupo de hosts, los actualiza y luego los reinicia en caso de que se hayan instalado actualizaciones.

Para determinar si se instalaron actualizaciones, registro variables que almacenan los valores de retorno de las tareas donde las registré. Los uso para verificar si el estado de una tarea ha cambiado. Si es así, el sistema se reiniciará. Este es el libro de jugadas:

---
- hosts: yum
  tasks:
  - name: Update all installed packages using YUM module
    yum:
      name: '*'
      state: latest
      update_cache: yes
      update_only: yes
    register: yum_update_status

  - name: Remove packates not needed anymore
    yum:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
    when: yum_update_status.changed

- hosts: apt
  tasks:
  - name: Update all installed packages using APT module
    apt:
      name: '*'
      state: latest
      update_cache: yes
      only_upgrade: yes
    register: apt_update_status

  - name: Remove packages not needed anymore
    apt:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
      post_reboot_delay: 60
    when: apt_update_status.changed

- hosts: ipkg
  tasks:
  - name: Update the Packages installed on Diskstation
    command: /opt/bin/ipkg update && /opt/bin/ipkg upgrade

Como habrás notado, la Diskstation no fue reiniciado. Esto se debe a que solo se actualizarán las herramientas del espacio de usuario y no es necesario reiniciar. Si hay disponible una nueva versión del sistema operativo para Diskstation , lo actualizaré manualmente porque todavía no hay un módulo Ansible para él. Es una historia similar con los anfitriones tower-pc.lan y rhel8-squid.lan . Los dejé fuera de este libro de jugadas a propósito. Mi Ansible Control Node y mi hipervisor KVM son lo suficientemente importantes para mí que los actualizaré manualmente.

Aquí hay un vistazo a la primera ejecución del libro de jugadas:

$ ansible-playbook -T 30 -b --ask-become-pass pkg_update.yml
BECOME password:

PLAY [yum] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [podhost-r8-1.lan]
ok: [rhel7-t1.private1]
ok: [rhel8-t1.private1]
ok: [rpm-repo-r8.private1]
ok: [rhel7-ansible.private1]

TASK [Update all installed packages using YUM module] *******************************************************************************************
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]

TASK [Remove packates not needed anymore] *******************************************************************************************************
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]

TASK [Reboot when packages were updated] ********************************************************************************************************
skipping: [rhel7-ansible.private1]
skipping: [rhel7-t1.private1]
skipping: [rhel8-t1.private1]
skipping: [rpm-repo-r8.private1]
skipping: [podhost-r8-1.lan]

PLAY [apt] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Update all installed packages using APT module] *******************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

TASK [Remove packages not needed anymore] *******************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Reboot when packages were updated] ********************************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

PLAY [ipkg] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [diskstation.lan]

TASK [Update the Packages installed on Diskstation] *********************************************************************************************
changed: [diskstation.lan]

PLAY RECAP **************************************************************************************************************************************
diskstation.lan            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pi-hole.lan                : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
podhost-r8-1.lan           : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
raspi-sht21.lan            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
rhel7-ansible.private1     : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel7-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel8-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rpm-repo-r8.private1       : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Como puede ver, mis máquinas RHEL ya estaban actualizadas. No hay nada que actualizar o eliminar y, por lo tanto, no es necesario reiniciar. Mi Raspberry Pis, por otro lado, tenía actualizaciones disponibles y se instalaron. Ambos dispositivos se reiniciaron después. La Diskstation tiene su estado cambiado , también. Pero tenga en cuenta que esto se debe a que estoy usando el command módulo, que devuelve cambiado cada vez que se ejecuta, independientemente de si algo en su nodo cambió.

[ Una guía gratuita de Red Hat:5 pasos para automatizar su negocio. ] 

Resumir

En este artículo, le mostré un ejemplo sencillo pero no muy sofisticado de cómo mantengo actualizados mis dispositivos Linux en casa usando la automatización de Ansible. Le muestra cómo usar los grupos de su inventario en diferentes jugadas de su libro de jugadas utilizando algunos de los módulos de Ansible y un comando simple.


Linux
  1. Cómo crear un libro de jugadas de Ansible

  2. Cómo agregar varios hosts en phpMyAdmin

  3. Cómo instalar Ansible en Oracle Linux 8

  4. ¿Cómo crear el libro de jugadas de Ansible para obtener versiones del sistema operativo de los hosts remotos?

  5. ¿Cómo puedo automatizar la limpieza y el restablecimiento del directorio de inicio de un usuario de Linux a un valor predeterminado?

Cómo instalar Ansible en Debian 9 (Stretch)

Cómo instalar Ansible en Ubuntu 16.04 (Xenial)

Cómo revertir una actualización de Windows

Cómo instalar el servidor Ansible en Ubuntu 18.04

Cómo instalar Ansible en Linux Mint 20

Cómo configurar un servidor doméstico