【问题标题】:Ansible if else with vars passing to different playbookAnsible if else 将变量传递给不同的剧本
【发布时间】:2019-01-22 17:37:59
【问题描述】:

我正在尝试通过带有 if else 条件的 var 将变量传递给另一个剧本

- hosts: localhost
- import_playbook: merge.yml
  vars:
    variables:
      - "{{ {'test: 'xyz'} if ( flag == true) else  {'test': 'abc'} }}"

当我在 merge.yml 中打印值时,它总是打印 test:abc。我正在使用命令 ansible-playbook test.yml -e flag=true 执行剧本

这是受支持的语法吗?无论如何我可以使用 if else 和 vars 吗?

【问题讨论】:

  • 你能把一个完整的例子和一个 merge.yml 放在一起吗?并包括在 flag=true 和 flag=false 运行时的确切调用以及输出?
  • 我只是打印merge.yml --- - hosts: localhost tasks: - debug: msg={{ variables }} - debug: msg={{ flag }}中的值
  • output is ok: [localhost] => { "msg": [ { "test": "abc" } ] } with both flag=true and flag=false

标签: ansible


【解决方案1】:

我认为您的核心问题是 Ansible 会将您的 -e "flag=true" 视为字符串,而不是布尔值。因此,无论您将其设置为什么,它都将始终为真。

此外,您必须小心在 {{}} 中放置的内容。人们很容易认为它是成熟的 Python,而实际上它是 Jinja2。因此,您最好尽可能坚持纯 Jinja2。作为替代方案,这对我有用:

---
- import_playbook: merge.yml
  vars:
    variables: "{{ ( flag | default(false) ) | bool | ternary( {'test': 'xyz'}, {'test': 'abc'} ) }}"
  • ( flag | default(false) )flag 提供默认值,以防-e 未传递它。请注意,这一切都需要包含在 () 中,否则只有 default(false) 的输出会被语句的其余部分评估。
  • bool 强制 Ansible 将字符串转换为布尔值
  • ternary( {'test': 'xyz'}, {'test': 'abc'} ) 将在传递 true 的情况下使用第一个值,如果传递 false 则使用第二个值

其他一些想法:

  • 你不需要- hosts: localhost,因为你没有附加任何任务。
  • 您是否特别需要使用import_playbook?更常见的模式是将合并任务放在包含文件中,而不是完整的剧本:

playbook.yml

---

- hosts: localhost
  connection: local
  tasks:
    - include: merge.yml
      vars:
        variables: "{{ ( flag | default(false) ) | bool | ternary( {'test': 'xyz'}, {'test': 'abc'} ) }}"

然后合并.yml

---

- debug:
    var: variables

【讨论】:

  • 谢谢。该解决方案奏效了。是的,我同意 hosts:localhost,我不需要它们。我们大多只使用 URI 模块。我不确定 import_playbook 与 include_tasks 有何不同
  • import_playbook 引入了一系列任务,这些任务在完全不同的剧本中运行。至少,这带来了不得不再次指定要定位的主机的不便。这也意味着在初始播放中定义的播放范围变量对导入的任务不可用。相比之下,包含只是将更多任务添加到现有游戏中,已经针对调用游戏的主机并可以访问其所有变量。经验法则是始终选择包含,除非您特别需要 import_playbook。
猜你喜欢
  • 2022-06-15
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多