如何在Ansible中使用regex_search精准提取CN=后的子字符串
解决Ansible中提取CN字段值的问题
问题根源
你之前用的正则CN=(.*),(.*$)里,.*是贪婪匹配,会尽可能匹配更多字符,所以会从CN=一直匹配到最后一个逗号前的内容,导致带出多余字段。另外,用split(',')后直接调用regex_search也不对——split后得到的是列表,regex_search会把整个列表当成字符串处理,所以返回结果带了列表格式的冗余内容。
正确解决方案
下面两种方法都能精准提取CN=后的目标子串:
方法1:使用精准正则直接提取
利用排除式匹配,确保只取到下一个逗号前的内容:
--- - hosts: localhost connection: local gather_facts: false vars: str1: "CN=*.company.com,O=WWT,L=STL,ST=Missouri,C=US" str2: "emailAddress=root@localhost.localdomain,CN=localhost.localdomain,OU=IT,O=MyCompany,L=Seattle,ST=WA,C=US" tasks: - debug: msg: - "{{ str1 | regex_search('CN=([^,]+)', '\\1') | first }}" - "{{ str2 | regex_search('CN=([^,]+)', '\\1') | first }}"
- 正则
CN=([^,]+)说明:[^,]+表示匹配除逗号外的任意字符,遇到第一个逗号就停止,完美匹配CN字段的取值'\\1'指定提取第一个捕获组的内容,first用来取出regex_search返回列表中的唯一元素
方法2:分割字符串后筛选处理
先把字符串按逗号分割成字段列表,再筛选出CN开头的字段,最后分割取对应值:
--- - hosts: localhost connection: local gather_facts: false vars: str1: "CN=*.company.com,O=WWT,L=STL,ST=Missouri,C=US" str2: "emailAddress=root@localhost.localdomain,CN=localhost.localdomain,OU=IT,O=MyCompany,L=Seattle,ST=WA,C=US" tasks: - debug: msg: - "{{ (str1.split(',') | select('match', 'CN=.*') | first).split('=')[1] }}" - "{{ (str2.split(',') | select('match', 'CN=.*') | first).split('=')[1] }}"
- 步骤说明:
split(','):将原字符串拆分为单个属性的列表select('match', 'CN=.*'):筛选出以CN=开头的属性项first:获取筛选后的唯一属性split('=')[1]:按等号分割属性,取第二部分就是目标值
执行结果
两种方法的执行结果都会输出:
ok: [localhost] => { "msg": [ "*.company.com", "localhost.localdomain" ] }
内容的提问来源于stack exchange,提问作者Kris Reese
相关产品推荐
相关产品推荐

