Del mismo modo, si hay actualizaciones del kernel que requieren reiniciar el sistema operativo, sería mejor usar el módulo de reinicio ansible para reiniciar la máquina, esperar a que se apague, volver a encender y responder a los comandos
En esta guía, crearemos un script para actualizar el caché de los sistemas basados en Debian y actualizar los paquetes instalados. También incluiremos una tarea para reiniciar el servidor si hubiera actualizaciones del kernel que requieran reiniciar.
Compruebe también:
- SSH:generar y trabajar con claves ssh
Tabla de contenido
- Uso del módulo apt de Ansible para actualizar todos los paquetes
- Reiniciar el sistema si hay actualizaciones del kernel
- Creando archivo de hosts
- Todo el libro de jugadas
- Ejecutar el libro de jugadas
1. Uso del módulo apt de Ansible para actualizar todos los paquetes
Antes de realizar una actualización de paquete en sistemas basados en Debian, siempre se recomienda realizar una actualización de caché apt. Esto se puede lograr usando este comando:
sudo apt-get update
Podemos lograr lo mismo usando Ansible con esta tarea:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
donde,
- update_cache:sí – Ejecute el equivalente a
apt-get update
comando en todos los servidores - force_apt_get:sí – No use el comando aptitude, en su lugar use el comando apt-get en las cajas de Debian/Ubuntu
- cache_valid_time:3600 – Actualice el caché apt si es anterior al
cache_valid_time
. Esta opción se establece en segundos. En estos ejemplos, se establece en 3600 segundos.
A continuación hacemos la actualización. Normalmente ejecutamos este comando apt-get para lograr la función:
sudo apt-get upgrade -y
Esta es la tarea de Ansible para lograr la actualización:
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
donde,
- actualizar:dist – Ejecute el equivalente de
apt-get upgrade
comando en todos los servidores Ubuntu o Debian Linux. En otras palabras, actualice todos los paquetes a la última versión. - force_apt_get:sí – Utilice apt-get en lugar de aptitude.
2. Reiniciar el sistema si hay actualizaciones del kernel
Si hay actualizaciones de Kernel, necesitaríamos reiniciar el sistema para aplicar esos cambios. Si se requiere un reinicio, un archivo con esta ruta /var/run/reboot-required
se creará.
Lo que nos gustaría hacer es verificar si ese archivo existe, luego reiniciar el sistema. Podemos registrar una nueva variable si el archivo /var/run/reboot-required existe en el sistema usando la estadística ansible:
- name: Check if a reboot is needed on all servers register: reboot_required_file stat: path: /var/run/reboot-required get_md5: no
donde:
- registro:reboot_required_file – El
register
La palabra clave decide en qué variable guardar un resultado y la usaremos de la siguiente manera para reiniciar el cuadro. - estadística:ruta:/var/run/reboot-required – Determinar si existe una ruta (/var/run/reboot-required)
- get_md5:no – Algoritmo para determinar la suma de verificación del archivo. En este ejemplo, estoy usando md5, pero puedes usar sha1, sha224, sha256, sha384 y sha512.
Ahora que sabemos si el servidor debe reiniciarse o no, agreguemos una tarea para reiniciar el servidor si el archivo existe:
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
donde,
- test_command:tiempo de actividad – Ejecute el comando uptime en el servidor reiniciado y espere el éxito para determinar que la máquina está lista para otras tareas.
- cuando:reboot_required_file.stat.exists – Primero, verifique que el archivo llamado /var/run/reboot-required exista usando una variable llamada reboot_required_file. El módulo de reinicio solo funcionará si ese archivo existe y se aplica usando la condición de Ansible 'cuando:reboot_required_file.stat.exists'.
3. Creando el archivo de hosts
Ahora que tenemos la lógica en su lugar, creemos un archivo hosts.yaml. Guarde este contenido en un archivo llamado hosts.yaml
.
all:
hosts:
ubuntusrv:
ansible_ssh_host: 10.2.11.10
ansible_ssh_user: ubuntu
debiansrv:
ansible_ssh_host: 10.2.11.11
ansible_ssh_user: admin
children:
allservers:
hosts:
ubuntusrv:
debiansrv:
4. Todo el libro de jugadas
Podemos poner toda la lógica en un libro de jugadas. Guarde este contenido en el archivo upgrade.yaml
---
- name: Playbook to Update cache, upgrade packages and reboot os if necessary
hosts: allservers
become: yes
gather_facts: False
tasks:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
- name: Check if a reboot is needed on all servers
register: reboot_required_file
stat:
path: /var/run/reboot-required
get_md5: no
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
5. Ejecutando el libro de jugadas
Asegúrate de configurar las claves ssh y ejecutarlo de la siguiente manera:
ansible-playbook -i hosts.yaml upgrade.yaml -vv
Esta es la salida en mi servidor
➜ ansible-playbook -i hosts.yaml upgrade.yaml -vv
ansible-playbook [core 2.12.1]
config file = /Users/etowett/.ansible.cfg
configured module search path = ['/Users/etowett/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /Library/Python/3.8/site-packages/ansible
ansible collection location = /Users/etowett/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible-playbook
python version = 3.8.2 (default, Apr 8 2021, 23:19:18) [Clang 12.0.5 (clang-1205.0.22.9)]
jinja version = 3.0.3
libyaml = True
Using /Users/etowett/.ansible.cfg as config file
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
PLAYBOOK: upgrade.yaml ************************************************************************************************************************************************************
1 plays in upgrade.yaml
PLAY [Playbook to Update cache, upgrade packages and reboot os if necessary] ******************************************************************************************************
META: ran handlers
TASK [Update apt repo and cache on all Debian/Ubuntu boxes] ***********************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:7
changed: [ubuntusrv] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "cache_update_time": 1639737368, "cache_updated": true, "changed": true}
TASK [Upgrade all packages on servers] ********************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:13
ok: [ubuntusrv] => {"changed": false, "msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stderr": "", "stderr_lines": [], "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stdout_lines": ["Reading package lists...", "Building dependency tree...", "Reading state information...", "Calculating upgrade...", "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."]}
TASK [Check if a reboot is needed on all servers] *********************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:18
ok: [ubuntusrv] => {"changed": false, "stat": {"atime": 1639737351.6237016, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "us-ascii", "checksum": "20f7959b87e8cd55b7c985e46d6fa38a4063037d", "ctime": 1639679787.0725238, "dev": 26, "device_type": 0, "executable": false, "exists": true, "gid": 0, "gr_name": "root", "inode": 1143, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "text/x-diff", "mode": "0644", "mtime": 1639679787.0725238, "nlink": 1, "path": "/var/run/reboot-required", "pw_name": "root", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 32, "uid": 0, "version": null, "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}}
TASK [Reboot the server if kernel updated] ****************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:24
changed: [ubuntusrv] => {"changed": true, "elapsed": 73, "rebooted": true}
META: ran handlers
META: ran handlers
PLAY RECAP ************************************************************************************************************************************************************************
ubuntusrv : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Conclusión
Aprendió a actualizar todos los paquetes en sus cajas de Debian y Ubuntu Linux y a reiniciar el servidor si es necesario utilizando los libros de jugadas de Ansible.