Skip to content
Snippets Groups Projects
ansible_manager.py 5.19 KiB
import os
import tempfile
import ansible
from ansible.playbook import PlayBook
from ansible import callbacks
from ansible import utils


class Manager:
    def __init__(self, provisioner_response):

        self.inventory = {}
        self.inventory['master'] = {
            'name': 'snf-' + str(provisioner_response['nodes']['master']['id']),
            'ip': provisioner_response['nodes']['master']['internal_ip']}
        self.inventory['slaves'] = []
        for response in provisioner_response['nodes']['slaves']:
            self.inventory['slaves'].append(
                {'name': 'snf-' + str(response['id']),
                 'ip': response['internal_ip']})
        self.cidr = provisioner_response['subnet']['cidr']

        with tempfile.NamedTemporaryFile(mode='w', delete=False) as kf:
            kf.write(provisioner_response['pk'])
            self.temp_file = kf.name
            print self.temp_file
        ansible.constants.ANSIBLE_SSH_ARGS = '-o "ProxyCommand ssh -i %s -o StrictHostKeyChecking=no -W %%h:%%p root@%s.vm.okeanos.grnet.gr"' \
                                             % (self.temp_file, self.inventory['master']['name'])
        # ansible.constants.ANSIBLE_SSH_ARGS = '-o "ProxyCommand ssh root@%s.vm.okeanos.grnet.gr nc %%h %%p"' \
        #                                      % self.inventory['master']['name']
        # ansible.constants.DEFAULT_PRIVATE_KEY_FILE = self.temp_file
        ansible.constants.HOST_KEY_CHECKING = False
        ansible.constants.DEFAULT_GATHERING = 'explicit'

    def create_inventory(self):
        """
        Create the inventory using the ansible library objects
        :return:
        """

        inventory_groups = []

        all_group = ansible.inventory.group.Group(name="all")
        all_group.set_variable('local_net', self.cidr)
        inventory_groups.append(all_group)

        master_group = ansible.inventory.group.Group(name='master')
        all_group.add_child_group(master_group)
        host = self.inventory['master']
        ansible_host = ansible.inventory.host.Host(name=host['name'] + '.vm.okeanos.grnet.gr')
        # master_group.set_variable('local_net', self.cidr)
        ansible_host.set_variable('ansible_ssh_private_key_file', self.temp_file)
        ansible_host.set_variable('internal_ip', self.inventory['master']['ip'])
        ansible_host.set_variable('id', 0)
        master_group.add_host(ansible_host)
        inventory_groups.append(master_group)

        slave_group = ansible.inventory.group.Group(name='slaves')
        all_group.add_child_group(slave_group)
        slave_group.set_variable('proxy_env', {'http_proxy': 'http://' + self.inventory['master']['name'] + '.local:3128'})
        for host_id, host in enumerate(self.inventory["slaves"], start=1):
            ansible_host = ansible.inventory.host.Host(name=host['name'] + '.local')
            # host_vars['internal_ip'] = host['ip']
            # for var_key, var_value in host_vars.iteritems():
            #     ansible_host.set_variable(var_key, var_value)
            ansible_host.set_variable('internal_ip', host['ip'])
            ansible_host.set_variable('id', host_id)
            slave_group.add_host(ansible_host)
        inventory_groups.append(slave_group)

        self.ansible_inventory = ansible.inventory.Inventory(host_list=None)
        for group in inventory_groups:
            self.ansible_inventory.add_group(group)
        print self.ansible_inventory.groups_list()

        return self.ansible_inventory

    def run_playbook(self, playbook_file, tags=None):
        """
        Run the playbook_file using created inventory and tags specified
        :return:
        """
        stats = callbacks.AggregateStats()
        playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
        runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
        # print self.ansible_inventory.get_group('all').get_hosts()
        pb = PlayBook(playbook=playbook_file, inventory=self.ansible_inventory, stats=stats,
                      callbacks=playbook_cb,
                      runner_callbacks=runner_cb, only_tags=tags)
        pb.run()

    def cleanup(self):
        os.remove(self.temp_file)

if __name__ == "__main__":
    response = {u'ips': [{u'floating_network_id': u'2216',
                          u'floating_ip_address': u'83.212.118.6',
                          u'id': u'686825'}],
                u'nodes': {u'master': {u'id': 666355,
                                       u'name': u'lambda-master'},
                           u'slaves': [{u'id': 666356, u'name': u'lambda-node1'}]},
                u'vpn': {u'type': u'MAC_FILTERED', u'id': u'143499'},
                u'subnet': {u'cidr': u'192.168.0.0/24', u'gateway_ip': u'192.168.0.1', u'id': u'142564'}}

    manager = Manager(response)
    manager.create_inventory()
    manager.run_playbook(playbook_file="../../ansible/playbooks/testinventory.yml", tags=['hosts'])

    # manager.run_playbook(playbook_file="../../ansible/playbooks/common/install.yml", tags=['master'])
    # manager.run_playbook(playbook_file="../../ansible/playbooks/proxy/proxy.yml", tags=['config'])
    # manager.run_playbook(playbook_file="../../ansible/playbooks/common/install.yml", tags=['slaves'])

    manager.cleanup()