Fun with salt, basically running scripts on master when events are fired via the Reactor system. The names of the files are paths with - replacing /
import sys
import salt.client
import json
import urllib2
from urllib2 import HTTPError
client_id = DIGITALOCEAN_CLIENT_ID
api_key = DIGITALOCEAN_API_KEY
base_url = "https://api.digitalocean.com/domains/$DOMAIN_NAME/records"
list_url = base_url + "?client_id=%s&api_key=%s"
remove_url = base_url + "/%s/destroy?client_id=%s&api_key=%s"
add_url = base_url + "/new?client_id=%s&api_key=%s&record_type=A&data=%s&name=%s"
def pretty_json(j):
return json.dumps(j, indent=2, separators=(',',':'))
def request(url):
return json.load(urllib2.urlopen(url))
def remove(vm_name):
'''
Remove a vm's subdomain if it already exists
'''
# First get a list of existing records
url = list_url % (client_id, api_key)
try:
res = request(url)
# Try and find a duplicate
records = res['records']
remove = None
for record in records:
if record['name'] == vm_name:
remove = record;
break;
if remove:
print "Removing %s" % pretty_json(remove)
url = remove_url % (remove['id'], client_id, api_key)
res = request(url)
print pretty_json(res)
else:
print "No existing record found"
except HTTPError, e:
print "Unable to list existing records: %s" % e
# vm_name is coming from salt directly, see the .sls file above
def add(vm_name):
'''
Add a new vm to the our cloud domain
'''
client = salt.client.LocalClient(__opts__['conf_file'])
ip = client.cmd(vm_name, 'network.ip_addrs', interface='eth0', timeout=5)[vm_name][0]
remove(vm_name)
print 'Adding %s (%s) to subdomain list' % (vm_name, ip)
url = add_url % (client_id, api_key, ip, vm_name)
try:
res = request(url)
print res
except HTTPError, e:
print "Unable to add record: %s" % e
# `runner.subdomain.add` is literally
# run subdomain.py's add method and the first argument to that function is vm_name
# and set vm_name to the name of the vm just created
subdomain:
runner.subdomain.add:
- vm_name: {{ data['name'] }}
<contents of normal file>
# Add any additional locations to look for master runners
runner_dirs: [/srv/runners]
# Register a reactor whenever a cloud provider emits 'created'
# the * is the name of the VM, we want any, but you could
# do something like salt/cloud/Webservers-*/created if you only
# wanted your webservers
reactor:
- 'salt/cloud/*/created':
- /srv/reactor/subdomain.sls