webentwicklung-frage-antwort-db.com.de

Wie benutzt man ein Template-Modul mit verschiedenen Variablen?

Mein Anwendungsfall ist der folgende:

Ich habe eine Vorlagendatei und möchte aus dieser Vorlage zwei verschiedene Dateien erstellen, wobei die Variablen für jede Datei mit einem anderen Variablensatz gefüllt werden.

Nehmen wir zum Beispiel an, ich möchte die Datei mit der Zeile vorlegen:

mkdir -p {{myTemplateVariable}}

Ich möchte einen geeigneten Weg finden, um diese Variable mit "File1" und "File2" zu füllen. So etwas wie :

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


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

wobei ich für das erste Template angeben könnte, dass die zu verwendende Variable a = "File1" und für das zweite b = "File2" ist.

74
Kestemont Max

Leider unterstützt das Modul template keine Übergabe von Variablen an dieses Modul, die innerhalb der Vorlage verwendet werden können. Es gab eine Feature-Anfrage aber es wurde abgelehnt.

Ich kann mir zwei Problemumgehungen vorstellen:

1. Include

Die Anweisung include unterstützt die Übergabe von Variablen. Sie können also Ihre template -Aufgabe in eine zusätzliche Datei einfügen und sie zweimal mit den entsprechenden Parametern versehen:

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. MyTemplateVariable neu definieren

Eine andere Möglichkeit wäre, myTemplateVariable einfach kurz vor jeder template Aufgabe neu zu definieren.

- 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
34
udondan

Mit Ansible 2.x können Sie vars: mit Aufgaben.

Vorlage test.j2:

mkdir -p {{myTemplateVariable}}

Spielbuch:

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

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

Dadurch werden unterschiedliche myTemplateVariable Werte an test.j2 übergeben.

115

Sie können dies ganz einfach tun. Schauen Sie sich mein Supervisor-Rezept an:

- 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

Ausgabe:

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'})

Genießen!

34
Tecnocat

Dies ist eine Lösung/ein Hack, den ich verwende:

aufgaben/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'

templates/test.j2:

{{ item }}

Nachdem Sie dies ausgeführt haben, erhalten Sie this is var_a In/tmp/templateA und this is var_b In/tmp/templateB.

Grundsätzlich missbrauchen Sie with_items, Um die Vorlage mit jedem Element in der Einzelelementliste zu rendern. Dies funktioniert, weil Sie mit with_items Steuern können, wie die Liste lautet.

Der Nachteil dabei ist, dass Sie item als Variablennamen in Ihrer Vorlage verwenden müssen.

Wenn Sie mehr als eine Variable auf diese Weise übergeben möchten, können Sie als Listenelemente Folgendes festlegen:

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'

und verweisen Sie dann auf sie in Ihrer Vorlage wie folgt:

{{ item.var_1 }}
{{ item.var_2 }}
21
asmigala

Ich habe es so gemacht.

In aufgaben/main.yml

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

und in vars/main.yml

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

und in templates/myTemplateFile.j2

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

Hoffe das löst dein Problem.

7

Ich hatte ein ähnliches Problem zu lösen. Hier ist eine einfache Lösung für die Übergabe von Variablen an Vorlagendateien. Der Trick besteht darin, die Vorlagendatei unter Ausnutzung der Variablen zu schreiben. Sie müssen ein Wörterbuch erstellen (eine Liste ist ebenfalls möglich), das die Variablen enthält, die den einzelnen Dateien entsprechen. Dann innerhalb der Vorlagendatei darauf zugreifen.

siehe unten:

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 }}

das Spielbuch

---
#
# 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 }}"
1
xbalaji
- name: copy vhosts
  template: src=site-vhost.conf dest=/etc/Apache2/sites-enabled/{{ item }}.conf
  with_items:
    - somehost.local
    - otherhost.local
  notify: restart Apache

WICHTIG: Beachten Sie, dass ein Element nicht nur ein String sein muss, sondern ein Objekt mit beliebig vielen Eigenschaften, sodass Sie beliebig viele Variablen übergeben können.

In der Vorlage habe ich:

<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>
1
Bart McLeod

Ein weiteres Beispiel aus der Praxis mit einer Liste

ein Auszug aus einer Vorlage für die php.ini

{% if 'cli/php.ini' in item.d %}
max_execution_time = 0
memory_limit = 1024M
{% else %}
max_execution_time = 300
memory_limit = 512M
{% endif %}

Dies ist die Var

php_templates:
  - { s: 'php.ini.j2', d: "/etc/php/{{php_version}}/Apache2/php.ini" }
  - { s: 'php.ini.j2', d: "/etc/php/{{php_version}}/cli/php.ini" }

Dann setze ich damit ein

- name: Push templated files
  template:
    src: "{{item.s}}"
    dest: "{{item.d}}"
    mode: "{{item.m | default(0644) }}"
    owner: "{{item.o | default('root') }}"
    group: "{{item.g | default('root') }}"
    backup: yes
  with_items: "{{php_templates}}"
0
krad