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?