2014-04-24 12 views
30

auf extra vars Parametern Basierend I Need ansible playbookWie dynamische Variable in ansible Textbuch schreiben

ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3" 

Wenn nur param1 bestand in Variablenwert schreiben

myvariable: 'param1' 

Wenn nur param1, param2 bestanden

myvariable: 'param1,param2' 

Wenn param1, param2, param3 weitergegeben werden dann Variablenwert

myvariable: 'param1,param2,param3' 

sein wird, wenn ich versuche, Variable zu erstellen dynamisch durch Vorlage dann nimmt mein Textbuch immer vorherigen Variablenwert. Aber innerhalb dest=roles/myrole/vars/main.yml sein richtiger Schreibwert.

Was ich mache einen Versuch hier

- hosts: local 
    user: roop 
    gather_facts: yes 
    connection: local 

    tasks: 

    - template: src=roles/myrole/templates/myvar.j2 dest=roles/myrole/vars/main.yml 

    - debug: var=myvariable 

    roles: 
     - { role: myrole } 

So innen myrole Verzeichnis Ich habe erstellt template und vars

- roles 
    - myrole 
    - vars/main.yml 
    - templates/myvar.j2 

templates/myvar.j2

{% if param1 is defined and param2 is defined and param3 is defined %} 
    myvariable: 'param1,param2,param3' 
{% elif param1 is defined and param2 is defined %} 
    myvariable: 'param1,param2' 
{% elif param1 is defined %} 
    myvariable: 'param1' 
{% else %} 
    myvariable: 'default-param' 
{% endif %} 

Wie ich weiß, wenn nur zwei Zustand dann kann ich dies mit inline expression wie tun unter

{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }} 

<do something> if <something is true> else <do something else>

Ist es möglich, if - elif - else in inline expression wie oben. Oder eine andere Möglichkeit, den Wert dynamisch in einem Buch anzulegen?

Antwort

36

Ich bin sicher, es gibt eine intelligentere Weise zu tun, was Sie wollen, aber dies sollte funktionieren:

- name   : Test var 
    hosts  : all 
    gather_facts : no 
    vars: 
    myvariable : false 
    tasks: 
    - name: param1 
     set_fact: 
     myvariable: "{{param1}}" 
     when: param1 is defined 

    - name: param2 
     set_fact: 
     myvariable: "{{ param2 if not myvariable else myvariable + ',' + param2 }}" 
     when: param2 is defined 

    - name: param3 
     set_fact: 
     myvariable: "{{ param3 if not myvariable else myvariable + ',' + param3 }}" 
     when: param3 is defined 

    - name: default 
     set_fact: 
     myvariable: "default" 
     when: not myvariable 

    - debug: 
     var=myvariable 

Hoffnung, das hilft. Ich bin nicht sicher, ob Sie Variablen dynamisch erstellen können und dies in einem Iterator tun.Aber Sie könnten auch einen kleinen Python-Code oder eine andere Sprache schreiben und es in ansible

+0

Nizza my_var. Es funktioniert. – Roopendra

+1

@Roopendra 16 Zeilen Code eine Liste der 3 Werte verketten weit davon entfernt ist schön. – ceving

+0

Vereinbarte @ceving aber manchmal konzentrieren wir uns auf Lösung und dann später Optimierung. Zu dieser Zeit war dies die einzige Lösung. Ich freue mich, wenn Sie die optimierte Antwort teilen. Vielleicht hilft es auch anderen Leuten. – Roopendra

14

Ich würde zunächst vorschlagen, dass Sie zurücktreten und betrachten Ihre Spiele zu organisieren, um solche Komplexität nicht zu erfordern, aber wenn Sie wirklich wirklich tun, verwenden Sie die folgenden:

vars: 
    myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}" 
+0

Danke für die Antwort. Erste Ausgabe '„,,“' nach dem Wechsel myvariable wie von Ihnen vorgeschlagen. – Roopendra

+5

Versuchen mit [ 'reject'] (http://jinja.pocoo.org/docs/dev/templates/#reject) und [' tests'] (http://jinja.pocoo.org/docs/dev/templates/# builtin-Tests): '{{[param1, param2, param3, param4] | reject ('undefined') | join ('')}}' – bufh

8

my_var: die Variable deklariert

VAR: die Variable, deren Wert

PARAM_1, PARAM_2 geprüft werden: die Werte der variablen VAR

value_1, value_2, VALUE_3: die Werte zugeordnet werden entsprechend den Werten von my_var

my_var: "{{ 'value_1' if VAR == 'param_1' else 'value_2' if VAR == 'param_2' else 'value_3' }}" 
Verwandte Themen