La automatización es el gran ideal de TI y DevOps, pero en mi experiencia, cualquier cosa que no sea conveniente de inmediato puede no existir en absoluto. Ha habido muchas ocasiones en las que se me ocurrió una solución bastante buena para alguna tarea, e incluso la escribiré, pero no llegué a automatizarla literalmente porque la infraestructura para una automatización sencilla no existe en la máquina. Estoy trabajando.
Más sobre Ansible
- Una guía de inicio rápido de Ansible
- Hoja de trucos de Ansible
- Curso en línea gratuito:conceptos básicos de Ansible
- Descargar e instalar Ansible
- eBook:La empresa automatizada
- Libro electrónico:Ansible para DevOps
- Libros electrónicos gratuitos de Ansible
- Últimos artículos de Ansible
Mi herramienta de automatización fácil favorita solía ser el sistema cron:antiguo, confiable, orientado al usuario y (aparte de una sintaxis de programación que nunca puedo memorizar) simple. Sin embargo, el problema con cron es que asume que una computadora está encendida las 24 horas del día, todos los días. Después de perderme demasiadas copias de seguridad programadas, descubrí anacron, el sistema cron basado en marcas de tiempo en lugar de horarios programados. Si su computadora está apagada cuando normalmente se habría ejecutado un trabajo, anacron se asegura de que se ejecute cuando la computadora vuelva a encenderse. Crear un trabajo es tan fácil como colocar un script de shell en uno de los tres directorios:cron.daily
, cron.weekly
, o cron.monthly
(puedes definir más si quieres). Con anacron, me encuentro colocando scripts y playbooks de Ansible en su lugar para todo tipo de tareas triviales, incluidos recordatorios emergentes de próximas fechas de vencimiento o eventos.
Es una solución simple y obvia para un problema moderno, pero no me sirve de nada si Anacron no está instalado en la computadora.
Configuración del software con Ansible
Cada vez que configuro una computadora nueva, ya sea una computadora portátil, una estación de trabajo o un servidor, instalo anacron. Eso es fácil, pero una instalación de anacron solo proporciona el comando anacron. No configura el entorno de usuario de anacron. Así que creé un libro de jugadas de Ansible para configurar lo que el usuario necesita para usar anacron e instalar el comando anacron.
En primer lugar, el modelo estándar de Ansible:
---
- hosts: localhost
tasks:
Creación de directorios con Ansible
A continuación, creo el árbol de directorios que uso para anacron. Puedes pensar en esto como una especie de crontab transparente.
- name: create directory tree
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- '~/.local/etc/cron.daily'
- '~/.local/etc/cron.weekly'
- '~/.local/etc/cron.monthly'
- '~/.var/spool/anacron'
La sintaxis de esto puede parecer un poco extraña, pero en realidad es un bucle. El with_items:
directiva define cuatro directorios para crear, y Ansible itera sobre el ansible.builtin.file:
directiva una vez para cada directorio (el nombre del directorio llena el {{ item }}
variable). Como con todo en Ansible, no hay error ni conflicto si el directorio ya existe.
Copiar archivos con Ansible
ansible.builtin.copy
El módulo copia archivos de una ubicación a otra. Para que esto funcione, necesitaba crear un archivo llamado anacrontab
. No es un libro de jugadas de Ansible, así que lo guardo en mi ~/Ansible/data
directorio, donde guardo archivos de soporte para mis libros de jugadas.
- name: copy anacrontab into place
ansible.builtin.copy:
src: ~/Ansible/data/anacrontab
dest: ~/.local/etc/anacrontab
mode: '0755'
Mi anacrontab
El archivo es simple e imita el que algunas distribuciones instalan por defecto en /etc/anacron
:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1 0 cron.day run-parts $HOME/.local/etc/cron.daily/
7 0 cron.wek run-parts $HOME/.local/etc/cron.weekly/
30 0 cron.mon run-parts $HOME/.local/etc/cron.monthly/
Ejecutando anacron al iniciar sesión
La mayoría de las distribuciones de Linux configuran anacron para leer trabajos de /etc/anacron
. Principalmente uso anacron como usuario regular, así que ejecuto anacron desde mi inicio de sesión ~/.profile
. No quiero tener que acordarme de configurarlo yo mismo, así que hago que Ansible lo haga. Uso el ansible.builtin.lineinfile
módulo, que crea ~/.profile
si aún no existe e inserta la línea de inicio de anacron.
- name: add local anacrontab to .profile
ansible.builtin.lineinfile:
path: ~/.profile
regexp: '^/usr/sbin/anacron'
line: '/usr/sbin/anacron -t ~/.local/etc/anacrontab'
create: true
Instalación de Anacron con Ansible
Para la mayoría de mis sistemas, dnf
funcionaría para la instalación del paquete, pero mi estación de trabajo ejecuta Slackware (que usa slackpkg
) y, a veces, una distribución de Linux diferente se abre paso en mi colección. El ansible.builtin.package
El módulo proporciona una interfaz genérica para la instalación del paquete, por lo que lo uso para este libro de jugadas. Afortunadamente, no he encontrado un repositorio que nombre anacron
cualquier cosa menos anacron
, por lo que por ahora no tengo que tener en cuenta las posibles diferencias en los nombres de los paquetes.
En realidad, esta es una jugada separada porque la instalación del paquete requiere una escalada de privilegios, proporcionada por el becomes: true
directiva.
- hosts: localhost
become: true
tasks:
- name: install anacron
ansible.builtin.package:
name: anacron
state: present
Uso de anacron y Ansible para una fácil automatización
Para instalar anacron con Ansible, ejecuto el libro de jugadas:
$ ansible-playbook ~/Ansible/setup-anacron.yaml
A partir de ese momento, puedo escribir scripts de shell para realizar tareas triviales pero repetitivas y copiarlas en ~/.local/etc/cron.daily
para que se ejecute automáticamente una vez al día (o más o menos). También escribo playbooks de Ansible para tareas como limpiar mi carpeta de descargas. Coloco mis libros de jugadas en ~/Ansible
, que es donde guardo mis reproducciones de Ansible y luego creo un script de shell en ~/.local/etc/cron.daily
para ejecutar la jugada. Es fácil, indoloro y rápidamente se convierte en una segunda naturaleza.