Ansible a simplifié l'automatisation et est devenu le langage d'automatisation universel. À l'heure actuelle, les avantages sont bien connus dans la communauté informatique. Cependant, comme toutes les bonnes technologies, il peut y avoir des défis à relever ou des approches à combiner. Envisagez d'utiliser des fichiers CSV (valeurs séparées par des virgules) et Ansible pour créer des comptes utilisateur Linux.
Dans cet article, l'objectif est d'automatiser la création d'utilisateurs à l'aide d'Ansible. Une liste d'utilisateurs peut être transmise via un fichier de variable externe en utilisant vars_files
ou directement dans le playbook à l'aide d'une boucle. Le problème se pose lorsque la liste des utilisateurs à créer n'est disponible qu'au format CSV alors que le développeur Ansible est plus à l'aise avec une liste YAML. J'ai personnellement rencontré des situations où une liste d'utilisateurs comprenant des mots de passe est fournie dans un fichier CSV avec l'obligation de créer ces utilisateurs sur plusieurs machines Linux à l'aide d'un outil d'automatisation tel qu'Ansible.
[ Vous pourriez également aimer : Automatiser le déploiement de machines virtuelles avec Ansible :Conception ]
Quelle est la solution ?
Heureusement, Ansible est livré avec plus d'un millier de modules, dont un pour lire les fichiers CSV. Ce module peut fournir exactement ce qui est nécessaire pour cette tâche. Vous verrez le module en action ci-dessous.
Considérez le fichier CSV qui comprend plusieurs champs tels que Nom d'utilisateur , UID , Prénoms , Noms de famille , Groupes , et Mot de passe indiqué ci-dessous. L'exigence est de créer tous ces utilisateurs avec leurs informations pertinentes sur plusieurs serveurs 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
Étape 1
Maintenant que vous avez un fichier CSV, l'étape suivante consiste à demander à Ansible de lire ce fichier CSV. Pour ce faire, utilisez le read_csv module. Pour imprimer comment Ansible a analysé le CSV, utilisez le debug module. Notez l'utilisation de delegate_to :localhost dans la première tâche. C'est parce que le fichier username.csv
est présent sur le nœud de contrôle et non sur les hôtes gérés. Ansible analyse ce CSV dans un format de liste avec plusieurs dictionnaires à l'intérieur. C'est pourquoi vous devez ajouter la sous-variable list à la fin de votre variable enregistrée d'origine 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
Étape 2
Lorsque vous exécutez ce playbook, vous verrez que la sortie contient une liste, comme indiqué par la paire de parenthèses. Cette liste comprend en outre un dictionnaire, qui est indiqué par les accolades. Chaque ligne du fichier CSV a été convertie en dictionnaire, sur la base de la séparation par virgule entre elles. Un dictionnaire est utilisé pour stocker des données dans une paire de clés et de valeurs. Par exemple, la clé est First_name , et la valeur est 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-------
}
]
}
Étape 3
Vous êtes en mesure de lire et d'imprimer le fichier CSV avec succès via Ansible. Il est maintenant temps d'essayer d'extraire l'une de ces valeurs pour voir si vous pouvez manipuler ce dictionnaire en fonction des besoins de l'utilisateur module dans Ansible. Essayez quelque chose de basique comme extraire la valeur du nom d'utilisateur key pour tous les dictionnaires de cette liste. Pour ce faire, vous utiliserez le nom d'utilisateur du dictionnaire key comme sous-variable pour votre boucle 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----
Comme vous pouvez le voir ici, vous avez extrait le nom d'utilisateur valeurs des dictionnaires. En utilisant le même concept, vous pouvez mettre ces valeurs dans le nom champ de l'utilisateur module pour créer les utilisateurs.
Étape 4
Maintenant que vous avez extrait la valeur de la clé souhaitée, vous devriez pouvoir travailler avec toutes les paires clé et valeur. Mettez-les dans l'utilisateur module pour créer vos utilisateurs avec toutes les informations requises. Remarquez le mot de passe option du module utilisateur. Il contient un filtre pour chiffrer le Mot de passe valeur à l'aide de l'algorithme SHA-512. Ceci est fait parce que RHEL8 utilise SHA-512 pour chiffrer les mots de passe des utilisateurs. Ce mot de passe est stocké dans un format crypté dans le /etc/shadow
fichier sur les hôtes gérés. En outre, le commentaire l'option contient deux variables car vous voulez que le GECOS (Commentaires de l'utilisateur) de l'utilisateur pour avoir son prénom et son nom. Par exemple, l'utilisateur booker12 auront leur GECOS comme "Rachel Booker". De plus, vous utilisez l'élévation des privilèges dans cette tâche car la création d'un utilisateur nécessite des privilèges 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 cours gratuit pour vous :présentation technique de la virtualisation et de la migration d'infrastructure. ]
Récapitulez
Vous avez créé avec succès les utilisateurs donnés avec leur UID , Groupes , Mot de passe , et GECOS en extrayant les valeurs souhaitées d'un fichier CSV. Cela est pratique car la plupart des organisations utilisent des formats tels que CSV pour stocker et gérer leurs données. Un développeur Ansible capable de manipuler des fichiers CSV peut gérer efficacement son environnement sans tout écrire à partir de zéro directement dans le playbook ou dans un fichier YAML de variable externe. Pour mieux gérer votre environnement, je vous recommande d'utiliser Ansible Tower, qui est la solution d'entreprise Ansible proposée par Red Hat. Optez peut-être également pour l'offre de formation DO447 - Advanced Automation :Ansible Best Practices.