如何在Ansible中去除nslookup返回字符串的末尾单引号?
解决Ansible解析nslookup结果时FQDN末尾带单引号的问题
问题核心
你遇到两个关键问题:
- 正则匹配时误将末尾单引号纳入结果范围
- 循环中使用
set_fact直接赋值,导致最终仅保留最后一个FQDN,而非完整的匹配列表
解决方案
直接优化正则表达式,一次性提取干净的FQDN;同时修正set_fact的赋值逻辑,确保循环中持续向列表追加元素。
修改后的完整Playbook
--- - name: Test regex expressions hosts: all gather_facts: false vars: short_name: - "yourserver1" - "yourserver2" - "yourserver3" - "yourserver4" - "yourserver5" tasks: - name: Query FQDN from short name using nslookup command: nslookup "{{ short_name_item }}" register: nslookup_results ignore_errors: yes loop: "{{ short_name }}" loop_control: loop_var: short_name_item - name: 直接提取干净的FQDN(无需后续处理) set_fact: fqdns: "{{ fqdns | default([]) + [item.stdout_lines | regex_search('Name:\\s*([^'']+)', multiline=true, group=1) | default('', true)] }}" loop: "{{ nslookup_results.results }}" loop_control: loop_var: item when: item.rc == 0 and item.stdout_lines | regex_search('Name:\\s*([^'']+)', multiline=true) - debug: var: fqdns
关键修改说明
正则表达式优化:
将原表达式Name:\\s*([\\S]+)替换为Name:\\s*([^'']+),其中[^'']+表示匹配所有非单引号的字符,直接跳过末尾的单引号,一次性得到无冗余字符的FQDN。同时通过group=1参数直接提取分组内容,省去后续字符串替换步骤。修复列表追加逻辑:
使用fqdns | default([]) + [新元素]的写法,每次循环都将新提取的FQDN追加到列表中,而非直接覆盖变量,最终得到所有匹配成功的FQDN集合。增加有效结果过滤:
在when条件中额外判断是否匹配到有效结果,避免空字符串被加入最终列表。
替代方案(保留分步处理)
如果需要保留中间步骤,修正后的分步代码如下:
- name: Extract FQDNs from nslookup results set_fact: fqdn_step1: "{{ fqdn_step1 | default([]) + [item.stdout_lines | regex_search('Name:\\s*([^'']+)', multiline=true, group=1) | default('', true)] }}" loop: "{{ nslookup_results.results }}" loop_control: loop_var: item when: item.rc == 0 - name: 过滤空值并整理最终列表 set_fact: fqdns: "{{ fqdn_step1 | select('ne', '') | list }}" - debug: var: fqdns
内容的提问来源于stack exchange,提问作者Andrew Madsen
相关产品推荐
相关产品推荐

