Q : " Comment remplacer la variable du playbook si elle est définie dans host_vars dans Ansible ? "
R : Jetez un coup d'œil à Priorité des variables . La préséance de jouer les vars est de 12. Il y a 10 autres possibilités de contournement. jouer les vars mais aucun d'entre eux ne vous permet de remplacer de manière sélective une variable pour un seul hôte.
Vous devrez supprimer la déclaration de ansible_connection: aws_ssm
du playbook si vous voulez le modifier pour un seul hôte. Le meilleur endroit pour le groupe la déclaration de la connexion est paramètres du groupe (précédence 3-7) et le meilleur endroit pour remplacer les group_vars pour un seul hôte est paramètres de l'hôte (précédence 8-10). Par exemple
shell> cat hosts
[aws1]
server1 ansible_connection=local # precedence 8.
server2
server3
[aws1:vars]
ansible_connection=aws_ssm # precedence 3.
Il existe de nombreuses combinaisons de paramètres de l'hôte y paramètres du groupe pour réaliser ce scénario. Mais, si vous définissez une variable à jouer les vars (précédence 12), vous ne pouvez plus l'ignorer pour un seul hôte.
Variable dynamique
Il est possible de déclarer la variable de façon dynamique. Par exemple
ansible_connection: "{{ 'local'
if inventory_hostname == 'server1'
else
'aws_ssm' }}"
Cela fonctionnerait à n'importe quel niveau de préséance. Mais, à cause de l'évaluation paresseuse, c'est très inefficace. La variable sera évaluée à chaque fois qu'elle sera référencée.
Instanciation de la variable dynamique
Si vous avez vraiment besoin d'utiliser la variable dynamique, "instanciez-la" pour éviter une évaluation répétée. Qu'est-ce que cela signifie ? Par exemple, étant donné l'inventaire (en YAML pour une meilleure lisibilité)
shell> cat hosts
all:
hosts:
server1:
ansible_host: localhost
ansible_python_interpreter: /usr/bin/python3.8
server2:
ansible_host: 10.1.0.62
ansible_user: admin
ansible_python_interpreter: /usr/local/bin/python3.8
server3:
ansible_host: 10.1.0.63
ansible_user: admin
ansible_python_interpreter: /usr/local/bin/python3.8
children:
servers:
hosts:
server1:
server2:
server3:
Le livre de jeu
- hosts: servers
vars:
ansible_connection: "{{ 'local'
if inventory_hostname == 'server1'
else
'ssh' }}"
tasks:
- debug:
msg: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: true
- debug:
var: ansible_connection
donne
PLAY [servers] *****************************************************
TASK [Gathering Facts] *********************************************
ok: [server1]
ok: [server2]
ok: [server3]
TASK [debug] *******************************************************
ok: [server1] =>
msg: '[AnsibleUndefined, AnsibleUndefined, AnsibleUndefined]'
TASK [debug] *******************************************************
ok: [server1] =>
ansible_connection: local
ok: [server2] =>
ansible_connection: ssh
ok: [server3] =>
ansible_connection: ssh
Les connexions fonctionnent comme prévu, mais la variable ansible_connection n'est pas inclus dans le hostvars . Utilisez le module Faits et chiffres et "instanciez" la variable, par ex.
- set_fact:
ansible_connection: "{{ ansible_connection }}"
- debug:
msg: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: true
donne
TASK [set_fact] ****************************************************
ok: [server1]
ok: [server2]
ok: [server3]
TASK [debug] *******************************************************
ok: [server1] =>
msg:
- local
- ssh
- ssh