当我尝试使用错误 'NoneType' 对象没有属性 'group' 的组时,Ansible regex_search 失败

Ansible regex_search fails when I try to use a group with error 'NoneType' object has not attribute 'group'

我有许多用户 public 键,通过使用 URI 模块进行的 rest 调用获得,我想提取该键中包含的 uid。这是我角色的相关行

- name: find users UID within key
  debug: 
    msg: uid is "{{ item.content | regex_search( 'unixid=(\d+)', '\1') }}"

失败并出现错误:

'NoneType' object has no attribute 'group'

如果我在 ansible 上使用 -vvv,我发现它在这一行失败了

file "/usr/lib/python3.6/site-package/ansible/plugins/filter/core.py", line 156, in regex_search
  match = int(re.match(r'\(\d+)', arg).group(1))

相比之下,如果我在没有组搜索的情况下执行相同的正则表达式,则该命令工作正常,除此之外返回的 ID 多于我想要的 ID。

我能够通过将两个 regex_search 命令链接在一起来获得所需的功能,但它很难看。我想知道为什么群组不为 regex_search 工作。

regex_search 是为了 return 你匹配正则表达式,而不是组,或者至少在当前版本的 Ansible (although there are signs that it should work on the latest version?).

您可以使用 regex_findall 来解决这个问题,但是您必须添加一个 first 过滤器来处理创建的列表:

鉴于剧本:

- hosts: localhost
  gather_facts: no

  tasks:
    - debug: 
        msg: uid is "{{ item.content | regex_findall('unixid=(\d+)', '\1') | first }}"
      vars:
        item:
          content: 000 foo unixid=123 bar 987

这产生了回顾:

PLAY [localhost] **************************************************************************************************

TASK [find users UID within key] **********************************************************************************
ok: [localhost] => 
  msg: uid is "123"

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

我运行在遵循ansible的regex examples时遇到了类似的问题。该问题似乎与转义反斜杠有关。我找到了两种使用最新版本的 ansible 解决此问题的方法:

第一个只需要在您的代码中删除一个 \

- hosts: localhost
  gather_facts: no

  tasks:
    - vars:
        item:
          content: some text unixid=123 more text
      debug:
        msg: uid is "{{ item.content | regex_search('unixid=(\d+)', '') | first}}"

第二种方法会导致更多变化:

- hosts: localhost
  gather_facts: no

  tasks:
    - vars:
        item:
          content: some text unixid=123 more text
      debug:
        msg: "uid is \"{{ item.content | regex_search('unixid=(\d+)', '\1') | first}}\""

两者都产生相同的(期望的)输出:

PLAY [localhost] *************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [localhost] => {
    "msg": "uid is \"123\""
}

PLAY RECAP *******************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0