如何使Ansible Jinja2查找循环成为一个列表?

如何使Ansible Jinja2查找循环成为一个列表?,ansible,jinja2,Ansible,Jinja2,在Ansible中,我试图从环境变量列表中获取第一个定义的值:BUILD\u USER\u EMAIL,GERRIT\u CHANGE\u OWNER\u EMAIL,GERRIT\u EVENT\u ACCOUNT\u EMAIL,GERRIT\u PATCHSET\u UPLOADER\u EMAIL 获取一个的代码如下所示 - email: "{{ lookup('env', 'BUILD_USER_EMAIL')}}" 如果未定义变量,则解析为空字符串,即ok 现在的问题是如何将其实现

在Ansible中,我试图从环境变量列表中获取第一个定义的值:
BUILD\u USER\u EMAIL
GERRIT\u CHANGE\u OWNER\u EMAIL
GERRIT\u EVENT\u ACCOUNT\u EMAIL
GERRIT\u PATCHSET\u UPLOADER\u EMAIL

获取一个的代码如下所示

- email: "{{ lookup('env', 'BUILD_USER_EMAIL')}}"
如果未定义变量,则解析为空字符串,即ok


现在的问题是如何将其实现为回退循环,以便我尝试找到第一个定义的值。

我可以将其视为解决方案:

- email: "{{ lookup('env', 'BUILD_USER_EMAIL') |
             default(lookup('env', 'GERRIT_CHANGE_OWNER_EMAIL'), True) |
             default(lookup('env', 'GERRIT_EVENT_ACCOUNT_EMAIL'), True) |
             default(lookup('env', 'GERRIT_PATCHSET_UPLOADER_EMAIL'), True) |
             default('UNDEFINED', True) }}"

True
用于强制jinja2将空字符串计算为None。

我可以将此视为一种解决方案:

- email: "{{ lookup('env', 'BUILD_USER_EMAIL') |
             default(lookup('env', 'GERRIT_CHANGE_OWNER_EMAIL'), True) |
             default(lookup('env', 'GERRIT_EVENT_ACCOUNT_EMAIL'), True) |
             default(lookup('env', 'GERRIT_PATCHSET_UPLOADER_EMAIL'), True) |
             default('UNDEFINED', True) }}"
True
用于强制jinja2将空字符串计算为None。

一个基于改进的答案

如果不希望在两个变量都未设置的情况下失败,您可能需要添加
| default
过滤器,或者只需在
列表的末尾添加一个默认值。

一个基于改进的答案


如果不希望在两个变量都未设置的情况下失败,您可能需要添加
|default
过滤器,或者只需将默认值添加到
列表的末尾。

很好!我想你可以用一个简单的
| select | list
来简化,正如select doc所说的“如果没有指定测试,每个对象都将作为布尔值进行计算。”空字符串的计算结果为False,因此不会被选择;但它不那么明确,很好!我想你可以用一个简单的
| select | list
来简化,正如select doc所说的“如果没有指定测试,每个对象都将作为布尔值进行计算。”空字符串的计算结果为False,因此不会被选择;但它没有那么明确。