2015-06-30 13 views
42

Mój przypadek użycia jest następujący:Jak korzystać z modułu szablonów z innym zestawem zmiennych?

Mam plik szablonu i chciałbym utworzyć 2 różne pliki z tego szablonu, przy czym zmienne są wypełniane innym zestawem zmiennych dla każdego pliku.

Na przykład, powiedzmy, że chcę szablon plik zawierający wiersz:

mkdir -p {{myTemplateVariable}} 

chciałbym znaleźć właściwą drogę, aby dostać tę zmienną wypełniony przez „pliku Plik1” i „pliku Plik2”. Coś jak:

- name: template test 1 
    template: 
     src=myTemplateFile 
     dest=result1 


- name: template test 2 
    template: 
     src=myTemplateFile 
     dest=result2 

gdzie mogę określić na pierwszy szablonów że zmienna, aby wykorzystać to = „File1” i drugi, b = „File2”.

+0

Czy to jest dokładnie to zrobić z wszystkich moich receptur wyglądać ten komentarz http: // stackoverflow.com/a/40189525/1571310, miej nadzieję, że ta pomoc! – Tecnocat

Odpowiedz

26

Niestety moduł template nie obsługuje przekazywania do niego zmiennych, które mogą być używane wewnątrz szablonu. Był feature request, ale został odrzucony.

mogę myśleć dwa obejścia:

1. Dołącz

Oświadczenie include obsługuje zmienne uboczny. Więc można mieć swoje zadanie template wewnątrz dodatkowym pliku i umieścić go dwukrotnie z odpowiednimi parametrami:

my_include.yml:

- name: template test 
    template: 
     src=myTemplateFile 
     dest=destination 

main.yml:

- include: my_include.yml destination=result1 myTemplateVariable=File1 

- include: my_include.yml destination=result2 myTemplateVariable=File2 

2. Re- define myTemplateVariable

Innym sposobem byłoby po prostu ponowne zdefiniowanie myTemplateVariable tuż przed każdym template zadanie.

- set_fact: 
    myTemplateVariable: File1 

- name: template test 1 
    template: 
     src=myTemplateFile 
     dest=result1 

- set_fact: 
    myTemplateVariable: File2 

- name: template test 2 
    template: 
     src=myTemplateFile 
     dest=result2 
+0

Dziękuję za odpowiedź. Czy jednak nie można obejść się bez obejścia? Obecnie próbuję coś takiego jak: http://stackoverflow.com/questions/26020465/ansible-with-dict-template-use, ale nadal ma pewne błędy (może nie bezpośrednio związane). –

+0

Tak, możesz to zrobić również z pętlą - nadal jest to obejście problemu. :) – udondan

+3

nie jest już potrzebny. "vars" jest teraz obsługiwane. patrz odpowiedź @ konstantin-suvorov poniżej. – sonjz

19

Jest to rozwiązanie/Hack Używam:

zadań/main.yml:

- name: parametrized template - a 
    template: 
    src: test.j2 
    dest: /tmp/templateA 
    with_items: var_a 

- name: parametrized template - b 
    template: 
    src: test.j2 
    dest: /tmp/templateB 
    with_items: var_b 

Vars/main.yml

var_a: 
    - 'this is var_a' 
var_b: 
    - 'this is var_b' 

Szablony/test .j2:

{{ item }} 

Po uruchomieniu otrzymasz this is var_a w/tmp/templateA i this is var_b w/tmp/templateB.

Zasadniczo nadużywasz with_items, aby renderować szablon z każdą pozycją na liście pojedynczych przedmiotów. Działa to, ponieważ możesz kontrolować, jaka jest lista przy korzystaniu z with_items.

Wadą tego jest to, że musisz użyć item jako nazwy zmiennej w twoim szablonie.

Jeśli chcesz przekazać więcej niż jedną zmienną ten sposób można dicts jak swoimi elementów listy tak:

var_a: 
    - 
    var_1: 'this is var_a1' 
    var_2: 'this is var_a2' 
var_b: 
    - 
    var_1: 'this is var_b1' 
    var_2: 'this is var_b2' 

a następnie odnosić się do nich w szablonie tak:

{{ item.var_1 }} 
{{ item.var_2 }} 
+1

Czyste rozwiązanie, ale kapelusz do użycia 'with_items: '{{var_a}}'' –

5

Zrobiłem to w ten sposób.

w zadaniach/main.yml

- name: template test 
    template: 
     src=myTemplateFile.j2 
     dest={{item}} 
    with_dict: some_dict 

i w Vars/main.yml

some_dict: 
    /path/to/dest1: 
    var1: 1 
    var2: 2 
    /path/to/dest2: 
    var1: 3 
    var2: 4 

i szablonów/myTemplateFile.j2

some_var = {{ item.value.var1 }} 
some_other_var = {{ item.value.var2 }} 

Nadzieja to rozwiąże problem .

+0

