如何在 Ansible playbook 中编写动态变量 [英] How to write dynamic variable in Ansible playbook

查看:50
本文介绍了如何在 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被传递,那么变量值将是

If param1,param2,param3 are passed then variable value will be

myvariable: 'param1,param2,param3' 

当我尝试通过模板动态创建变量时,我的剧本总是采用以前的变量值.但是在 dest=roles/myrole/vars/main.yml 里面,它的写入正确值.

When I try to create variable dynamically through template then my playbook always takes previous variable value. But inside dest=roles/myrole/vars/main.yml its writing correct value.

我在这里尝试什么

- 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

So inside myrole directory I have created template and 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 来做到这一点,如下所示

As I know if only two condition then I can do this using inline expression like below

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

<代码><做某事>如果<某事是真的>else <做别的事情>

是否可以在 inline expression 中使用 if - elif - else 像上面那样.或者任何其他方式在 ansible playbook 中动态分配值?

Is it possible if - elif - else in inline expression like above. Or any other way to assign value dynamically in ansible playbook?

推荐答案

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

I am sure there is a smarter way for doing what you want but this should work:

- 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

Hope that helps. I am not sure if you can construct variables dynamically and do this in an iterator. But you could also write a small python code or any other language and plug it into ansible

这篇关于如何在 Ansible playbook 中编写动态变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