Puncte:0

ansible main.yml if else conditional

drapel us

Deci, rulez un rol ansible care are un fișier main.yml în folderul defaults/rol. Conținutul acelui fișier este următorul:

---
api_secrets:
  „API_PROFILE”: „{{ api_profile }}”
  „SERVER_ADDRESS”: „{{ server_address }}”
  „MGMT_SERVER_ADDRESS”: „{{ management_server_address }}”

Acum vreau să includ în blocul api_secrets, după MGMT_SERVER_ADDRESS ceva de genul:

{% if '"port" in mgmt_ports' %}
„MGMT_SERVER_PORT”: „{{ management_server_port1 }}”
„MGMT_SERVER_USER”: „{{ user1 }}”
{% altfel %}
„MGMT_SERVER_PORT”: „{{ management_server_port2 }}”
„MGMT_SERVER_USER”: „{{ user2 }}”
{% endif %}

Cu totul de aici, pe server este creat un fișier având conținutul de mai sus și, desigur, înlocuind variabilele cu valorile lor reale.

Indiferent cum aș încerca, întotdeauna rezultă diferite erori. Am încercat cu „{% if ... endif %}”, tot cu „”

Eroarea ar fi aceasta:

EROARE! Eroare de sintaxă la încărcarea YAML.
  a găsit un caracter care nu poate începe niciun simbol

Eroarea pare să fie în „/opt/ansible/roles/api/defaults/main.yml”: rândul 55, coloana 2, dar poate
fi în altă parte în fișier, în funcție de problema exactă de sintaxă.

Linia ofensiva pare a fi:

{% if '"port" in mgmt_ports' %}
 ^ aici

Am incercat si eu asa:

   „{% if (port în mgmt_ports) %}
   „MGMT_SERVER_PORT”: „{{ management_server_port1 }}”
   {% altfel %}
   „MGMT_SERVER_PORT”: „{{ management_server_port2 }}”
   {% endif %}"

In acest caz eroarea este:

EROARE! Eroare de sintaxă la încărcarea YAML.
  nu a putut găsi așteptat „:”

Eroarea pare să fie în „/opt/ansible/roles/api/defaults/main.yml”: rândul 56, coloana 24, dar poate
fi în altă parte în fișier, în funcție de problema exactă de sintaxă.

Linia ofensiva pare a fi:

  „{% if (port în mgmt_ports) %}
  „MGMT_SERVER_PORT”: „{{ management_server_port1 }}”
                       ^ aici
Am putea greși, dar acesta pare că ar putea fi o problemă cu
ghilimele lipsă. Citați întotdeauna parantezele de expresie șablon atunci când acestea
începe o valoare. De exemplu:

    cu_articole:
      - {{ foo }}

Ar trebui scris ca:

    cu_articole:
      - „{{ foo }}”

Care este modalitatea corectă de a face asta?

Știu că ar fi fost mai ușor folosind un șablon jinja2, dar cărțile de joc sunt create astfel și trebuie să rămân la această metodă.

Puncte:1
drapel th

Șablonarea variabilelor are loc mult după pasul de analiză YAML, așa că nu o puteți utiliza pentru șablonul YAML în acest fel.

Cea mai ușoară abordare este să mutați condiția în expresiile individuale Jinja:

api_secrets:
  API_PROFILE: „{{ api_profile }}”
  SERVER_ADDRESS: „{{ server_address }}”
  MGMT_SERVER_ADDRESS: „{{ management_server_address }}”
  MGMT_SERVER_PORT: „{{ management_server_port1 dacă „port” în mgmt_ports else management_server_port2 }}”
  MGMT_SERVER_USER: „{{ user1 if 'port' in mgmt_ports else user2 }}”

Puteți utiliza, de asemenea, instrucțiuni Jinja, deși asta face valoarea puțin mai lungă pentru același rezultat.

api_secrets:
  API_PROFILE: „{{ api_profile }}”
  SERVER_ADDRESS: „{{ server_address }}”
  MGMT_SERVER_ADDRESS: „{{ management_server_address }}”
  MGMT_SERVER_PORT: „{% if 'port' in mgmt_ports %}{{ management_server_port1 }}{% else %}{{ management_server_port2 }}{% endif %}"
  MGMT_SERVER_USER: „{% if 'port' in mgmt_ports %}{{ user1 }}{% else %}{{ user2 }}{% endif %}”
Puncte:0
drapel lr

Ansible nu este menit să trateze declarațiile If-Else.

După cum ați menționat în partea de jos a întrebării dvs., cu șabloanele jinja2 ar fi mai ușor, dar nu doar ar fi mai ușor, ci ar face ca acesta să fie modul corect de a face acest lucru.

Așadar, în loc să încercați să vă stricați fișierul yaml cu instrucțiuni if-else, creați un singur fișier jinja2 cu parametrii șablonului necesar (se pare că oricum aveți aproape structura șablonului jinja2!) și creați un fișier de configurare folosind asta.

Apoi puteți efectua o comandă de șablon pentru a include șablonul în locația corectă cu parametrii corespunzători.

„Caietele de joc sunt create așa și trebuie să rămân la această metodă” strigă că oricine a venit cu acea politică este fie nesigur, fie doar un copil.

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.