Puncte:0

Trecerea dinamică a unui json ca parametru într-o sarcină „comandă”.

drapel lc

Am această sarcină în cartea mea de joc:

- nume: actualizați etichetele instanței
    comandă: oci compute instance update -c {{ compartiment }} --freeform-tags {{ tag_var_json }}

In conformitate cu documentația oracolului pentru această comandă, parametrul --etichete-freeform acceptă un json care reprezintă perechea cheie-valoare pentru etichetă. Trebuie ca acest json să fie creat dinamic în manualul de joc, așa că înainte de a rula acea sarcină, îl am pe acesta în scopuri de testare:

  - nume: creați un obiect json pe care să îl utilizați ca etichetă
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: „{{ tag_var | to_json }}”

Dar trebuie să fac ceva greșit pentru că tot primesc această eroare:
fatal: [localhost]: FAILED! => {"msg": "Sarcina include o opțiune cu o variabilă nedefinită. Eroare a fost: „tag_var” este nedefinit

Există o modalitate mai ușoară de a crea un json direct în playbook și de a-l transmite ca argument la acel parametru?

Mulțumesc.

anx avatar
drapel fr
anx
Cheile YAML ar trebui să fie unice. Deci eșantionul dvs. este o sintaxă incorectă. Poate ați vrut să setați variabila într-o altă sarcină?
anx avatar
drapel fr
anx
Poate ați interpretat greșit eroarea ca ceva returnat de la comanda dvs.? Acesta este *ansible* în sine care vorbește, nu un citat al unui mesaj returnat de la un program numit!
Ress avatar
drapel lc
Sunt nou în ansible, așa că îmi cer scuze. Încerc doar să transmit un json ca argument unui parametru, așa cum s-a văzut mai sus, dar trebuie să construiesc json-ul în același manual
Puncte:1
drapel th

Sunt două lucruri care se întâmplă aici. Primul este că ați creat YAML care este acceptat de parser, dar se comportă într-un mod ușor neașteptat (și va produce un avertisment în versiunea curentă de Ansible.)

  - nume: creați un obiect json pe care să îl utilizați ca etichetă
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: „{{ tag_var | to_json }}”

Cheile din YAML sunt unice; când analizatorul întâlnește o a doua instanță a aceleiași chei, o aruncă pe prima. De când ai repetat set_fact, aceasta este echivalentă cu:

  - nume: creați un obiect json pe care să îl utilizați ca etichetă
    set_fact:
      tag_var_json: „{{ tag_var | to_json }}”

Cu toate acestea, corectarea erorii de sintaxă va duce la un eșec.

  - nume: creați un obiect json pe care să îl utilizați ca etichetă
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
      tag_var_json: „{{ tag_var | to_json }}”

Argumentele pentru set_fact trebuie să fie modelate înainte ca sarcina să ruleze, moment în care tag_var este încă nedefinit (deoarece această sarcină o definește.)

O modalitate corectă de a scrie această sarcină este ca două sarcini separate:

  - nume: creați un obiect etichetă
    set_fact:
      tag_var:
        test: acesta este cel mai bun

  - nume: creați un șir JSON pentru etichetare
    set_fact: 
      tag_var_json: „{{ tag_var | to_json }}”

In orice caz, set_fact nu este deloc necesar. Puteți seta var-ul direct pe sarcina în care o utilizați, ceea ce este atât mai eficient, cât și o face mai strânsă.

- nume: actualizați etichetele instanței
    comandă: oci compute instance update -c {{ compartiment }} --freeform-tags „{{ tag_var | to_json }}”
  vars:
    tag_var:
      test: acesta este cel mai bun

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.