jinja2 - 如何在 Ansible playbook 中编写动态变量

标签 jinja2 ansible ansible-playbook

基于 extra vars参数我需要在ansible playbook中写入变量值

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

如果只是参数 1 通过
myvariable: 'param1'  

如果只是参数 1,参数 2 通过
myvariable: 'param1,param2' 

参数 1、参数 2、参数 3 传递然后变量值将是
myvariable: 'param1,param2,param3' 

当我尝试通过模板动态创建变量时,我的剧本总是采用以前的变量值。但里面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 我创建的目录 templatevars
- 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 - elseinline expression像上面一样。或者任何其他方式在 ansible playbook 中动态分配值?

最佳答案

我相信有一种更聪明的方法可以做你想做的事,但这应该有效:

- 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 代码或任何其他语言并将其插入 ansible

关于jinja2 - 如何在 Ansible playbook 中编写动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264226/

相关文章:

ansible - 如何将 echo 命令的结果放入 ansible 变量中

yaml - 如何以正确的方式将变量分配给 Ansible 中的另一个变量?

flask - jinja 是否支持宏中的多个 block ?

ansible - 具有 IP 范围的主机

ansible - 从变量创建字典键并添加 IP 列表作为值

Ansible Playbook 是否需要指定要通过 dist-upgrade 设置的包的确切版本?

yaml - 如何使用 Ansible 遍历嵌套的 dict 结构?

ansible - 无法使用项目列表(数组)读取自定义事实

python - Jinja2 未获取模板 "No template file present: default.j2 "

filter - Ansible/Jinja2 - 映射列表中的嵌套键