You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:45:34