Puncte:5

Cum pot suprascrie un playbook var dacă este setat în host_vars în Ansible?

drapel us

server1 este în grup it_servere, dar aș dori să folosesc ansible_connection: local. Cum se poate face asta dacă ansible_connection este definit în playbook și host_vars?

--
- gazde: it_servers
  vars:
    ansible_connection: aws_ssm
  roluri:
    - nginx
    - mysql

Ale mele host_vars/server1.yml fişier

ansible_connection: local
Puncte:6
drapel br

Î: "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

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

SARCINA [set_fact] ************************************************ *****
ok: [server1]
ok: [server2]
ok: [server3]

SARCINA [depanare] ************************************************ *********
ok: [server1] => 
  mesaj:
  - locale
  - ssh
  - ssh
Puncte:0
drapel in

Poți să folosești delegate_to: localhost pentru sarcina.

Puncte:0
drapel in
Max

Ansible aplică o prioritate variabilă și s-ar putea să o folosești. Iată ordinea de prioritate de la cel mai mic la cel mai mare (ultimele variabile enumerate înlocuiesc toate celelalte variabile):

valorile liniei de comandă (de exemplu, -u my_user, acestea nu sunt variabile)

valori implicite de rol (definite în rol/defaults/main.yml) 1

fișierul de inventar sau grupul de scripturi vars 2

grup de inventar_vars/toate 3

playbook group_vars/toate 3

inventar group_vars/* 3

playbook group_vars/* 3

fișierul de inventar sau gazda scriptului vars 2

inventar host_vars/* 3

playbook host_vars/* 3

gazdă fapte / set_facts în cache 4

juca vars

juca vars_prompt

reda vars_files

role vars (definite în role/vars/main.yml)

bloc vars (numai pentru sarcinile din bloc)

task vars (numai pentru sarcină)

include_vars

set_facts / înregistrate vars

rol (și include_role) parametri

includ parametri

variante suplimentare (de exemplu, -e „utilizator=utilizatorul_meu”) (câștigă întotdeauna prioritate)

Acest lucru este mai bine explicat aici: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.