-
Ioannis Tsafaras authored
Refactor host and group vars in inventory, correct implementation of ssh key, correct http proxy configuration host_var
Unverifieddb0ecb25
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()