I needed to migrate from Namecheap’s DNS to Cloudflare’s, as I like it more, it propagates faster and Terraform supports it natively. The following script will talk to Namecheap’s API and print all your records in a Terraform-compatible format.
#!/usr/bin/env python
import random
import string
import sys
from collections import OrderedDict
from namecheap import Api
def random_id():
return "".join([random.choice(string.ascii_lowercase) for _ in range(8)])
def main():
if len(sys.argv) != 2:
print("Usage:\n migrate_from_namecheap.py <domain>")
sys.exit(1)
username = input("Enter your Namecheap username: ")
api_key = input("Enter your Namecheap API key: ")
api = Api(username, api_key, username, "127.0.0.1", sandbox=False, debug=False)
records = api.domains_dns_getHosts(sys.argv[1])
for record in records:
info = OrderedDict()
info["domain"] = "${var.domain}"
info["proxied"] = "false"
info["type"] = record["Type"]
info["name"] = record["Name"]
info["value"] = record["Address"].rstrip(".")
if info["type"] == "MX":
info["priority"] = record["MXPref"]
fields = "\n".join([" %s = \"%s\"" % (key, value) for key, value in info.items()])
entry = """resource "cloudflare_record" "%s" {\n%s\n}\n""" % (random_id(), fields)
print(entry)
if __name__ == "__main__":
main()