Подтвердить что ты не робот

Как написать динамическую переменную в Ansible playbook

На основе параметра extra vars Мне нужно записать значение переменной в ansible playbook

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

Если прошло param1

myvariable: 'param1'  

Если только param1, param2 прошел

myvariable: 'param1,param2' 

Если param1, param2, param3, то значение переменной будет

myvariable: 'param1,param2,param3' 

Когда я пытаюсь создать динамически динамически с помощью шаблона, тогда моя playbook всегда принимает предыдущее значение переменной. Но внутри dest=roles/myrole/vars/main.yml написано правильное значение.

Что я здесь делаю?

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

Итак, внутри каталога myrole я создал template и vars

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

шаблоны /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 %} 

Как я знаю, если только два условия, то я могу сделать это, используя inline expression, как показано ниже

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

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

Возможно ли if - elif - else в inline expression, как указано выше. Или каким-либо другим способом динамически присваивать значение в незанятой пьесе?

4b9b3361

Ответ 1

Я уверен, что есть более умный способ сделать то, что вы хотите, но это должно работать:

- 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

Надеюсь, что это поможет. Я не уверен, что вы можете динамически строить переменные и делать это в итераторе. Но вы также можете написать небольшой код python или любой другой язык и подключить его к незаменимым

Ответ 2

Сначала я предлагаю вам отступить и посмотреть, как организовать ваши пьесы, чтобы не требовать такой сложности, но если вы действительно это делаете, используйте следующее:

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

Ответ 3

my_var: объявленная переменная

VAR: переменная, значение которой должно быть проверено

param_1, param_2: значения переменной VAR

value_1, value_2, value_3: значения, которые должны быть назначены my_var в соответствии со значениями my_var

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