'with_dict' jest lepszym rozwiązaniem. – zx1986

1
- name: copy vhosts 
    template: src=site-vhost.conf dest=/etc/apache2/sites-enabled/{{ item }}.conf 
    with_items: 
    - somehost.local 
    - otherhost.local 
    notify: restart apache 

WAŻNE: Należy pamiętać, że pozycja nie musi być tylko ciąg, może to być obiekt z tak wielu właściwości, jak chcesz, więc w ten sposób można przekazać dowolną liczbę zmiennych.

W szablonie mam:

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName {{ item }} 
    DocumentRoot /vagrant/public 


    ErrorLog ${APACHE_LOG_DIR}/error-{{ item }}.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 

</VirtualHost> 
+0

Jak mogę uczynić obiekt obiektem? – camdixon

56

Z ansibl 2.x można użyć vars: z zadań.

Szablon test.j2:

mkdir -p {{myTemplateVariable}} 

Playbook:

- template: src=test.j2 dest=/tmp/File1 
    vars: 
    myTemplateVariable: myDirName 

- template: src=test.j2 dest=/tmp/File2 
    vars: 
    myTemplateVariable: myOtherDir 

Przepuszcza różne wartości myTemplateVariable do test.j2.

+0

początkowo popełniłem błąd i miałem vars: wcięty jak pozostałe argumenty szablonu (jak src :). Sądzę, że poziom wcięcia oznacza vars: jest zadaniem, a nie szablonem. Możesz to zrobić w dowolnym miejscu, nie tylko w szablonach. miły. – Greg

17

Można to zrobić bardzo łatwo, spójrz mój przełożony przepis:

- name: Setup Supervisor jobs files 
    template: 
    src: job.conf.j2 
    dest: "/etc/supervisor/conf.d/{{ item.job }}.conf" 
    owner: root 
    group: root 
    force: yes 
    mode: 0644 
    with_items: 
    - { job: bender, arguments: "-m 64", instances: 3 } 
    - { job: mailer, arguments: "-m 1024", instances: 2 } 
    notify: Ensure Supervisor is restarted 

job.conf.j2:

[program:{{ item.job }}] 
user=vagrant 
command=/usr/share/nginx/vhosts/parclick.com/app/console rabbitmq:consumer {{ item.arguments }} {{ item.job }} -e prod 
process_name=%(program_name)s_%(process_num)02d 
numprocs={{ item.instances }} 
autostart=true 
autorestart=true 
stderr_logfile=/var/log/supervisor/{{ item.job }}.stderr.log 
stdout_logfile=/var/log/supervisor/{{ item.job }}.stdout.log 

wyjściowa:

TASK [Supervisor : Setup Supervisor jobs files] ******************************** 
changed: [loc.parclick.com] => (item={u'instances': 3, u'job': u'bender', u'arguments': u'-m 64'}) 
changed: [loc.parclick.com] => (item={u'instances': 2, u'job': u'mailer', u'arguments': u'-m 1024'}) 

Enjoy!

0

Miałem podobny problem do rozwiązania, tutaj jest proste rozwiązanie, w jaki sposób przekazać zmienne do plików szablonów, wystarczy napisać plik szablonu, korzystając z tej zmiennej. Musisz utworzyć słownik (lista jest również możliwa), która zawiera zestaw zmiennych odpowiadających każdemu z plików. Następnie w pliku szablonu uzyskaj do nich dostęp.

patrz poniżej:

the template file: test_file.j2 
# {{ ansible_managed }} created by [email protected] 

{% set dkey = (item | splitext)[0] %} 
{% set fname = test_vars[dkey].name %} 
{% set fip = test_vars[dkey].ip %} 
{% set fport = test_vars[dkey].port %} 
filename: {{ fname }} 
ip address: {{ fip }} 
port: {{ fport }} 

Playbook

--- 
# 
# file: template_test.yml 
# author: [email protected] 
# 
# description: playbook to demonstrate passing variables to template files 
# 
# this playbook will create 3 files from a single template, with different 
# variables passed for each of the invocation 
# 
# usage: 
# ansible-playbook -i "localhost," template_test.yml 

- name: template variables testing 
    hosts: all 
    gather_facts: false 

    vars: 
    ansible_connection: local 
    dest_dir: "/tmp/ansible_template_test/" 
    test_files: 
     - file_01.txt 
     - file_02.txt 
     - file_03.txt 
    test_vars: 
     file_01: 
     name: file_01.txt 
     ip: 10.0.0.1 
     port: 8001 
     file_02: 
     name: file_02.txt 
     ip: 10.0.0.2 
     port: 8002 
     file_03: 
     name: file_03.txt 
     ip: 10.0.0.3 
     port: 8003 

    tasks: 
    - name: copy the files 
     template: 
     src: test_file.j2 
     dest: "{{ dest_dir }}/{{ item }}" 
     with_items: 
     - "{{ test_files }}" 
Powiązane problemy