123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin/env python
- # vim: expandtab:tabstop=4:shiftwidth=4
- import argparse
- import ConfigParser
- import sys
- import os
- class Cluster(object):
- """Python wrapper to ensure environment is correct for running ansible playbooks
- """
- def __init__(self, args):
- self.args = args
- # setup ansible ssh environment
- if 'ANSIBLE_SSH_ARGS' not in os.environ:
- os.environ['ANSIBLE_SSH_ARGS'] = (
- '-o ForwardAgent=yes'
- '-o StrictHostKeyChecking=no'
- '-o UserKnownHostsFile=/dev/null'
- '-o ControlMaster=auto'
- '-o ControlPersist=600s'
- )
- def apply(self):
- # setup ansible playbook environment
- config = ConfigParser.ConfigParser()
- if 'gce' == self.args.provider:
- config.readfp(open('inventory/gce/gce.ini'))
- for key in config.options('gce'):
- os.environ[key] = config.get('gce', key)
- inventory = '-i inventory/gce/gce.py'
- elif 'aws' == self.args.provider:
- config.readfp(open('inventory/aws/ec2.ini'))
- for key in config.options('ec2'):
- os.environ[key] = config.get('ec2', key)
- inventory = '-i inventory/aws/ec2.py'
- else:
- assert False, "invalid PROVIDER {}".format(self.args.provider)
- env = {'cluster_id': self.args.cluster_id}
- if 'create' == self.args.action:
- playbook = "playbooks/{}/openshift-cluster/launch.yml".format(self.args.provider)
- env['masters'] = self.args.masters
- env['nodes'] = self.args.nodes
- elif 'terminate' == self.args.action:
- playbook = "playbooks/{}/openshift-cluster/terminate.yml".format(self.args.provider)
- elif 'list' == self.args.action:
- # todo: implement cluster list
- argparse.ArgumentError("ACTION {} not implemented".format(self.args.action))
- elif 'update' == self.args.action:
- # todo: implement cluster update
- argparse.ArgumentError("ACTION {} not implemented".format(self.args.action))
- else:
- assert False, "invalid ACTION {}".format(self.args.action)
- verbose = ''
- if self.args.verbose > 0:
- verbose = '-{}'.format('v' * self.args.verbose)
- ansible_env = '-e \'{}\''.format(
- ' '.join(['%s=%s' % (key, value) for (key, value) in env.items()])
- )
- command = 'ansible-playbook {} {} {} {}'.format(
- verbose, inventory, ansible_env, playbook
- )
- if self.args.verbose > 1:
- command = 'time {}'.format(command)
- if self.args.verbose > 0:
- sys.stderr.write('RUN [{}]\n'.format(command))
- sys.stderr.flush()
- os.system(command)
- if __name__ == '__main__':
- parser = argparse.ArgumentParser(description='Manage OpenShift Cluster')
- parser.add_argument('-p', '--provider', default='gce', choices=['gce', 'aws'],
- help='One of the supported cloud providers')
- parser.add_argument('-m', '--masters', default=1, type=int, help='number of masters to create in cluster')
- parser.add_argument('-n', '--nodes', default=2, type=int, help='number of nodes to create in cluster')
- parser.add_argument('-v', '--verbose', action='count', help='Multiple -v options increase the verbosity')
- parser.add_argument('--version', action='version', version='%(prog)s 0.1')
- parser.add_argument('action', choices=['create', 'terminate', 'update', 'list'])
- parser.add_argument('provider', choices=['gce', 'aws'])
- parser.add_argument('cluster_id', help='prefix for cluster VM names')
- args = parser.parse_args()
- Cluster(args).apply()
|