Puncte:3

Iterarea prin listă imbricată/dicționar folosind șabloane Jinja2

drapel ph

Încerc să configurez dinamic mai multe servere NFS în sistemul meu generând fișierele lor /etc/exports folosind Ansible. Sper să reușesc să fac asta cu un șablon jinja2. Este șablonul jinja2 pe care nu-l pot da seama pe baza listei mele de exporturi.

Am următoarele variabile definite în rolul meu nfs:

site_nfs_servers: ['ansibletarget1', 'ansibletarget2']

exporturi:
  - server: „ansibletarget1”
    acțiuni:
      - cale: „/my/first/share/path”
        client: "*"
        opțiuni: „rw,sync”
      - cale: „/my/second/share/path”
        client: "*"
        opțiuni: „rw,sync,root_squash”
  - server: „ansibletarget2”
    acțiuni:
      - cale: „/altul/partajat/cale/diferent/server”
        client: "*"
        opțiuni: "ro,sync"

Apoi am următorul joc ansible pentru a genera șablonul:

- nume: Generați fișierul de export.
  șablon:
    src: exporturi.j2
    dest: /etc/exports
    proprietar: rădăcină
    grup: rădăcină
    modul: '0750'

Șablonul meu în prezent arată astfel:

{% pentru export în exporturi %}
{% if ansible_hostname in export.server %}
{% pentru cota de acțiuni %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}
{% endif %}
{% endfor %}

Nu cred că sunt aproape de a avea structura corectă a șablonului. Cum naiba se repetă prin această listă?

Puncte:3
drapel in

Îți lipsește referința la export în a doua buclă.

{% pentru export în exporturi %}
{% if ansible_hostname in export.server %}
{% pentru cota în export.shares %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}
{% endif %}
{% endfor %}

Cu toate acestea, ar fi mai bine să definiți cotele în variabilele gazdă, așa cum se arată în răspunsul lui Vladimir.

Puncte:2
drapel br

Creați un inventar

coajă> gazde pisici
[site_nfs_servers]
ansibletarget1
ansibletarget2

și puneți acțiuni în host_vars

shell> cat host_vars/ansibletarget1.yml 
acțiuni:
  - cale: „/my/first/share/path”
    client: "*"
    opțiuni: „rw,sync”
  - cale: „/my/second/share/path”
    client: "*"
    opțiuni: „rw,sync,root_squash”
shell> cat host_vars/ansibletarget2.yml 
acțiuni:
  - cale: „/altul/partajat/cale/diferent/server”
    client: "*"
    opțiuni: "ro,sync"

Creați un rol simplificat pentru testare

shell> tree roles/my_nfs_role/
roles/my_nfs_role/
âââ sarcini
â  âââ main.yml
âââ şabloane
    âââ exporturi.j2

2 directoare, 2 fișiere
shell> cat roles/my_nfs_role/tasks/main.yml 
- șablon:
    src: exporturi.j2
    dest: /etc/exports.test
shell> cat roles/my_nfs_role/templates/exports.j2 
{% pentru cota de acțiuni %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}

Apoi, folosiți grupul de inventar și rolul dintr-un manual

shell> cat playbook.yml
- gazde: site_nfs_servers
  roluri:
    - my_nfs_role

Rulați playbook-ul și creați fișierele

shell> ansible-playbook -i găzduiește playbook.yml

PLAY [site_nfs_servers] ********************************************** **

SARCINA [my_nfs_role: template] ********************************************
schimbat: [ansibletarget1]
schimbat: [ansibletarget2]
 ...
shell> ssh admin@ansibletarget1 cat /etc/exports.test
/my/first/share/path * rw,sync
/my/second/share/path * rw,sync,root_squash

shell> ssh admin@ansibletarget2 cat /etc/exports.test
/other/shared/path/different/server * ro,sync

Vedea Exemplu de configurare Ansible.


Dacă doriți să păstrați acțiunile într-un singur obiect, puneți lista în grupuri_vars. Pentru a simplifica codul, convertiți lista într-un dicționar. Poți să folosești comunitate.general.groupby_as_dict de exemplu

shell> cat group_vars/all.yml
exporturi:
  - server: „ansibletarget1”
    acțiuni:
      - cale: „/my/first/share/path”
        client: "*"
        opțiuni: „rw,sync”
      - cale: „/my/second/share/path”
        client: "*"
        opțiuni: „rw,sync,root_squash”
  - server: „ansibletarget2”
    acțiuni:
      - cale: „/altul/partajat/cale/diferent/server”
        client: "*"
        opțiuni: "ro,sync"

exports_dict: „{{ exports|community.general.groupby_as_dict('server') }}”

  exports_dict:
    ansibletarget1:
      server: ansibletarget1
      acțiuni:
      - client: '*'
        opțiuni: rw,sync
        cale: /my/first/share/path
      - client: '*'
        opțiuni: rw,sync,root_squash
        cale: /my/second/share/path
    ansibletarget2:
      server: ansibletarget2
      acțiuni:
      - client: '*'
        opțiuni: ro,sync
        cale: /other/shared/path/different/server

Apoi modificați șablonul. Acest lucru ar trebui să creeze aceleași fișiere ca înainte.

shell> cat roles/my_nfs_role/templates/exports.j2 
{% pentru cota în exports_dict[inventory_hostname]['shares'] %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}

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.