我有这段代码,用于检查变量“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 %}
有人可以给我提示或帮助吗?
问:“变量接受空值”
答:这是一个错误。 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
只需使用您的 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
我认为最接近您所要求的答案是:
varexample is defined and varexample is match('^[a-zA-Z]+$')
您还可以使用“未定义”,或者仅提供其他答案中提到的默认值是另一种好方法。
varexample|default('') is match('^[a-zA-Z]+$')
正则表达式匹配,因为
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