今天我花了一些时间尝试编写一些 Ansible 脚本,以便仅在相关命令输出中不存在相应行的情况下运行命令。经过一番尝试和错误后,我得到了一些对我有用的东西,但我不清楚为什么我与空字符串的初始比较不起作用。
这是一个演示我的问题的剧本:
- name: test
hosts: localhost
tasks:
- shell: "cat /tmp/cmdoutput"
register: cmdoutput
- debug: var=filtered_output
vars:
filtered_output: "{{ cmdoutput.stdout | regex_search(item) }}"
with_items:
- "aa .* xx"
- "bb .* yy"
- debug: msg="do action that inserts {{ item }}"
with_items:
- "aa .* xx"
- "bb .* yy"
when: cmdoutput.stdout | regex_search(item) == ""
- debug: msg="do action that inserts {{ item }}"
with_items:
- "aa .* xx"
- "bb .* yy"
when: not cmdoutput.stdout | regex_search(item)
Run Code Online (Sandbox Code Playgroud)
cat /tmp/cmdoutput
aa b c d xx
aa f g h yy
bb i j k xx
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
$ ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [test] **********************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [localhost]
TASK [shell] *********************************************************************************************************************
changed: [localhost]
TASK [debug] *********************************************************************************************************************
ok: [localhost] => (item=None) => {
"filtered_output": "aa b c d xx"
}
ok: [localhost] => (item=None) => {
"filtered_output": ""
}
TASK [debug] *********************************************************************************************************************
skipping: [localhost] => (item=None)
skipping: [localhost] => (item=None)
TASK [debug] *********************************************************************************************************************
skipping: [localhost] => (item=None)
ok: [localhost] => (item=None) => {
"msg": "do action that inserts bb .* yy"
}
PLAY RECAP ***********************************************************************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
ie "filtered_output": "",但是当比较不匹配时出现以下情况。
所以我的问题是:
""?regex_search?-(此时 AFAICT)它不在jinja doco中,仅作为简短示例出现在官方文档的过滤器部分中我的 Ansible 版本:2.5.1
谢谢
问:为什么当条件匹配“”时第二次调试不成功?
\nA:当没有正则表达式匹配的NoneType类型的对象时,返回。该类型没有长度。而不是测试空字符串(题外话请参阅Ansible Lint: Don\xe2\x80\x99t 与空字符串比较)
\n when: cmdoutput.stdout|regex_search(item) == ""\nRun Code Online (Sandbox Code Playgroud)\n使用(你的例子中已经有了它)
\n when: not cmdoutput.stdout|regex_search(item)\nRun Code Online (Sandbox Code Playgroud)\nNone和空字符串的计算结果均为False ,非空字符串的计算结果为True。
\n问:“如何轻松查看这个 NoneType 对象?”
\n答:使用过滤器type_debug。例如,如果搜索成功
\n - debug:\n msg: "{{ cmdoutput.stdout|regex_search(\'a\') }}"\n vars:\n cmdoutput:\n stdout: abc\nRun Code Online (Sandbox Code Playgroud)\n结果是一个字符串
\n msg: a\nRun Code Online (Sandbox Code Playgroud)\n可以看到结果的类型
\n - debug:\n msg: "{{ cmdoutput.stdout|regex_search(\'a\')|type_debug }}"\n vars:\n cmdoutput:\n stdout: abc\nRun Code Online (Sandbox Code Playgroud)\n给出
\n msg: str\nRun Code Online (Sandbox Code Playgroud)\n如果搜索失败,结果为None
\n - debug:\n msg: "{{ cmdoutput.stdout|regex_search(\'x\') }}"\n vars:\n cmdoutput:\n stdout: abc\nRun Code Online (Sandbox Code Playgroud)\n msg: \'\'\nRun Code Online (Sandbox Code Playgroud)\n - debug:\n msg: "{{ cmdoutput.stdout|regex_search(\'x\')|type_debug }}"\n vars:\n cmdoutput:\n stdout: abc\nRun Code Online (Sandbox Code Playgroud)\n msg: NoneType\nRun Code Online (Sandbox Code Playgroud)\n \n
| 归档时间: |
|
| 查看次数: |
11556 次 |
| 最近记录: |