I'd been looking for an equivalent to the UNIX nsupdate facility (https://linux.die.net/man/8/nsupdate) for RFC2136 compliant updates (to a standard Windows or UNIX DNS server), but in python.
Although the examples were extremely limited (there was nothing much on creating PTR records), I was able to achieve what I needed eventually. The below is tested in python2.7
import dns.update import dns.query import dns.reversename import dns.rdatatype def create_dns_record(): ### Create A Record dns_domain = "%s." % (domain) # Set the domain name with a trailing dot (to stop auto substitution of zone) update = dns.update.Update(dns_domain) # Prepare the payload for DNS record update in the given zone/domain (dns_domain) update.replace(new_hostname, TTL, 'A', new_ipaddress) # Inject the record details into the dns.update.Update class response = dns.query.tcp(update, PRIMARY_DNS_SERVER_IP, timeout=5) # Submit the new record to the DNS server to apply the update ### Create reverse entry (PTR) reventry = dns.reversename.from_address(new_ipaddress) # Neat function to generate a reverse entry revzone = '' revzone = '.'.join(dns.name.from_text(str(reventry)).labels[3:]) # Specify the reverse lookup zone based on the reverse IP address. # The labels[X:] property allows you to specify which octet to use. # e.g. 3: will apply the record to the 10.in-addr.arpa zone, whereas 1: will apply it to the 72.23.10.in-addr.arpa zone raction = dns.update.Update(revzone) # Prepare the payload for the DNS record update new_host_fqdn = "%s.%s." % (new_hostname, dns_domain) # Although we are updating the reverse lookup zone, the record needs to point back to the ‘test.example.com’ domain, not the 10.in-addr.arpa domain raction.replace(reventry, TTL, dns.rdatatype.PTR, new_host_fqdn) # Inject the updated record details into the the class, preparing for submission to the DNS server response = dns.query.tcp(raction, PRIMARY_DNS_SERVER_IP, timeout=5) # submit the new record to the DNS server to apply the update domain = "test.example.com" new_ipaddress = "10.23.72.44" new_hostname = "server01" PRIMARY_DNS_SERVER = "18.104.22.168" TTL = "1200" create_dns_record()