使用 Ansible 允许变量中存在 null 或空值

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

我有这段代码,用于检查变量“owner”是否与以下正则表达式匹配,并接受它是未定义的,也就是说,剧本可以在不传递该变量的情况下工作。

varexample is undefined or varexample is match('^[a-zA-Z]+$')

我想做的是这个变量接受空值或空值。我尝试过的是这样的

varexample is null or varexample is match('^[a-zA-Z]+$')

但是我收到了这个错误:

The conditional check 'varexample is null or varexample is match('[a-zA-Z]+')' failed. The error was: template error while templating string: no test named 'null'. String: {% if varexample is null or varexample is match('[a-zA-Z]+') %} True {% else %} False {% endif %}

有人可以给我提示或帮助吗?

linux automation ansible yaml
4个回答
2
投票

问:变量接受空值

答:这是一个错误。 Ansible 不应将 null

'^[a-zA-Z]+$'

匹配
    - set_fact:
        varexample:
    - debug:
        var: varexample
    - debug:
        msg: "undefined: {{ varexample is undefined }}"
    - debug:
        msg: "match: {{ varexample is match('^[a-zA-Z]+$') }}"

给予

  varexample: null
  msg: 'undefined: False'
  msg: 'match: True'

由于此错误,您的情况应该按预期工作

  varexample is undefined or varexample is match('^[a-zA-Z]+$')

为了保存,为了修复错误,您可以另外测试None,例如

    - debug:
        msg: "Test passed. varexample: {{ item.varexample }}"
      when: item.varexample is undefined or
            item.varexample == None or
            item.varexample is match('^[a-zA-Z]+$')
      loop:
        - varexample: ABC
        - varexample: 123
        - varexample:

给予

ok: [localhost] => (item={'varexample': 'ABC'}) => 
  msg: 'Test passed. varexample: ABC'
skipping: [localhost] => (item={'varexample': 123}) 
ok: [localhost] => (item={'varexample': None}) => 
  msg: 'Test passed. varexample: '

详情

    - debug:
        msg: |
          Undefined: {{ item.varexample is undefined }}
          Is None: {{ item.varexample == None }}
          Match a-zA-Z: {{ item.varexample is match('^[a-zA-Z]+$') }}
      loop:
        - varexample: ABC
        - varexample: 123
        - varexample:
ok: [localhost] => (item={'varexample': 'ABC'}) => 
  msg: |-
    Undefined: False
    Is None: False
    Match a-zA-Z: True
ok: [localhost] => (item={'varexample': 123}) => 
  msg: |-
    Undefined: False
    Is None: False
    Match a-zA-Z: False
ok: [localhost] => (item={'varexample': None}) => 
  msg: |-
    Undefined: False
    Is None: True
    Match a-zA-Z: True

0
投票

只需使用您的 default

 会认为真实的 
match

例如;有了

varexample | default('a') is match('^[a-zA-Z]+$')
,您应该能够实现您想要的目标。

鉴于任务:

- debug:
    msg: "for {{ item }} the result is {{ item | default('a') is match('[a-zA-Z]+') }}"
  loop: "{{ cases }}"
  vars:
    cases:
      - ~
      - 123
      - abc
      - 

- debug:
    msg: "for an undefined variable the result is {{ item | default('a') is match('[a-zA-Z]+') }}"

这产生:

TASK [debug] ****************************************************************************
ok: [localhost] => (item=None) => 
  msg: for  the result is True
ok: [localhost] => (item=123) => 
  msg: for 123 the result is False
ok: [localhost] => (item=abc) => 
  msg: for abc the result is True
ok: [localhost] => (item=None) => 
  msg: for  the result is True

TASK [debug] ****************************************************************************
ok: [localhost] => 
  msg: for an undefined variable the result is True

0
投票

我认为最接近您所要求的答案是:

varexample is defined and varexample is match('^[a-zA-Z]+$')

您还可以使用“未定义”,或者仅提供其他答案中提到的默认值是另一种好方法。

varexample|default('') is match('^[a-zA-Z]+$')

0
投票

正则表达式匹配,因为

var
已转换为字符串,并且由于 var 未定义,字符串值将为
'None'
。很容易检查:如果 var 未定义,以下匹配将返回
true
var is match('^None$')

所以我对这个问题的解决方案是:

(var | length > 0) if ((var | type_debug) == 'AnsibleUnicode') else false

(var | type_debug) == 'AnsibleUnicode'
- 检查变量类型是否为字符串,如果是字符串,则在字符串长度不等于 0 时返回 true:
var | length > 0

以下是重现上述内容的任务:

- name: Result should be true, since var is interpollated to 'None'
  vars:
    var:
  debug:
    msg: |
      {{ var is match('^None$') }}
- name: Best match that works for all cases and checks if variable is notempty string
  vars:
    var1:
    var2: ""
    var3: "non empty string"
  debug:
    msg: |
      Should be False:
      {{ (var1 | length > 0) if ((var1 | type_debug) == 'AnsibleUnicode') else false }}
      Should be False:
      {{ (var2 | length > 0) if ((var2 | type_debug) == 'AnsibleUnicode') else false }}
      Should be True:
      {{ (var3 | length > 0) if ((var3 | type_debug) == 'AnsibleUnicode') else false }}

结果如下:

TASK [Result should be true, since var is interpollated to 'None'] **************************************************************************************************************************
ok: [localhost] => 
  msg: true

TASK [Best match that works for all cases and checks if variable is notempty string] ********************************************************************************************************
ok: [localhost] => 
  msg: |-
    Should be False:
    False
    Should be False:
    False
    Should be True:
    True
© www.soinside.com 2019 - 2024. All rights reserved.