我正在尝试编写一个 ansible 剧本来安装我的应用程序。我正在尝试检测环境变量是否未设置。我知道我可以使用
lookup
插件来查找如下环境变量:lookup('env', 'FOO')
。
我的问题是,如果未设置环境变量,
lookup
将返回一个空字符串。但是,如果环境变量is设置了,并且恰好是一个空白字符串,我将无法判断环境变量是否实际上设置为""
或完全未设置。
# my task:
- name:
when: lookup('env', 'FOO') == ''
ansible.builtin.debug:
msg: "FOO is unset!"
如果 FOO 未设置,则此任务将打印调试消息,而且如果 FOO 实际上是一个空字符串。
根据文档,
lookup
支持default
参数。另外根据文档,设置 default=Undefined
或 default=undef()
将导致剧本失败——这是真的,它会引发模板错误。
因为这基本上是Python的幕后黑手,我尝试设置
default=None
并像这样检查:
- name:
when: lookup('env', 'FOO', default=None) is None
ansible.builtin.debug:
msg: "FOO is unset!"
然而,这返回了一个模板错误,因为显然 Jinja 不理解 None。
fatal: [localhost]: FAILED! => {
"msg": "The conditional check 'lookup('env', 'FOO', default=None) is None' failed. The error was: template error while templating string: Could not load \"None\": 'None'. ..."
}
如何识别环境变量实际上未定义/未设置? (不是空白字符串。允许空白字符串,但在这种情况下它是set。这个变量实际上允许设置为任何内容;我只想检测它何时not。)
None
的神社值为none
,但这对你没有帮助;给定:
- hosts: localhost
gather_facts: false
tasks:
- debug:
msg: >-
{{ lookup('env', 'TESTVAR', default=none) }}
当
TESTVAR
未设置时,我们得到:
TASK [debug] **********************************************************************************************************************************************
ok: [localhost] => {
"msg": ""
}
我认为
lookup()
函数的语法在这种情况下并不是很有用。我认为检查未设置的环境变量的最佳选择是询问 shell,如下所示:
- hosts: localhost
gather_facts: false
tasks:
- register: res
failed_when: false
changed_when: res.rc != 0
shell: |
[ -z ${TESTVAR+x} ] && exit 1 || exit 0
- when: res is changed
debug:
msg: "TESTVAR is unset"
当
TESTVAR
未设置时,我们得到:
TASK [shell] **********************************************************************************************************************************************************************************************************************************************************************************************************
changed: [localhost]
TASK [debug] **********************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "TESTVAR is unset"
}
当设置
TESTVAR
时——即使是空字符串——我们得到:
TASK [shell] **********************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost]
TASK [debug] **********************************************************************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]