#!/usr/bin/python # (c) 2012, Michael DeHaan # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . DEFAULT_ANSIBLE_SETUP = "/etc/ansible/setup" import sys import os import shlex import subprocess try: import json except ImportError: import simplejson as json # load config & template variables if len(sys.argv) == 1: sys.exit(1) argfile = sys.argv[1] if not os.path.exists(argfile): sys.exit(1) input_data = open(argfile, 'r').read() new_options = dict([ x.split('=') for x in input_data ]) ansible_file = new_options.get('metadata', DEFAULT_ANSIBLE_SETUP) ansible_dir = os.path.dirname(ansible_file) # create the config dir if it doesn't exist if not os.path.exists(ansible_dir): os.makedirs(ansible_dir) changed = False md5sum = None if not os.path.exists(ansible_file): changed = True else: md5sum = os.popen("md5sum %s" % ansible_file).read().split()[0] # if facter is installed, and we can use --json because # ruby-json is ALSO installed, include facter data in the JSON if os.path.exists("/usr/bin/facter"): cmd = subprocess.Popen("/usr/bin/facter --json", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = cmd.communicate() facter = True try: facter_ds = json.loads(out) except: facter = False if facter: for (k,v) in facter_ds.items(): new_options["facter_%s" % k] = v # ditto for ohai, but just top level string keys # because it contains a lot of nested stuff we can't use for # templating w/o making a nicer key for it (TODO) if os.path.exists("/usr/bin/ohai"): cmd = subprocess.Popen("/usr/bin/ohai", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = cmd.communicate() ohai = True try: ohai_ds = json.loads(out) except: ohai = False if ohai: for (k,v) in ohai_ds.items(): if type(v) == str or type(v) == unicode: k2 = "ohai_%s" % k new_options[k2] = v # write the template/settings file using # instructions from server f = open(ansible_file, "w+") reformat = json.dumps(new_options, sort_keys=True, indent=4) f.write(reformat) f.close() md5sum2 = os.popen("md5sum %s" % ansible_file).read().split()[0] if md5sum != md5sum2: changed = True new_options['written'] = ansible_file new_options['changed'] = changed new_options['md5sum'] = md5sum2 print json.dumps(new_options)