条件语句前的Ansible求值变量

条件语句前的Ansible求值变量,ansible,Ansible,我试图只“打印/显示”现有变量。变量名是动态的。问题是Ansible没有在when:语句中计算varibale名称。因此,当:(item.1+'\u wwn'+item.0)被定义为正常工作时,我无法获得 播放: --- - hosts: 127.0.0.1 vars: host_name: ['COM01ESX07', 'COM01ESX88'] COM01ESX07_wwn_2: "This exist" tasks: - debug: v

我试图只“打印/显示”现有变量。变量名是动态的。问题是Ansible没有在
when:
语句中计算varibale名称。因此,当:(item.1+'\u wwn'+item.0)被定义为正常工作时,我无法获得

播放:

---
- hosts: 127.0.0.1

  vars:
    host_name: ['COM01ESX07', 'COM01ESX88']
    COM01ESX07_wwn_2: "This exist"

  tasks:
    - debug:
        var: "{{item.1}}_wwn_{{item.0}}"
      when: (item.1 + '_wwn_' + item.0) is defined
      with_nested:
        - ['1', '2']
        - "{{host_name}}"
不幸的是,这将显示所有变量,即使它们未定义

TASK [debug] *******************************************************************************************************************************************************************
ok: [127.0.0.1] => (item=[u'1', u'COM01ESX07']) => {
    "COM01ESX07_wwn_1": "VARIABLE IS NOT DEFINED!", 
    "item": [
        "1", 
        "COM01ESX07"
    ]
}
ok: [127.0.0.1] => (item=[u'1', u'COM01ESX88']) => {
    "COM01ESX88_wwn_1": "VARIABLE IS NOT DEFINED!", 
    "item": [
        "1", 
        "COM01ESX88"
    ]
}
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX07']) => {
    "COM01ESX07_wwn_2": "This exist", 
    "item": [
        "2", 
        "COM01ESX07"
    ]
}
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX88']) => {
    "COM01ESX88_wwn_2": "VARIABLE IS NOT DEFINED!", 
    "item": [
        "2", 
        "COM01ESX88"
    ]
}
但是,如果我将when:替换为
when:({{item.1+'\u wwn{item.0})已定义

它会起作用的,尽管我会得到令人担忧的信息:

TASK [debug] *******************************************************************************************************************************************************************
 [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ({{item.1 + '_wwn_' + item.0}}) is defined

skipping: [127.0.0.1] => (item=[u'1', u'COM01ESX07']) 
skipping: [127.0.0.1] => (item=[u'1', u'COM01ESX88']) 
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX07']) => {
    "COM01ESX07_wwn_2": "This exist", 
    "item": [
        "2", 
        "COM01ESX07"
    ]
}
skipping: [127.0.0.1] => (item=[u'2', u'COM01ESX88'])
问题:
我如何避免出现警告消息,并且仍然只处理现有变量。

问题在于您的
状况。当你写

when: (item.1 + '_wwn_' + item.0) is defined
…括号中的部分只是字符串串联,它的计算结果都是字符串。就像你要写的那样:

when: "something" is defined
也就是说,它永远是真实的。您正在尝试使用动态变量名,这很棘手。ansible网站上有一个关于这个话题的网站。基本上,您必须显式引用
hostvars
toplevel变量(这样您就可以使用构建为字典键的字符串),这样您的任务看起来就像:

---
- hosts: localhost
  gather_facts: false
  vars:
    host_name: foo
  tasks:
    - set_fact:
        foo_wwn_1: wwn1

    - debug:
        var: "{{item.1}}_wwn_{{item.0}}"
      when: hostvars[inventory_hostname][item.1 + '_wwn_' + item.0] is defined
      with_nested:
        - ['1', '2']
        - "{{host_name}}"

问题在于您的
处于
状态时。当你写

when: (item.1 + '_wwn_' + item.0) is defined
…括号中的部分只是字符串串联,它的计算结果都是字符串。就像你要写的那样:

when: "something" is defined
也就是说,它永远是真实的。您正在尝试使用动态变量名,这很棘手。ansible网站上有一个关于这个话题的网站。基本上,您必须显式引用
hostvars
toplevel变量(这样您就可以使用构建为字典键的字符串),这样您的任务看起来就像:

---
- hosts: localhost
  gather_facts: false
  vars:
    host_name: foo
  tasks:
    - set_fact:
        foo_wwn_1: wwn1

    - debug:
        var: "{{item.1}}_wwn_{{item.0}}"
      when: hostvars[inventory_hostname][item.1 + '_wwn_' + item.0] is defined
      with_nested:
        - ['1', '2']
        - "{{host_name}}"

更有趣的问题是:为什么你的工作环境在工作…更有趣的问题是:为什么你的工作环境在工作。。。