如果正则表达式失败,则ansible解析额外的var使用默认值

时间:2017-09-06 16:55:16

标签: regex ansible jinja2

我有以下代码,它不会抛出错误,但事实是空的

  - shell: echo '{{ p }}'
    register: results

  - debug:
      var: results

  - set_fact:
      myrepo: "{{ results.stdout | regex_search(regexp,'\\1') | default ( {'0':'global'} ) }}"
    vars:
      regexp: '(.*)/(.*)'

这是输出

TASK [command] **************************************************************************************************************************************************************************************
changed: [localhost]

TASK [debug] ****************************************************************************************************************************************************************************************
ok: [localhost] => {
    "results": {
        "changed": true, 
        "cmd": "echo 'tim'", 
        "delta": "0:00:00.095831", 
        "end": "2017-09-06 16:37:19.977023", 
        "rc": 0, 
        "start": "2017-09-06 16:37:19.881192", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "tim", 
        "stdout_lines": [
            "tim"
        ]
    }
}

TASK [set_fact] *************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ****************************************************************************************************************************************************************************************
ok: [localhost] => {
    "myrepo": ""
}

命令为ansible-playbook -i hosts -c local file.yml --extra-vars "p=tim"如果正则表达式结果为空,我希望myrepo为global

1 个答案:

答案 0 :(得分:1)

没有任何参数default仅当值为Undefined时才会触发过滤器。但是,无法匹配的regexp结果是一个空字符串,未定义。您可能想要设置boolean标志:

  - set_fact:
      myrepo: "{{ results.stdout | regex_search(regexp,'\\1') | default('global', boolean=True) }}"
    vars:
      regexp: '(.*)/(.*)'