Puncte:3

Încrucișează variabilele Ansible în cadrul aceleiași mapari

drapel co

Cum pot defini o variabilă Ansible a cărei valoare este o altă variabilă din aceeași structură de mapare?

Pentru a permite spațierea sensibilă a numelor variabilelor, definesc structuri de mapare ca aceasta, unde unele valori depind de alte variabile din aceeași structură:

culme:
  director:
    numele gazdă: „acme-staging-v02.api.letsencrypt.org”
letsencrypt:
  config_dir: „/etc/letsencrypt”
  keys_dir: „{{ letsencrypt.config_dir }}/keys”
  csrs_dir: „{{ letsencrypt.config_dir }}/csr”
  certs_dir: „{{ letsencrypt.config_dir }}/certs”
  accounts_dir: „{{ letsencrypt.config_dir }}/accounts”
  csr_file: „{{ letsencrypt.csrs_dir }}/{{ site_domain }}.csr”
  account_key_file: „{{ letsencrypt.csrs_dir }}/{{ acme.directory.hostname }}”
  email_address: „certificat-reminders@{{ site_domain }}”

Acest lucru eșuează deoarece Ansible nu poate rezolva valorile care fac referire la altele din aceeași structură de date:

buclă recursivă detectată în șirul șablonului: {{ letsencrypt.config_dir }}/keys

Asa am crezut căutarea vars ar permite amânarea rezoluției:

culme:
  director:
    numele gazdă: „acme-staging-v02.api.letsencrypt.org”
letsencrypt:
  config_dir: „/etc/letsencrypt”
  keys_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/keys"
  csrs_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/csr"
  certs_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/certs"
  accounts_dir: „{{ lookup('vars', 'letsencrypt.config_dir') }}/accounts”
  csr_file: „{{ lookup('vars', 'letsencrypt.csrs_dir') }}/{{ site_domain }}.csr”
  account_key_file: >-
    {{ lookup('vars', 'letsencrypt.csrs_dir') }}/{{ acme.directory.hostname }}
  email_address: „certificat-reminders@{{ site_domain }}”

Acest lucru eșuează, deoarece Ansible încearcă să rezolve imediat această căutare:

Nu a fost găsită nicio variabilă cu acest nume: letsencrypt.config_dir


Desigur, le-aș putea împărți astfel încât să fie variabile separate. Totuși, asta înfrânge scopul meu de a păstra variabilele puternic legate grupate în același spațiu de nume.

Deci, ce îmi va permite să definesc structura datelor astfel încât unele valori pot depinde de alte variabile din aceeași structură?

Michael Hampton avatar
drapel cz
Este o problemă de lungă durată în Ansible, consultați [issue #8603](https://github.com/ansible/ansible/issues/8603) pentru discuția extinsă.
Puncte:0
drapel co

(Mulțumesc lui @michael-hampton pentru că a condus la acest răspuns.)

După cum este descris în Problemă Ansible#8603, analizatorul de configurare citește valori variabile și încercând imediat să redeze șabloanele pe care le întâlnește în timp ce se definesc variabilele. Acest lucru face ca analiza să eșueze atunci când un șablon face referire la o variabilă care nu este încă complet definită.

A comentariu de ârquelibariâ ofera o analiza buna:

Această caracteristică este de fapt bine definită în ceea ce privește semnificația exactă a unui lucru. Sintaxa și semantica (în termeni de logică) sunt ambele bine definite pentru acest tip de „referință inversă”. [â¦]

și explică în detaliu cum se întâmplă acest lucru.

Un ulterior comentariu de âcmpunchesâ precizează direct soluția necesară:

Această problemă este un rezultat direct al utilizării ansible a unui parser yaml funcția de interpolare în loc să încărcați obiectul yaml și să faceți o secundă trece pentru interpolare. Acesta nu este doar un bug jinja, acesta este un bug de implementare în ansible. Vă rugăm să inspectați. Se încarcă ca șir brut și apoi procesarea membrilor obiectului inițializați într-o a doua trecere ar trebui să se rezolve acest.

Deci, până când analizatorul YAML din Ansible este corectat pentru a citi valorile variabilelor ca text simplu, fără a încerca să redea imediat șabloane (și astfel să amâne randarea până când toate variabilele sunt definite), această referință încrucișată în valori nu poate fi încă făcută în variabilele Ansible. .

flowerysong avatar
drapel th
Aceasta este o explicație înșelătoare a ceea ce se întâmplă, deoarece toate evaluările variabilelor se întâmplă leneș (la utilizare), nu în timpul analizării. Variabilele nu se pot referi la ele însele deoarece o variabilă trebuie să fie redată complet înainte ca orice parte a acesteia să poată fi accesată. Schimbarea acestui lucru ar implica modificări dificil de raționat în ceea ce privește manipularea variabilelor și ar avea o valoare îndoielnică. O soluție mai bună este să folosiți vars-uri de nume cu prefixe (`letsencrypt_config_dir` etc.) în loc să încercați să treceți totul ca un singur var.

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.