Like most home Internet users, my home Internet has a dynamic IP Address. For many years, I used DynDNS to keep a hostname associated to my home Internet, so that I could access my home resources remotely. After DynDNS started charging for the service, I just created a sub-domain off one of the domains that I own. The problem has always been that I would only find out about my IP Address changing after a failed login attempt. Since then, I have created a couple scripts. However, as I go down the Ansible journey, I try to apply the same problems to Ansible to see how it can solve problems. So, I decided to write a playbook to have Ansible automatically update my DNS record as needed.
Here is the playbook:
--- - hosts: localhost connection: local gather_facts: false tasks: - set_fact: domainname: example.com hostname: dynamichost.example.com rax_username: rackspace_username rax_apikey: rackspace_apikey update_dns: False - name: Identify current public IPv4 address of network command: curl -4 icanhazip.com register: ipv4_address - name: Identify current DNS A record of Dynamic DNS host command: dig +short register: dyndns_host - name: Determine if DNS A record needs to be updated set_fact: update_dns: True when: ipv4_address.stdout != dyndns_host.stdout - name: Update DNS A record local_action: module: rax_dns_record username: "" api_key: "" domain: "" name: "" data: "" type: A register: a_record when: update_dns == True
As you can see it’s pretty straight forward. I define several facts up front, mostly dealing with the Rackspace Cloud DNS Authentication, domain, and hostname settings. Then I run plays to determine what my current IP Address is, what the DNS A record is, comparing the two, then updating the DNS as needed.
It should be simple enough to run the playbook as a cron-job. So far, it works great!
The playbook is available via my github.