Ansible字符串转字典列表问题:字段提取与TXT值完整性
解决方案
核心思路
针对字符串拆分时的字段混乱问题,核心是用正则表达式精准匹配字段边界,避免按空格粗暴拆分,确保带空格的TXT值完整提取。
具体实现步骤
1. 明确原始字符串格式
假设你的data是多行DNS类记录,格式示例:
example.com IN TXT "v=spf1 include:example.net ~all"
test.dev IN A 10.0.0.5
demo.org IN TXT "hello world"
2. 用正则+set_fact转字典列表
直接用Ansible的正则替换和循环处理:
- name: 将字符串转换为字典列表 hosts: localhost vars: data: | example.com IN TXT "v=spf1 include:example.net ~all" test.dev IN A 10.0.0.5 demo.org IN TXT "hello world" tasks: - name: 生成结构化记录列表 set_fact: records: "{{ records | default([]) + [item | regex_replace('^(\\S+)\\s+IN\\s+(\\S+)\\s+(.*)$', '{\"name\": \"\\1\", \"type\": \"\\2\", \"value\": \"\\3\"}' | from_json)] }}" loop: "{{ data.splitlines() }}" when: item | trim != ""
正则匹配说明
^(\S+):匹配第一个无空格字段,作为name(比如域名)\s+IN\s+:匹配中间固定的IN分隔符,忽略前后空格(\S+):匹配第二个无空格字段,作为type(比如A/TXT)(.*):匹配剩余所有内容(包括TXT值里的空格和引号),作为value
3. 可选:去掉TXT值的引号
如果需要移除TXT值的包裹引号,调整正则即可:
regex_replace('^(\\S+)\\s+IN\\s+(\\S+)\\s+\"?(.*?)\"?$', '{\"name\": \"\\1\", \"type\": \"\\2\", \"value\": \"\\3\"}' | from_json)
验证结果
执行后records变量会输出正确的字典列表:
[ {"name": "example.com", "type": "TXT", "value": "v=spf1 include:example.net ~all"}, {"name": "test.dev", "type": "A", "value": "10.0.0.5"}, {"name": "demo.org", "type": "TXT", "value": "hello world"} ]
内容的提问来源于stack exchange,提问作者hrv231
相关产品推荐
相关产品推荐

