识别环境变量是否未设置

问题描述 投票:0回答:1

我正在尝试编写一个 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。)

ansible
1个回答
0
投票

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]
© www.soinside.com 2019 - 2024. All rights reserved.