it-swarm.com.de

Wie schreibe ich dynamische Variablen in Ansible Playbook

Basierend auf dem Parameter extra vars Muss ich den Variablenwert in ansible playbook Schreiben

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

Wenn nur param1 übergeben wird

myvariable: 'param1'  

Wenn nur param1, param2 übergeben wird

myvariable: 'param1,param2' 

Wenn param1, param2, param übergeben wird, ist der variable Wert

myvariable: 'param1,param2,param3' 

Wenn ich versuche, eine Variable dynamisch über eine Vorlage zu erstellen, nimmt mein Playbook immer den vorherigen Variablenwert an. Aber in dest=roles/myrole/vars/main.yml Steht der korrekte Wert.

Was ich hier probiere

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

Also in myrole Verzeichnis habe ich template und vars erstellt

- 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ß, kann ich dies mit inline expression Wie folgt tun, wenn nur zwei Bedingungen vorliegen

{{ '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, um im ansible Playbook dynamisch Werte zuzuweisen?

33
Roopendra

Ich bin sicher, es gibt eine intelligentere Methode, um das 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

Hoffentlich hilft das. Ich bin nicht sicher, ob Sie Variablen dynamisch konstruieren und dies in einem Iterator tun können. Sie können aber auch einen kleinen python Code oder eine andere Sprache schreiben und in ansible einbinden

39
DomaNitro

my_var: die deklarierte Variable

VAR: die Variable, deren Wert überprüft werden soll

param_1, param_2: Werte der Variablen VAR

value_1, value_2, value_3: Die Werte, die my_var gemäß den Werten von my_var zugewiesen werden sollen

my_var: "{{ 'value_1' if VAR == 'param_1' else 'value_2' if VAR == 'param_2' else 'value_3' }}"
23
AnshBikram

Ich würde zunächst vorschlagen, dass Sie einen Schritt zurücktreten und versuchen, Ihre Stücke so zu organisieren, dass eine solche Komplexität nicht erforderlich ist. Wenn Sie dies jedoch wirklich tun, gehen Sie folgendermaßen vor:

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