如何通过Ansible创建超过255字符的DNS长TXT记录?
解决Ansible创建Azure长TXT记录失败的问题
问题原因
Azure门户会自动将超过255字符的TXT记录内容拆分成符合DNS协议要求的多个片段(每个片段≤255字符),但Ansible的azure_rm_dnsrecordset模块不会自动处理这种拆分,直接传入长字符串会触发Azure API的长度限制报错。
解决方案
需要手动将长TXT内容拆分成多个不超过255字符的子串,再在records列表中添加对应数量的entry项。
方法1:用Ansible过滤器自动拆分
借助正则表达式过滤器完成长字符串的拆分,再转换为模块要求的entry格式:
azure_rm_dnsrecordset: resource_group: "{{ azure.resourcegroup }}" zone_name: "{{ azure.dnszone }}" record_type: "{{ item.type }}" relative_name: "{{ item.name }}" records: > {{ item.value | regex_replace('(.{1,255})', '\\1\n') | split('\n') | reject('equalto', '') | map('community.general.dict_kv', 'entry') | list }} state: present with_items: "{{ azure.creatednsrecords }}"
各过滤器作用:
regex_replace:按每255字符分割长字符串并插入换行符split('\n'):将分割后的字符串转为列表reject('equalto', ''):过滤分割后可能出现的空字符串map('community.general.dict_kv', 'entry'):将每个子串转为{ "entry": "子串内容" }的字典格式
方法2:预先在变量中拆分
如果不想使用过滤器,可直接在变量定义中为长TXT记录提供拆分后的列表:
# 示例变量定义 azure: creatednsrecords: - type: TXT name: "dkim._domainkey" value: - "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." - "...剩余的DKIM密钥内容..."
再修改任务直接使用该列表生成entries:
azure_rm_dnsrecordset: resource_group: "{{ azure.resourcegroup }}" zone_name: "{{ azure.dnszone }}" record_type: "{{ item.type }}" relative_name: "{{ item.name }}" records: "{{ item.value | map('community.general.dict_kv', 'entry') | list }}" state: present with_items: "{{ azure.creatednsrecords }}"
原理说明
DNS协议规定TXT记录的单个文本片段长度不能超过255字符,Azure DNS服务严格遵循该规范。Azure门户的可视化界面做了封装,自动帮用户完成拆分;而Ansible模块直接对接Azure API,需要用户自行处理符合协议要求的格式。
内容的提问来源于stack exchange,提问作者Jan van Veldhuizen
相关产品推荐
相关产品推荐

