本文目录导读:

- 方法一:使用Cloudflare API (最常用)
- 方法二:使用Python脚本 (灵活可控)
- 方法三:使用Ansible (DevOps方式)
- 方法四:阿里云DNS批量修改
- 方法五:命令行工具 (nsupdate)
- 批量修改工具对比
- 注意事项
我来介绍几种批量修改DNS记录的方法:
使用Cloudflare API (最常用)
Bash脚本示例
#!/bin/bash
# Cloudflare API配置
API_TOKEN="your_api_token"
ZONE_ID="your_zone_id"
DOMAIN="example.com"
# 批量修改DNS记录
modify_dns_records() {
# 获取所有DNS记录
records=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json")
# 遍历并修改A记录
echo "$records" | jq -c '.result[] | select(.type=="A")' | while read -r record; do
record_id=$(echo "$record" | jq -r '.id')
record_name=$(echo "$record" | jq -r '.name')
current_ip=$(echo "$record" | jq -r '.content')
# 修改IP地址
new_ip="192.168.1.100"
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$record_id" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"type\":\"A\",
\"name\":\"$record_name\",
\"content\":\"$new_ip\",
\"ttl\":120,
\"proxied\":false
}"
echo "已修改: $record_name -> $new_ip"
done
}
modify_dns_records
使用Python脚本 (灵活可控)
#!/usr/bin/env python3
import requests
import json
# 配置
API_TOKEN = "your_api_token"
ZONE_ID = "your_zone_id"
class DNSManager:
def __init__(self):
self.headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
self.base_url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records"
def get_all_records(self):
"""获取所有DNS记录"""
response = requests.get(self.base_url, headers=self.headers)
return response.json()['result']
def modify_record(self, record_id, record_data):
"""修改单个DNS记录"""
url = f"{self.base_url}/{record_id}"
response = requests.put(url, headers=self.headers, json=record_data)
return response.json()
def batch_modify_ip(self, domain_prefix, new_ip):
"""批量修改指定前缀的A记录IP"""
records = self.get_all_records()
for record in records:
if record['type'] == 'A' and record['name'].startswith(domain_prefix):
# 准备修改数据
update_data = {
"type": "A",
"name": record['name'],
"content": new_ip,
"ttl": 120,
"proxied": record.get('proxied', False)
}
# 执行修改
result = self.modify_record(record['id'], update_data)
if result.get('success'):
print(f"✅ 成功: {record['name']} -> {new_ip}")
else:
print(f"❌ 失败: {record['name']} - {result.get('errors')}")
# 使用示例
if __name__ == "__main__":
manager = DNSManager()
# 修改所有以 "api." 开头的A记录
manager.batch_modify_ip("api.", "10.0.0.1")
使用Ansible (DevOps方式)
---
- name: 批量修改DNS记录
hosts: localhost
gather_facts: no
vars:
cloudflare_email: "your_email@example.com"
cloudflare_api_key: "your_api_key"
zone_name: "example.com"
new_ip: "10.0.0.1"
tasks:
- name: 获取DNS记录列表
uri:
url: "https://api.cloudflare.com/client/v4/zones/{{ zone_id.stdout }}/dns_records"
method: GET
headers:
X-Auth-Email: "{{ cloudflare_email }}"
X-Auth-Key: "{{ cloudflare_api_key }}"
register: dns_records
- name: 批量修改A记录
uri:
url: "https://api.cloudflare.com/client/v4/zones/{{ zone_id.stdout }}/dns_records/{{ item.id }}"
method: PUT
headers:
X-Auth-Email: "{{ cloudflare_email }}"
X-Auth-Key: "{{ cloudflare_api_key }}"
body:
type: "A"
name: "{{ item.name }}"
content: "{{ new_ip }}"
ttl: 120
proxied: "{{ item.proxied }}"
body_format: json
loop: "{{ dns_records.json.result }}"
when: item.type == "A"
阿里云DNS批量修改
#!/usr/bin/env python3
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest
import json
class AliyunDNSManager:
def __init__(self, access_key, access_secret):
self.client = AcsClient(access_key, access_secret, 'cn-hangzhou')
def get_records(self, domain_name, page_size=500):
"""获取域名下的所有DNS记录"""
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_DomainName(domain_name)
request.set_PageSize(page_size)
response = self.client.do_action_with_exception(request)
return json.loads(response)
def update_record(self, record_id, rr, record_type, value, ttl=600):
"""更新DNS记录"""
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_RecordId(record_id)
request.set_RR(rr)
request.set_Type(record_type)
request.set_Value(value)
request.set_TTL(ttl)
response = self.client.do_action_with_exception(request)
return json.loads(response)
def batch_update(self, domain, old_ip, new_ip):
"""批量修改IP地址"""
records = self.get_records(domain)
for record in records.get('DomainRecords', {}).get('Record', []):
if record['Type'] == 'A' and record['Value'] == old_ip:
result = self.update_record(
record['RecordId'],
record['RR'],
'A',
new_ip
)
if result.get('RecordId'):
print(f"✅ 已更新: {record['RR']}.{domain} -> {new_ip}")
# 使用
manager = AliyunDNSManager('your_access_key', 'your_access_secret')
manager.batch_update('example.com', '8.8.8.8', '10.0.0.1')
命令行工具 (nsupdate)
#!/bin/bash # 使用nsupdate批量修改DNS记录(适合DNS服务器管理) # 创建更新文件 cat > /tmp/dns_update.txt << EOF server dns.example.com zone example.com update delete www.example.com A update add www.example.com 3600 A 10.0.0.1 update delete api.example.com A update add api.example.com 3600 A 10.0.0.2 send EOF # 执行更新 nsupdate -k /etc/named/Kexample.com.key /tmp/dns_update.txt
批量修改工具对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Cloudflare API | 功能完整,文档丰富 | 只支持Cloudflare | 使用Cloudflare的用户 |
| Python脚本 | 灵活,可定制 | 需要编程能力 | 复杂批量操作 |
| Ansible | 自动化,幂等性 | 学习曲线 | DevOps环境 |
| 阿里云DNS | 专用SDK,稳定 | 阿里云限定 | 阿里云用户 |
| nsupdate | 通用DNS协议 | 需要DNS服务器权限 | 自建DNS服务器 |
注意事项
- 备份重要:操作前备份原始DNS记录
- 小批量测试:先修改少量记录验证
- TTL设置:先降低TTL值,便于快速切换
- 错误处理:添加重试机制和错误日志
- 权限控制:使用最小权限的API Key
选择哪种方法取决于你的DNS服务商和具体需求,Cloudflare API 是最通用的选择,Python脚本则适合需要自定义逻辑的场景。