Î: "Cum să suprascrieți playbook var dacă este setat în host_vars în Ansible?"
A: Uită-te la Precedență variabilă. Precedenta lui juca vars este 12. Există încă 10 posibilități de modificare juca vars, dar niciuna dintre ele nu vă va permite să suprascrieți selectiv o variabilă pentru o singură gazdă.
Va trebui să ștergeți declarația de ansible_connection: aws_ssm
din playbook dacă doriți să-l schimbați pentru o singură gazdă. Cel mai bun loc pentru grup declararea conexiunii este grup_vars (precedența 3-7) și cel mai bun loc pentru a înlocui grupul_vars pentru o singură gazdă este host_vars (precedenta 8-10). De exemplu
coajă> gazde pisici
[aws1]
server1 ansible_connection=local # precedență 8.
server2
server3
[aws1:vars]
ansible_connection=aws_ssm # precedență 3.
Există multe combinații de host_vars și grup_vars pentru a realiza acest scenariu. Dar, dacă setați o variabilă la juca vars (precedenta 12) nu o mai puteți suprascrie pentru o singură gazdă.
Variabila dinamica
Este posibil să declarați variabila în mod dinamic. De exemplu
ansible_connection: „{{ „local”
if inventory_hostname == 'server1'
altfel
„aws_ssm” }}”
Acest lucru ar funcționa la orice nivel de precedență. Dar, din cauza evaluării leneșe, este foarte ineficient. Variabila va fi evaluată de fiecare dată când se face referire.
„Instanțiază” variabila dinamică
Dacă într-adevăr trebuie să utilizați variabila dinamică, „instanciați-o” pentru a evita evaluarea repetată. Ce înseamnă? De exemplu, având în vedere inventarul (în YAML pentru o mai bună lizibilitate)
coajă> gazde pisici
toate:
gazde:
server1:
ansible_host: localhost
ansible_python_interpreter: /usr/bin/python3.8
server2:
gazdă_ansible: 10.1.0.62
ansible_user: admin
ansible_python_interpreter: /usr/local/bin/python3.8
server3:
gazdă_ansible: 10.1.0.63
ansible_user: admin
ansible_python_interpreter: /usr/local/bin/python3.8
copii:
servere:
gazde:
server1:
server2:
server3:
Caietul de joc
- gazde: servere
vars:
ansible_connection: „{{ „local”
if inventory_hostname == 'server1'
altfel
'ssh' }}"
sarcini:
- depanare:
msg: „{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: adevărat
- depanare:
var: ansible_connection
dă
PLAY [servere] ************************************************ ******
SARCINA [Adunarea faptelor] *********************************************
ok: [server1]
ok: [server2]
ok: [server3]
SARCINA [depanare] ************************************************ *********
ok: [server1] =>
msg: „[AnsibleUndefined, AnsibleUndefined, AnsibleUndefined]”
SARCINA [depanare] ************************************************ *********
ok: [server1] =>
ansible_connection: local
ok: [server2] =>
ansible_connection: ssh
ok: [server3] =>
ansible_connection: ssh
Conexiunile funcționează conform așteptărilor, dar variabila ansible_connection nu este inclusă în hostvars. Utilizați modulul set_fact și „instanciați” variabila, de ex.
- set_fact:
ansible_connection: „{{ ansible_connection }}”
- depanare:
msg: „{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: adevărat
dă
SARCINA [set_fact] ************************************************ *****
ok: [server1]
ok: [server2]
ok: [server3]
SARCINA [depanare] ************************************************ *********
ok: [server1] =>
mesaj:
- locale
- ssh
- ssh