Ansible es una herramienta de administración de configuración y aprovisionamiento de software de código abierto para sistemas operativos similares a Unix y Microsoft Windows.
A diferencia de Puppet, Chef y CFEngine, el software del servidor se instala en una máquina y las máquinas cliente se administran a través del software del agente. Donde Ansible, los nodos se administran controlando el nodo (servidor de Ansible) a través de SSH, por lo que no habrá ningún software de agente ejecutándose en las máquinas de nodos administrados (servidores de clientes).
Ansible puede realizar la implementación y la gestión de la configuración del software en cientos de nodos mediante SSH; normalmente, toda la operación se ejecuta con un único comando ansible. Pero, en algunos casos, es posible que necesite ejecutar varios comandos para la implementación.
Nombre de host | Dirección IP | SO | Propósito |
servidor.itzgeek.local | 192.168.0.10 | CentOS 8/RHEL 8 | Máquina de control |
nodo1.itzgeek.local | 192.168.0.20 | CentOS 8 | Nodo administrado 1 |
nodo2.itzgeek.local | 192.168.0.30 | CentOS 7 | Nodo administrado 2 |
Instalar Ansible en CentOS 8/RHEL 8
Nodo de control de configuración
Para instalar Ansible, tendremos que habilitar EPEL y el repositorio de Ansible en CentOS 8 y RHEL 8, respectivamente.
### CentOS 8 ###
yum install -y epel-release
### RHEL 8 ###
subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms
Instale Ansible con el comando yum.
yum install -y ansible
Una vez que Ansible esté instalado, verifique la versión de Ansible ejecutando el siguiente comando.
ansible --version
Salida:
ansible 2.8.5
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, May 21 2019, 23:51:36) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
Configurar nodo administrado
Las máquinas cliente deben tener al menos Python 2 (versión 2.6 o posterior) o Python 3 (versión 3.5 o posterior).
### CentOS 8 / RHEL 8 ###
yum install -y platform-python
### CentOS 7 / RHEL 7 ###
yum install -y python
SELinux
Si tiene SELinux habilitado en los nodos administrados, deberá instalar el siguiente paquete en los nodos antes de usar cualquier función relacionada con la copia/archivo/plantilla en Ansible.
### CentOS 8 / RHEL 8 ###
yum install -y python3-libselinux
### CentOS 7 / RHEL 7 ###
yum install -y libselinux-python
Autenticación SSH
Como se dijo anteriormente, Ansible usa OpenSSH nativo para la comunicación remota. Ansible admite la autenticación con contraseña y sin contraseña para ejecutar comandos en nodos administrados.
Aquí, para esta demostración, he usado comunicación sin contraseña entre el nodo de control ansible (raíz) y los nodos administrados (raíz). Sin embargo, le mostraré cómo usar Ansible con autenticación de contraseña.
Autenticación de clave SSH (Autenticación sin contraseña)
Cuando se trata de autenticación ssh, de forma predeterminada, utiliza claves ssh (autenticación sin contraseña) para autenticarse con la máquina remota.
LEER :Cómo configurar el inicio de sesión sin contraseña SSH en CentOS 8 / RHEL 8
LEER :Cómo configurar el inicio de sesión sin contraseña SSH en CentOS 7 / RHEL 7
Como sabe, el aprovisionamiento de software o los cambios de configuración que realiza en los nodos requieren privilegios de raíz o privilegios de raíz equivalentes (sudo). Por lo tanto, configure la comunicación sin contraseña entre el usuario raíz del servidor Ansible y el usuario raíz de los nodos para simplificar. Autenticación de contraseña
La autenticación de contraseña también se puede usar cuando sea necesario proporcionando la opción –ask-pass. Esta opción requiere sshpass a la máquina de control.
yum install -y sshpass
Crear inventario de Ansible
El archivo /etc/ansible/hosts contiene el inventario de hosts remotos a los que Ansible se conectará a través de SSH/Winrm (Windows) para administrarlos. En este momento solo veremos cómo administrar las configuraciones del nodo Linux remoto.
Edite el archivo de inventario.
vi /etc/ansible/hosts
Ingrese la dirección IP o el nombre de host de uno o más sistemas remotos. Puedes agrupar servidores con [GROUP_NAME]. Aquí, he agregado ambas máquinas al grupo de servidores de demostración.
Los grupos se utilizan para clasificar los sistemas para un uso particular. Si no especifica ningún grupo, actuarán como hosts no agrupados.
[demoservers]
192.168.0.20
192.168.0.30
Comprobar la conectividad de Ansible
Verifiquemos la conectividad de los nodos usando ping (módulo) de la máquina de control. Para ello, utilizaremos el comando ansible con las opciones -m (cargar módulo) y all (todos los servidores) o demoservers (un grupo de nodos).
Este módulo de ping se usa a menudo para solucionar problemas de conectividad de Ansible. # All servers - If you use passwordless authentication. Current logged in user on Ansible server and remote node's user are same
ansible -m ping all
# All servers - If you use passwordless authentication and the remote user is different from logged in user on Ansible server
ansible -m ping -u raj all
# All servers - If you use password authentication and the remote user is different from logged in user on Ansible server
ansible -m ping all -u raj --ask-pass
# Only demoservers group - If you use passwordless authentication. Current logged in user on Ansible server and remote node's user are same
ansible -m ping demoservers
Salida:
192.168.1.20 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.30 | SUCCESS => {
"changed": false,
"ping": "pong"
}
En el ejemplo anterior, hemos visto cómo usar el módulo ping con el comando ansible para hacer ping a todos o a un grupo de hosts remotos con autenticación sin contraseña y con contraseña.
De la misma manera, podemos usar varios módulos con comando ansible. Puede encontrar los módulos disponibles aquí.
Ejecutar comando en nodos
Esta vez, usaremos el módulo de comando con el comando ansible para obtener información de la máquina remota.
Los siguientes comandos están escritos asumiendo que tiene comunicación sin contraseña entre el nodo de control y los nodos administrados. Estoy usando un grupo de servidores de demostración para ejecutar comandos. Comprobar nombre de host
En nuestro primer ejemplo, ejecutaremos el comando hostname con el módulo de comando para obtener el nombre del host de los nodos remotos de una sola vez.
ansible -m command -a "hostname" demoservers
Salida:
192.168.1.30 | SUCCESS | rc=0 >>
node2.itzgeek.local
192.168.1.20 | SUCCESS | rc=0 >>
node1.itzgeek.local
Comprobar el tiempo de actividad
Para verificar el tiempo de actividad de los nodos.
ansible -m command -a "uptime" demoservers
Salida:
192.168.1.30 | SUCCESS | rc=0 >>
16:36:45 up 56 min, 3 users, load average: 0.00, 0.00, 0.00
192.168.1.20 | SUCCESS | rc=0 >>
16:36:45 up 1:09, 2 users, load average: 0.05, 0.04, 0.05
Leer archivos remotos
También puede ver el contenido de un archivo en particular.
ansible -m command -a "cat /etc/hosts" demoservers
Salida:
192.168.1.30 | SUCCESS | rc=0 >>
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 127.0.0.53
192.168.1.20 | SUCCESS | rc=0 >>
# Generated by NetworkManager
search itzgeek.local
nameserver 8.8.8.8
nameserver 192.168.1.1
Redireccionar salida de archivo
También puede guardar la salida (en el servidor Ansible) en cualquier archivo mediante la redirección.
ansible -m command -a "cat /etc/resolv.conf" demoservers > /tmp/ouput_file
cat /tmp/ouput_file
Realizar cambios de configuración en el nodo
Podemos usar el módulo lineinfile para editar archivos en nodos remotos. Por ejemplo, para agregar servidores de nombres adicionales, podemos usar el siguiente comando.
ansible -m lineinfile -a "path=/etc/resolv.conf line=nameserver 8.8.4.4" demoservers
Puede validar los cambios usando el siguiente comando.
ansible -m command -a "cat /etc/resolv.conf | grep -i nameserver" demoservers
Conclusión
Eso es todo. Ahora ha instalado correctamente Ansible en CentOS 8/RHEL 8. Puede proceder a crear libros de jugadas de Ansible para automatizar sus tareas.