当我尝试使用错误 '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
我有许多用户 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