使用Ansible Playbook提取文件中所有person块的firstname和lastname值
Ansible提取重复person条目字段值的方法
步骤1:读取并解码目标文件内容
先用slurp模块读取文件(该模块会返回base64编码的内容),再解码为可处理的文本:
- name: 读取目标文件 slurp: src: /path/to/your/target/file.txt register: file_raw - name: 解码文件内容 set_fact: file_content: "{{ file_raw.content | b64decode }}"
步骤2:提取所有person条目块
用正则匹配出所有以person:开头的条目块,每个块包含该条目下的所有字段:
- name: 提取所有person条目 set_fact: person_blocks: "{{ file_content | regex_findall('person:\\s*(?:\\n\\s+\\w+=\\S+)+', multiline=True) }}"
注:如果字段值包含空格,可把正则里的\\S+替换为[^\\n]+,匹配等号后直到换行的所有内容。
步骤3:提取每个条目下的firstname和lastname
遍历每个person块,用正则分别提取目标字段的值,整理为结构化列表:
- name: 提取目标字段值 set_fact: person_info_list: "{{ person_info_list | default([]) + [ {'firstname': item | regex_search('firstname=(\\S+)', '\\1') | first, 'lastname': item | regex_search('lastname=(\\S+)', '\\1') | first} ] }}" loop: "{{ person_blocks }}"
步骤4:查看提取结果
用debug模块输出最终的结构化数据:
- name: 输出提取结果 debug: var: person_info_list
完整Playbook示例
- name: 提取person条目字段值 hosts: localhost gather_facts: no tasks: - name: 读取目标文件 slurp: src: /path/to/your/target/file.txt register: file_raw - name: 解码文件内容 set_fact: file_content: "{{ file_raw.content | b64decode }}" - name: 提取所有person条目 set_fact: person_blocks: "{{ file_content | regex_findall('person:\\s*(?:\\n\\s+\\w+=\\S+)+', multiline=True) }}" - name: 提取目标字段值 set_fact: person_info_list: "{{ person_info_list | default([]) + [ {'firstname': item | regex_search('firstname=(\\S+)', '\\1') | first, 'lastname': item | regex_search('lastname=(\\S+)', '\\1') | first} ] }}" loop: "{{ person_blocks }}" - name: 输出提取结果 debug: var: person_info_list
执行后会得到类似如下的结构化结果:
person_info_list: - firstname: tom lastname: jones - firstname: fred lastname: dorfman
内容的提问来源于stack exchange,提问作者John Engineer
相关产品推荐
相关产品推荐

