Ansible es una solución de automatización completa para su entorno de TI. Puede usar Ansible para automatizar la configuración de servidores Linux y Windows, orquestar el aprovisionamiento de servicios, implementar entornos en la nube e incluso configurar sus dispositivos de red.
Los módulos de Ansible resumen acciones en su sistema para que no tenga que preocuparse por los detalles de implementación. Simplemente describa el estado deseado y Ansible se asegura de que el sistema de destino coincida con él.
La disponibilidad de este módulo es uno de los principales beneficios de Ansible y, a menudo, se denomina Ansible con "baterías incluidas". De hecho, puede encontrar módulos para una gran cantidad de tareas y, si bien esto es excelente, con frecuencia escucho de principiantes que no saben por dónde empezar.
Aunque su elección de módulos dependerá exclusivamente de sus requisitos y de lo que intenta automatizar con Ansible, estos son los diez módulos principales que necesita para comenzar con Ansible para la automatización del sistema Linux.
1. copia
El módulo de copia le permite copiar un archivo desde el nodo de control de Ansible a los hosts de destino. Además de copiar el archivo, le permite establecer la propiedad, los permisos y las etiquetas de SELinux en el archivo de destino. Aquí hay un ejemplo del uso del módulo de copia para copiar un archivo de configuración de "mensaje del día" a los hosts de destino:
- name: Ensure MOTD file is in place
copy:
src: files/motd
dest: /etc/motd
owner: root
group: root
mode: 0644
Para contenido menos complejo, puede copiar el contenido directamente al archivo de destino sin tener un archivo local, como este:
- name: Ensure MOTD file is in place
copy:
content: "Welcome to this system."
dest: /etc/motd
owner: root
group: root
mode: 0644
Este módulo funciona de manera idempotente, lo que significa que solo copiará el archivo si el mismo archivo no está ya instalado con el mismo contenido y permisos.
El módulo de copia es una excelente opción para copiar una pequeña cantidad de archivos con contenido estático. Si necesita copiar una gran cantidad de archivos, eche un vistazo al módulo de sincronización. Para copiar archivos con contenido dinámico, eche un vistazo a la template
siguiente módulo.
2. plantilla
El módulo de plantilla funciona de manera similar a copy
módulo, pero procesa el contenido dinámicamente utilizando el lenguaje de plantillas Jinja2 antes de copiarlo en los hosts de destino.
Por ejemplo, defina una plantilla de "mensaje del día" que muestre el nombre del sistema de destino, así:
$ vi templates/motd.j2
Welcome to {{ inventory_hostname }}.
Luego, crea una instancia de esta plantilla usando la template
módulo, así:
- name: Ensure MOTD file is in place
template:
src: templates/motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
Antes de copiar el archivo, Ansible procesa la plantilla e interpola la variable, reemplazándola con el nombre del sistema host de destino. Por ejemplo, si el nombre del sistema de destino es rh8-vm03
, el archivo de resultado es:
Welcome to rh8-vm03.
Mientras que la copy
El módulo también puede interpolar variables al usar el content
parámetro, la template
El módulo permite una flexibilidad adicional mediante la creación de archivos de plantilla, que le permiten definir contenido más complejo, incluido for
bucles, if
condiciones, y más. Para obtener una referencia completa, consulte la documentación de Jinja2.
Este módulo también es idempotente y no copiará el archivo si el contenido en el sistema de destino ya coincide con el contenido de la plantilla.
3. usuario
El módulo de usuario le permite crear y administrar usuarios de Linux en su sistema de destino. Este módulo tiene muchos parámetros diferentes, pero en su forma más básica, puede usarlo para crear un nuevo usuario.
Por ejemplo, para crear el usuario ricardo
con UID 2001, parte de los grupos users
y wheel
y contraseña mypassword
, aplica el user
módulo con estos parámetros:
- name: Ensure user ricardo exists
user:
name: ricardo
group: users
groups: wheel
uid: 2001
password: "{{ 'mypassword' | password_hash('sha512') }}"
state: present
Tenga en cuenta que este módulo intenta ser idempotente, pero no puede garantizarlo para todas sus opciones. Por ejemplo, si vuelve a ejecutar el ejemplo del módulo anterior, restablecerá la contraseña al valor definido, cambiando el usuario en el sistema para cada ejecución. Para hacer que este ejemplo sea idempotente, use el parámetro update_password: on_create
, asegurándose de que Ansible solo establezca la contraseña al crear el usuario y no en ejecuciones posteriores.
También puede usar este módulo para eliminar un usuario configurando el parámetro state: absent
.
El user
El módulo tiene muchas opciones para que administres múltiples aspectos de usuario. Asegúrese de consultar la documentación del módulo para obtener más información.
4. paquete
El módulo de paquetes le permite instalar, actualizar o eliminar paquetes de software de su sistema de destino mediante el administrador de paquetes estándar del sistema operativo.
Por ejemplo, para instalar el servidor web Apache en una máquina Red Hat Linux, aplique el módulo de la siguiente manera:
- name: Ensure Apache package is installed
package:
name: httpd
state: present
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
Este módulo es independiente de la distribución y funciona utilizando el administrador de paquetes subyacente, como yum/dnf
para distribuciones basadas en Red Hat y apt
para Debian. Por eso, solo realiza tareas básicas como instalar y eliminar paquetes. Si necesita más control sobre las opciones del administrador de paquetes, use el módulo específico para la distribución de destino.
Además, tenga en cuenta que, aunque el módulo funciona en diferentes distribuciones, el nombre del paquete para cada uno puede ser diferente. Por ejemplo, en la distribución basada en Red Hat, el nombre del paquete del servidor web Apache es httpd
, mientras que en Debian, es apache2
. Asegúrese de que sus libros de jugadas se ocupen de eso.
Este módulo es idempotente y no actuará si el estado actual del sistema coincide con el estado deseado.
5. servicio
Use el módulo de servicio para administrar los servicios del sistema de destino usando el sistema de inicio requerido; por ejemplo, systemd.
En su forma más básica, todo lo que tiene que hacer es proporcionar el nombre del servicio y el estado deseado. Por ejemplo, para iniciar sshd
service, use el módulo así:
- name: Ensure SSHD is started
service:
name: sshd
state: started
También puede asegurarse de que el servicio se inicie automáticamente cuando el sistema de destino se inicie proporcionando el parámetro enabled: yes
.
Al igual que con el package
módulo, el service
El módulo es flexible y funciona en diferentes distribuciones. Si necesita ajustar el sistema de inicio de destino específico, use el módulo correspondiente; por ejemplo, el módulo systemd
.
Similar a los otros módulos que has visto hasta ahora, el service
módulo también es idempotente.
6. cortafuegos
Use el módulo firewalld para controlar el firewall del sistema con el firewalld
daemon en los sistemas que lo admiten, como las distribuciones basadas en Red Hat.
Por ejemplo, para abrir el servicio HTTP en el puerto 80, utilícelo así:
- name: Ensure port 80 (http) is open
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
También puede especificar puertos personalizados en lugar de nombres de servicio con port
parámetro. En este caso, asegúrese de especificar también el protocolo. Por ejemplo, para abrir el puerto TCP 3000, use esto:
- name: Ensure port 3000/TCP is open
firewalld:
port: 3000/tcp
state: enabled
permanent: yes
immediate: yes
También puede usar este módulo para controlar otros firewalld
aspectos como zonas o reglas complejas. Asegúrese de consultar la documentación del módulo para obtener una lista completa de opciones.
7. archivo
El módulo de archivos le permite controlar el estado de los archivos y directorios, estableciendo permisos, propiedad y etiquetas de SELinux.
Por ejemplo, use el file
módulo para crear un directorio /app
propiedad del usuario ricardo
, con permisos de lectura, escritura y ejecución para el propietario y el grupo users
:
- name: Ensure directory /app exists
file:
path: /app
state: directory
owner: ricardo
group: users
mode: 0770
También puede usar este módulo para establecer propiedades de archivo en directorios recursivamente usando el parámetro recurse: yes
o elimine archivos y directorios con el parámetro state: absent
.
Este módulo funciona con idempotencia para la mayoría de sus parámetros, pero algunos de ellos pueden hacer que cambie la ruta de destino cada vez. Consulte la documentación para obtener más detalles.
8. archivo de línea
El módulo lineinfile le permite administrar líneas individuales en archivos existentes. Es útil actualizar la configuración específica en archivos existentes sin cambiar el resto del archivo o copiar el archivo de configuración completo.
Por ejemplo, agregue una nueva entrada a su archivo de hosts como esta:
- name: Ensure host rh8-vm03 in hosts file
lineinfile:
path: /etc/hosts
line: 192.168.122.236 rh8-vm03
state: present
También puede usar este módulo para cambiar una línea existente aplicando el parámetro regexp
para buscar una línea existente para reemplazar. Por ejemplo, actualice el sshd_config
archivo para evitar el inicio de sesión de root modificando la línea PermitRootLogin yes
a PermitRootLogin no
:
- name: Ensure root cannot login via ssh
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: PermitRootLogin no
state: present
Nota:Use el módulo de servicio para reiniciar el servicio SSHD para habilitar este cambio.
Este módulo también es idempotente, pero, en caso de modificación de línea, asegúrese de que la expresión regular coincida con los estados original y actualizado para evitar cambios innecesarios.
9. desarchivar
Use el módulo de desarchivado para extraer el contenido de archivos comprimidos como tar
o zip
archivos De forma predeterminada, copia el archivo comprimido desde el nodo de control a la máquina de destino antes de extraerlo. Cambie este comportamiento proporcionando el parámetro remote_src: yes
.
Por ejemplo, extraiga el contenido de un .tar.gz
archivo que ya se ha descargado en el host de destino con esta sintaxis:
- name: Extract contents of app.tar.gz
unarchive:
src: /tmp/app.tar.gz
dest: /app
remote_src: yes
Algunas tecnologías de archivo requieren paquetes adicionales para estar disponibles en el sistema de destino; por ejemplo, el paquete unzip
para extraer .zip
archivos.
Según el formato de archivo utilizado, este módulo puede o no funcionar de manera idempotente. Para evitar cambios innecesarios, puede utilizar el parámetro creates
para especificar un archivo o directorio que este módulo crearía al extraer el contenido del archivo. Si este archivo o directorio ya existe, el módulo no vuelve a extraer el contenido.
10. comando
El módulo de comando es flexible y le permite ejecutar comandos arbitrarios en el sistema de destino. Con este módulo, puede hacer casi cualquier cosa en el sistema de destino siempre que haya un comando para ello.
Aunque el comando command
El módulo es flexible y potente, debe usarse con precaución. Evite usar el módulo de comando para ejecutar una tarea si hay otro módulo apropiado disponible para eso. Por ejemplo, podría crear usuarios usando el comando command
módulo para ejecutar el useradd
comando, pero debería usa el user
en su lugar, ya que abstrae muchos detalles de usted, se ocupa de los casos de esquina y garantiza que la configuración solo cambie cuando sea necesario.
Para los casos en los que no hay módulos disponibles, o para ejecutar scripts o programas personalizados, el comando command
El módulo sigue siendo un gran recurso. Por ejemplo, use este módulo para ejecutar un script que ya está presente en la máquina de destino:
- name: Run the app installer
command: "/app/install.sh"
De forma predeterminada, este módulo no es idempotente, ya que Ansible ejecuta el comando cada vez. Para hacer el command
módulo idempotente, puede usar when
condiciones para ejecutar el comando solo si existe la condición apropiada, o creates
argumento, similar al ejemplo del módulo de desarchivado.
¿Qué sigue?
Con estos módulos, puede configurar sistemas Linux completos copiando, creando plantillas o modificando archivos de configuración, creando usuarios, instalando paquetes, iniciando servicios del sistema, actualizando el firewall y más.
Si es nuevo en Ansible, asegúrese de consultar la documentación sobre cómo crear playbooks para combinar estos módulos para automatizar su sistema. Algunas de estas tareas requieren ejecutarse con privilegios elevados para funcionar. Para obtener más detalles, consulte la documentación sobre escalada de privilegios.
A partir de Ansible 2.10, los módulos se organizan en colecciones. La mayoría de los módulos de esta lista forman parte de ansible.builtin
y están disponibles de forma predeterminada con Ansible, pero algunos de ellos forman parte de otras colecciones. Para obtener una lista de colecciones, consulte la documentación de Ansible.