怎样用脚本批量修改DNS记录?

wen 实用脚本 3

本文目录导读:

怎样用脚本批量修改DNS记录?

  1. 方法一:使用Cloudflare API (最常用)
  2. 方法二:使用Python脚本 (灵活可控)
  3. 方法三:使用Ansible (DevOps方式)
  4. 方法四:阿里云DNS批量修改
  5. 方法五:命令行工具 (nsupdate)
  6. 批量修改工具对比
  7. 注意事项

我来介绍几种批量修改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服务器

注意事项

  1. 备份重要:操作前备份原始DNS记录
  2. 小批量测试:先修改少量记录验证
  3. TTL设置:先降低TTL值,便于快速切换
  4. 错误处理:添加重试机制和错误日志
  5. 权限控制:使用最小权限的API Key

选择哪种方法取决于你的DNS服务商和具体需求,Cloudflare API 是最通用的选择,Python脚本则适合需要自定义逻辑的场景。

抱歉,评论功能暂时关闭!