動態域名解析的做用是動態更新域名對應的IP地址,由於分配的公網IP不是固定不變的,因此使用到了阿里雲的動態域名解析。同理,因爲IP地址的動態性,人爲更新記錄是不現實的,阿里雲提供了API供用戶動態更新域名解析記錄。本次主要用於記錄一下python的實現實例,實現方法有多種,在下拋磚引玉。進入正題。
python
思路:linux
一、獲取本地外網地址json
二、獲取域名解析記錄中的RecordID以及IP地址bash
三、更新域名解析記錄:若是不存在解析記錄則進行新增,若是存在且解析記錄中的IP與本地外網IP不一致則進行更新服務器
首先安裝阿里雲提供的python sdk包dom
pip3 install aliyun-python-sdk-core pip3 install aliyun-python-sdk-alidns
實現代碼以下:
ide
from aliyunsdkcore.client import AcsClient import requests import json from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest from aliyunsdkalidns.request.v20150109 import AddDomainRecordRequest from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest AccessKey_ID = "LTAI4GEQMxxxxxxxx" # 須要根據實際填寫 AccessKey_Secret = "HmHElvWx2kzR6rxxxxxxxxxxx" # 須要根據實際填寫 Regions = "cn-hangzhou" #獲取本地公網ip地址 def get_internet_ip(): with requests.get("http://ip.3322.net") as response: ip = response.text return ip #子域名解析記錄查詢 def get_recordid(client): request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName('csgefei.top') response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') result = json.loads(response) print(result) record_id = result["DomainRecords"]["Record"][0]["RecordId"] return record_id #獲取解析記錄中當前ip地址 def get_recordip(client): request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName('azgefei.top') response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') result = json.loads(response) record_ip = result["DomainRecords"]["Record"][0]["Value"] return record_ip #新增解析記錄 def add_record(client,priority,ttl,record_type,value,rr,domainname): request = AddDomainRecordRequest() request.set_accept_format('json') request.set_Priority(priority) request.set_TTL(ttl) request.set_Value(value) request.set_Type(record_type) request.set_RR(rr) request.set_DomainName(domainname) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') relsult = json.loads(response) return relsult # 更新域名解析記錄 def update_record(client, priority, ttl, record_type, value, rr, record_id): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_accept_format('json') request.set_Priority(priority) request.set_TTL(ttl) request.set_Value(value) request.set_Type(record_type) request.set_RR(rr) request.set_RecordId(record_id) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') return response if __name__ == '__main__': client = AcsClient(AccessKey_ID, AccessKey_Secret,Regions) record_id = get_recordid(client) local_ip = get_internet_ip().strip() ddns_ip = get_recordip(client).strip() if record_id != "": if local_ip == ddns_ip: #判斷本地IP與域名解析記錄IP是否一致 print("解析地址未發生變化") else: print("解析地址已經改變") update_record(client,"5","600","A",local_ip,"@",record_id) #地址變化則更新解析記錄 else: print("主機解析記錄不存在,將添加記錄") add_record(client,"5","600","A",local_ip,"@","azgefei.top") #解析記錄不存在則新增解析記錄
將腳本放到linux服務器中(執行chmod +x update_ddns.py增長執行權限),並加入定時任務每分鐘執行一次:在linux服務器中運行 crontab -e 寫入以下內容保存並退出優化
#定時更新雲解析記錄 * * * * * python3 /home/NodeServer/AutoDevopsScript/update_ddns.py
至此,工做基本完成了,代碼尚有優化餘地,本文不做討論,僅供你們參考之用。阿里雲
順帶一提,訪問API時,帳戶須要受權,不然會報400。.net