If else 在 ansible print 语句中

If else in ansible print statement

我需要一些有关具有多个条件的打印语句语法的帮助。目前,'{{inventory_hostname}}' 的引号导致错误,如果我删除引号,剧本会运行但会列出文本 inventory_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!' }}"

您可以改用此语法:

"{% 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 %}"

试试这个:

- 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 内容并替换为三元过滤器。这只需要一个布尔值和 returns 如果为真则为第一个字符串,如果为假则为第二个字符串
  • 删除了无效的嵌套 {{}}。如果你查看三元过滤器,你会看到在 {{}} 'string' + variable_name 内部将文字字符串与变量
  • 组合在一起