Ansible ha simplificado la automatización y se ha convertido en el lenguaje de automatización universal. Por ahora, los beneficios son bien conocidos en la comunidad de TI. Sin embargo, como todas las buenas tecnologías, puede haber desafíos que enfrentar o enfoques que combinar. Considere usar archivos de valores separados por comas (CSV) y Ansible para crear cuentas de usuario de Linux.
En este artículo, el objetivo es automatizar la creación de usuarios con Ansible. Se puede pasar una lista de usuarios a través de un archivo de variable externo usando vars_files
o directamente en el libro de jugadas mediante un bucle. El problema surge cuando la lista de usuarios a crear solo está disponible en un formato como CSV mientras que el desarrollador de Ansible se siente más cómodo usando una lista YAML. Personalmente, he experimentado situaciones en las que se proporciona una lista de usuarios que incluye contraseñas en un archivo CSV con el requisito de crear esos usuarios en varias máquinas Linux utilizando una herramienta de automatización como Ansible.
[ También te puede interesar: Automatización de la implementación de máquinas virtuales con Ansible:Diseño ]
¿Cuál es la solución?
Afortunadamente, Ansible viene con más de mil módulos, incluido uno para leer archivos CSV. Este módulo puede proporcionar exactamente lo que se necesita para esta tarea. Verá el módulo en acción a continuación.
Considere el archivo CSV que incluye varios campos, como Nombre de usuario , UID , Nombres , Apellidos , Grupos y Contraseña mostrado a continuación. El requisito es crear todos estos usuarios con su información relevante en múltiples servidores Linux.
Username,UID,First_name,Last_name,Groups,Password
booker12,9012,Rachel,Booker,Operations,iambooker
grey07,2070,Laura,Grey,Developers,iamgrey
johnson81,4081,Craig,Johnson,Operations,iamjohnson
jenkins46,9346,Mary,Jenkins,Developers,iamjenkins
smith79,5079,Jamie,Smith,Operations,iamsmith
Paso 1
Ahora que tiene un archivo CSV, el siguiente paso es hacer que Ansible lea este archivo CSV. Para lograr esto, utilice el read_csv módulo. Para imprimir cómo Ansible ha analizado el CSV, use la depuración módulo. Observe el uso de delegate_to:localhost en la primera tarea. Esto se debe a que el archivo username.csv
está presente en el nodo de control y no en los hosts administrados. Ansible analiza este CSV en un formato de lista con varios diccionarios dentro. Es por eso que necesita agregar la subvariable lista hasta el final de su variable registrada original user_list .
---
- name: create users from csv file
hosts: all
tasks:
- name: reading the csv file
read_csv:
path: username.csv
register: user_list
delegate_to: localhost
- name: display user_list data
debug:
var: user_list.list
Paso 2
A medida que ejecuta este libro de jugadas, verá que la salida contiene una lista, como lo indica el par de corchetes. Esta lista incluye además un diccionario, que se indica mediante corchetes. Cada fila del archivo CSV se ha convertido en un diccionario, según la separación de comas entre ellas. Un diccionario se utiliza para almacenar datos en un par de claves y valores. Por ejemplo, la clave es First_name y el valor es Rachel .
ok: [192.168.0.3] => {
"user_list.list": [
{
"First_name": "Rachel",
"Groups": "Operations",
"Last_name": "Booker",
"Password": "iambooker",
"UID": "9012",
"Username": "booker12"
},
{
"First_name": "Laura",
"Groups": "Developers",
"Last_name": "Grey",
"Password": "iamgrey",
"UID": "2070",
"Username": "grey07"
},
{
"First_name": "Craig",
"Groups": "Operations",
"Last_name": "Johnson",
"Password": "iamjohnson",
"UID": "4081",
"Username": "johnson81"
},
-------OUTPUT OMITTED-------
}
]
}
Paso 3
Puede leer e imprimir correctamente el archivo CSV a través de Ansible. Ahora es el momento de intentar extraer uno de estos valores para ver si puede manipular este diccionario para satisfacer las necesidades del usuario. módulo en Ansible. Prueba algo básico como extraer el valor del Nombre de usuario clave para todos los diccionarios dentro de esta lista. Para ello, utilizará el nombre de usuario del diccionario. key como una subvariable para su bucle Ansible.
----OUTPUT OMITTED----
- name: extract Username from all dictionaries
debug:
msg: "{{ item.Username }}"
loop: "{{ user_list.list }}"
ok: [192.168.0.3] => (item={'Username': 'booker12', 'UID': '9012', 'First_name': 'Rachel', 'Last_name': 'Booker', 'Groups': 'Operations', 'Password': 'iambooker'}) => {
"msg": "booker12"
}
ok: [192.168.0.3] => (item={'Username': 'grey07', 'UID': '2070', 'First_name': 'Laura', 'Last_name': 'Grey', 'Groups': 'Developers', 'Password': 'iamgrey'}) => {
"msg": "grey07"
}
----OUTPUT OMITTED----
Como puede ver aquí, extrajo el Nombre de usuario valores de los diccionarios. Usando el mismo concepto, puede poner estos valores en el nombre campo del usuario módulo para crear los usuarios.
Paso 4
Ahora que ha extraído el valor de la clave deseada, debería poder trabajar con todos los pares de clave y valor. Póngalos en el usuario Módulo para crear tus usuarios con toda la información requerida. Observe la contraseña opción del módulo de usuario. Contiene un filtro para encriptar la Contraseña valor utilizando el algoritmo SHA-512. Esto se hace porque RHEL8 usa SHA-512 para cifrar las contraseñas de los usuarios. Esta contraseña se almacena en un formato encriptado en el /etc/shadow
archivo en los hosts administrados. Además, el comentario contiene dos variables porque desea que GECOS (Comentarios del usuario) campo del usuario para tener su nombre y apellido. Por ejemplo, el usuario booker12 tendrán sus GECOS como "Rachel Booker". Además, está utilizando la escalada de privilegios en esta tarea porque la creación de usuarios requiere privilegios de root.
-----OUTPUT OMITTED-----
- name: create users from the csv
user:
name: "{{ item.Username }}"
uid: "{{ item.UID }}"
groups: "{{ item.Groups }}"
append: true
password: "{{ item.Password | password_hash('sha512') }}"
comment: "{{ item.First_Name }} {{ item.Last_Name }}"
state: present
loop: "{{ user_list.list }}"
become: true
[ Un curso gratuito para usted:Resumen técnico de virtualización y migración de infraestructura. ]
Resumir
Ha creado con éxito los usuarios dados con su UID , Grupos , Contraseña y GECOS extrayendo los valores deseados de un archivo CSV. Esto es útil porque la mayoría de las organizaciones usan formatos como CSV para almacenar y administrar sus datos. Un desarrollador de Ansible que puede manipular archivos CSV puede administrar de manera eficiente su entorno sin escribir todo desde cero directamente en el libro de jugadas o en un archivo YAML de variable externa. Para administrar más eficazmente su entorno, recomendaría usar Ansible Tower, que es la solución Ansible empresarial que ofrece Red Hat. Tal vez opte también por la oferta de capacitación DO447 - Automatización avanzada:Mejores prácticas de Ansible.