否则,请参见ansible打印声明

时间:2019-01-29 19:08:33

标签: ansible conditional

我想为具有多个条件的打印陈述的语法提供一些帮助。当前,'{{inventory_hostname}}'的引号引起错误,如果我删除引号,则剧本会运行,但会列出文本stock_hostname而不是变量。我想知道如何获取要打印的变量,以及if else语句中的语法是否正确。

- debug:
    msg: "{{ 'LTE status on '{{inventory_hostname}}'  is good to go!' if output.stdout | join('') is search('Selected = LTE') else  'LTE status on '{{inventory_hostname}}'  is not operational!' }}"

2 个答案:

答案 0 :(得分:2)

您可以改用以下语法:

"{% if test_var == true %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

请参阅下面的完整工作示例,我正在使用布尔值test_var来控制输出:

---
- hosts: localhost
  gather_facts: false
  vars:
    test_var: true
  tasks:

  - debug:
      msg: "{% if test_var == true %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

输出:

[http_offline@greenhat-29 tests]$ ansible-playbook test.yml 

PLAY [localhost] *******************************************************************************************************************************************************************************************************

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": " LTE status on 'localhost' is good to go!"
}

PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

[http_offline@greenhat-29 tests]$ 

编辑:

使用多行变量更新了PB:

---
- hosts: localhost
  gather_facts: false
  vars:
    test_var: ['text line 1', 'texttttttttttt Selected = LTE more text', 'text line 3']
  tasks:

  - debug:
      msg: "{% if test_var | join('') is search('Selected = LTE') %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

答案 1 :(得分:2)

尝试一下:

- debug:
    msg: "{{ output.stdout is search('Selected = LTE') | ternary('LTE status on ' + inventory_hostname + ' is good to go!', 'LTE status on ' + inventory_hostname + ' is not operational!') }}"

您最好简化自己的位置,并尽可能坚持使用纯Jinja2过滤器。希望这会更具可读性。

  • 已删除join('')。连接过滤器用于将数组连接为单个字符串。 stdout是一个字符串。 stdout_lines是基于数组的输出版本,因此,join('')在这种情况下显得多余。
  • 删除了所有if / else内容,并替换为三元过滤器。这只是一个布尔值,如果为true,则返回第一个字符串;如果为false,则返回第二个字符串
  • 删除了无效的嵌套{{}}。如果您查看三元过滤器,您会发现{{}} 'string' + variable_name内部结合了文字字符串和变量