条件语句前的Ansible求值变量
我试图只“打印/显示”现有变量。变量名是动态的。问题是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
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}}"
更有趣的问题是:为什么你的工作环境在工作…更有趣的问题是:为什么你的工作环境在工作。。。