Puncte:0

Șablon Ansible jinja2 din formatul JSON furnizat ca extra-vars

drapel us

Am acest șablon jinja2:

# {{ ansible_managed }}

{% pentru vhost în nginx_vhosts %}
{%- dacă vhost.name == item.name -%}

# redirecționează www către non-www
Server {
    asculta {{ nginx_port }};
    asculta [::]:{{ nginx_port }};
    port_in_redirect dezactivat;

    server_name www.{{ vhost.name }};
    returnează 301 http://{{ vhost.name }}$request_uri;
}
{%- endif -%}
{%- endfor -%}

Un rol ansible cu un fișier yaml vhosts.yml care conțin definiții ca aceasta:

nginx_vhosts:
      - nume: „test1.com”
        repo: "git1"
        ramură: stăpân
        stare: prezent
      - nume: "test2.com"
        repo: "git2"
        ramură: stăpân
        stare: prezent
...
      - nume: „test101.com”
        repo: „git101”
        ramură: stăpân
        stare: prezent

O sarcină în interior playbook.yml:

- nume: „Generează fișierul de configurare nginx vhost”
  șablon:
    src: templates/nginx-vhost-template.j2
    dest: „{{ nginx_vhosts_dir }}/{{ item.name }}.conf”
    proprietar: „{{ nginx_user }}”
    grup: „{{ nginx_group }}”
    mod: 0640
  cu_articole:
    - „{{ nginx_vhosts }}”
  când:
    - item.state == „prezent”
  anunta:
    - nginx-repornire

Am efectuat o activitate de genul:

ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config

care funcționează bine, va crea din șablon un fișier de configurare nginx vhost pe serverul la distanță ca domain1.com.conf și așa mai departe pentru toate definițiile găsite.

Presupunând că în fișierul vhosts.yml am test1.com până la test100.com, voi adăuga să spunem test101.com și vreau să rulez sarcinile strict pentru acel test101.com și nu pentru toate gazdele anterioare. Asa ca am incercat asa ceva:

ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config -e "{ 'nginx_vhosts': { 'nume': 'test101.com', 'state': 'prezent', 'repo': ' git101', 'branch': 'master' }}"

Problema cu aceasta este că are ca rezultat o eroare atunci când se încearcă înlocuirea valorilor din șablonul jinja2.

A apărut o excepție în timpul execuției sarcinii. Pentru a vedea traseul complet, utilizați -vvv. Eroarea a fost: ansible.errors.AnsibleUndefinedVariable: „ansible.parsing.yaml.objects.AnsibleUnicode object” nu are atributul „name”

Am incercat si eu sa folosesc buclă în loc de cu_articole dar fara noroc.

Înțeleg că atunci când folosesc extra-vars, conținutul furnizat este în format JSON, dar nu am reușit să găsesc o modalitate diferită de a transmite conținutul din vhosts.yml ca variante suplimentare pentru o singură intrare. Există vreo modalitate de a face acest lucru funcțional?

Există o abordare mai bună poate?

flowerysong avatar
drapel th
O notă minoră: ceea ce transmiteți este YAML, nu JSON. Seamănă foarte mult cu JSON, deoarece este YAML în stil flux, dar este ușor de distins deoarece JSON nu permite ca ghilimele simple să fie folosite așa cum sunt aici.
Puncte:1
drapel th

Trimiteți un obiect/dicționar, dar codul dvs. așteaptă o listă. Trebuie fie să-l înfășurați într-o listă când îl transmiteți, fie să luați în considerare diferitele structuri posibile atunci când îl consumați.

Mai întâi ar trebui să reduceți numărul de locuri la care face referire nginx_vhosts folosind elementul de buclă curent direct în șablonul dvs.:

# {{ ansible_managed }}

# redirecționează www către non-www
Server {
    asculta {{ nginx_port }};
    asculta [::]:{{ nginx_port }};
    port_in_redirect dezactivat;

    server_name www.{{ item.name }};
    returnează 301 http://{{ item.name }}$request_uri;
}

Apoi puteți modifica ușor structura în care treceți:

„{ „nginx_vhosts”: [{ „nume”: „test101.com”, „state”: „prezent”, „repo”: „git101”, „ramură”: „master” }]}”

Sau modificați ușor bucla:

- nume: „Generează fișierul de configurare nginx vhost”
  șablon:
    src: templates/nginx-vhost-template.j2
    dest: „{{ nginx_vhosts_dir }}/{{ item.name }}.conf”
    proprietar: „{{ nginx_user }}”
    grup: „{{ nginx_group }}”
    modul: "0640"
  buclă: „{{ [ nginx_vhosts ] | aplatiza }}”
  când:
    - item.state == „prezent”
  anunta:
    - nginx-repornire
Bogdan Stoica avatar
drapel us
Are sens acum. Funcționează ca un farmec! Mulțumesc!

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.