Présentation des invites Ansible et des variables d’exécution
Ce tutoriel fait partie d’une série que nous avons consacrée à Ansible. Précédemment, nous avons parlé des bases d’Ansible, puis nous nous sommes concentrés sur certains modules Ansible que nous pouvons utiliser pour effectuer des tâches d’administration très courantes, et nous avons également parlé des boucles Ansible. Dans cet article, nous allons plutôt apprendre à créer des invites interactives que nous pouvons utiliser pour demander des entrées à l’utilisateur et comment passer des variables au moment de l’exécution.
Dans ce tutoriel, vous allez apprendre :
- Quand utiliser les invites interactives
- Comment utiliser la section var_prompt d’un playbook
- Comment passer des variables au moment de l’exécution
Configuration logicielle requise et conventions utilisées
Pourquoi demander des commentaires ?
Ansible est un outil d’automatisation et de provisionnement que nous pouvons utiliser pour obtenir des configurations spécifiques sur les machines qui font partie de notre inventaire. Comme nous l’avons vu dans les articles précédents, nous spécifions les tâches qui doivent être effectuées dans les playbooks définis à l’aide de la syntaxe yaml. Pour obtenir une automatisation totale, nous ne voulons généralement pas que nos tâches soient interactives ; Cependant, dans certains cas, nous devons demander à un utilisateur une certaine entrée. Imaginons, par exemple, que nous définissions une tâche pour créer un nouvel utilisateur. À l’intérieur d’un playbook, notre tâche ressemblerait à peu près à ceci :
- hosts: all
become: yes
tasks:
- name: Make sure user exists
ansible.builtin.user:
name: foo
password: 6$IRSnSBpBZ34SVP02$9zeDzbnrUW9PRluYYSnQJR5M53s7l6oVuODjxxDkd0x8GdGMfrPytBAILTqUdDpPADhCh.bmM6xP5gIIOW1ed/
Dans la tâche ci-dessus, nous avons déclaré que l’utilisateur foo devrait exister sur les machines distantes. Ce qui nous intéresse le plus, cependant, c’est l’argument du mot de passe. Comme nous le savons, il peut être utilisé pour spécifier le mot de passe de l’utilisateur sous forme hachée. Cependant, il n’est pas recommandé de placer un mot de passe de manière statique dans un playbook. Il s’agit d’un cas typique dans lequel nous pourrions tirer parti des invites interactives d’Ansible. Ce que nous pouvons faire, c’est demander le mot de passe qui doit être utilisé pour l’utilisateur de manière interactive, le hacher et attribuer la valeur résultante à une variable que nous utiliserons dans la tâche. Voyons comment nous pouvons le faire.
La section vars_prompt
Pour créer une invite et demander de manière interactive des informations lors de l’exécution d’un playbook, il suffit de créer une nouvelle section appelée vars_prompt. Voyons un petit exemple, puis discutons-en :
- hosts: all
vars_prompt:
- name: username
prompt: Please provide the username
L’argument vars_prompt prend une liste comme valeur. Nous pouvons définir les variables dont nous avons besoin en tant qu’éléments de cette liste. Dans ce cas, nous n’en avons défini qu’un. Avec l’argument name, nous avons indiqué son nom, qui dans ce cas est « username ». Avec l’argument prompt, à la place, nous définissons le contenu de l’invite qui sera créé lors de l’exécution du playbook :
Please provide the username:La valeur fournie en réponse à l’invite est affectée à la variable username, que nous pourrons utiliser dans les tâches du playbook. Si l’utilisateur ne fournit pas de valeur, la variable sera vide. Nous pouvons toutefois utiliser l’argument default pour fournir une valeur de secours. Dans ce cas, le nom par défaut de l’utilisateur sera « foo » :
- hosts: all
vars_prompt:
- name: username
prompt: Please provide username
default: foo
Par défaut, ce qui est tapé dans l’invite n’est pas visualisé : il s’agit d’une mesure de sécurité, qui dans ce cas peut être évitée. Ce comportement est contrôlé via le paramètre private. Sa valeur est « yes » par défaut ; Tout ce que nous devrions faire est de le changer en « Non » :
- hosts: all
vars_prompt:
- name: username
prompt: Please provide username
default: foo
private: no
Comme nous l’avons déjà dit, une fois la variable définie, elle peut être utilisée dans les tâches du playbook :
- hosts: localhost
become: yes
vars_prompt:
- name: username
prompt: Please provide the username
default: foo
private: no
tasks:
- name: Make sure user exists
ansible.builtin.user:
name: '{{ username }}'
Nous avons appris à créer des invites interactives et à attribuer des données fournies à une variable. Ce que nous avons fait ci-dessus, cependant, n’est pas suffisant si nous travaillons avec un mot de passe, car il manque quelque chose : il serait d’abord utile de demander une confirmation du mot de passe, puis nous devrions hacher le mot de passe fourni, afin qu’il puisse être utilisé dans la tâche de création d’utilisateur, en tant que valeur du paramètre de mot de passe. Nous verrons comment faire dans la section suivante.
Demander à l’utilisateur de saisir un mot de passe
La première chose à faire lorsque vous demandez un mot de passe est de vous assurer que ce qui est tapé dans l’invite n’est pas visible. Nous en avons déjà parlé : il suffit d’attribuer la valeur « yes » au paramètre private (comme il s’agit de la valeur par défaut, nous pouvons l’omettre complètement).
Nous voulons également demander la confirmation du mot de passe et hacher le mot de passe fourni. Voici comment nous pourrions procéder :
- hosts: localhost
become: yes
vars_prompt:
- name: username
prompt: Please provide the username
default: foo
private: no
- name: password
prompt: password
encrypt: sha512_crypt
confirm: yes
Nous avons utilisé deux nouveaux paramètres : encrypt et confirm. Avec le premier, nous spécifions comment le mot de passe doit être haché. Par défaut, Ansible utilise la bibliothèque Python « passlib » pour effectuer le hachage. La bibliothèque prend en charge les algorithmes suivants :
- des cryptes
- bsdi_crypt
- bigcrypt
- crypte16
- md5_crypt
- bcrypt
- sha1_crypt
- sun_md5_crypt
- sha256_crypt
- sha512_crypt
- apr_md5_crypt
- phpass
- digest_pbkdf2
- cta_pbkdf2_sha1
- dlitz_pbkdf2_sha1
- déguerpir
- bsd_nthash
Si la bibliothèque « passlib » n’est pas installée, le module « crypt » est utilisé comme solution de secours. Dans ce cas, le choix des algorithmes disponibles dépend de la plateforme. En règle générale, les méthodes de hachage suivantes sont prises en charge :
- bcrypt
- md5_crypt
- sha256_crypt
- sha512_crypt
Le sel du mot de passe est généré de manière aléatoire, mais nous pouvons fournir le nôtre, si nous le souhaitons, via le paramètre salt. Une fois le playbook exécuté, les invites suivantes sont générées :
password:
confirm password:
Passage d’une variable au moment de l’exécution
Comme alternative à l’utilisation d’invites interactives, nous pouvons passer des variables et leurs valeurs au moment de l’exécution en utilisant l’option --extra-vars de la ligne de commande. Il existe deux types de syntaxe que nous pouvons utiliser : la première consiste à fournir les variables et leurs valeurs sous la forme d’une seule chaîne de caractères entre guillemets :
ansible-playbook playbook.yml --extra-vars "var1=value var2=value"Alternativement, nous pouvons utiliser la syntaxe JSON :
ansible-playbook playbook.yml --extra-vars '{ "var1": "value", "var2": "value" }'Comme troisième alternative, nous pourrions simplement passer le chemin d’un fichier contenant la variable définie avec la syntaxe JSON comme argument à --extra-vars. En supposant que le fichier s’appelle variables.json, nous exécuterions :
ansible-playbook playbook.yml --extra-vars "@variables.json"Que se passe-t-il si nous passons une variable et sa valeur au moment de l’exécution, mais que nous l’avons également définie dans la section vars_prompt du playbook ? Dans ce cas, l’invite est ignorée : la valeur passée au moment de l’exécution a la priorité.
Il n’est pas recommandé de passer le mot de passe au moment de l’exécution, car il ferait partie de la commande exécutée qui apparaîtrait dans la liste des processus générée avec la commande ps, mais aussi dans le cadre de l’historique du shell.
Conclusions
Dans ce tutoriel, nous avons appris à définir des variables à l’aide d’invites interactives avec Ansible, ou à les transmettre au moment de l’exécution à l’aide de l’option de ligne de commande --extra-vars. Nous avons vu quelques exemples typiques et plus particulièrement comment travailler avec les mots de passe : comment demander leur confirmation et comment les hacher.
