diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-14 20:03:01 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-14 20:03:01 +0000 |
commit | a453ac31f3428614cceb99027f8efbdb9258a40b (patch) | |
tree | f61f87408f32a8511cbd91799f9cececb53e0374 /collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts | |
parent | Initial commit. (diff) | |
download | ansible-a453ac31f3428614cceb99027f8efbdb9258a40b.tar.xz ansible-a453ac31f3428614cceb99027f8efbdb9258a40b.zip |
Adding upstream version 2.10.7+merged+base+2.10.8+dfsg.upstream/2.10.7+merged+base+2.10.8+dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts')
2 files changed, 282 insertions, 0 deletions
diff --git a/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.ini b/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.ini new file mode 100644 index 00000000..43777b59 --- /dev/null +++ b/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.ini @@ -0,0 +1,5 @@ +[cloudstack] +#endpoint = https://api.exoscale.ch/compute +endpoint = https://cloud.example.com/client/api +key = cloudstack api key +secret = cloudstack api secret diff --git a/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.py b/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.py new file mode 100755 index 00000000..db0322cf --- /dev/null +++ b/collections-debian-merged/ansible_collections/ngine_io/cloudstack/scripts/inventory/cloudstack.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# (c) 2015, René Moser <mail@renemoser.net> +# +# 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 <http://www.gnu.org/licenses/>. + +###################################################################### + +""" +Ansible CloudStack external inventory script. +============================================= + +Generates Ansible inventory from CloudStack. Configuration is read from +'cloudstack.ini'. If you need to pass the project, write a simple wrapper +script, e.g. project_cloudstack.sh: + + #!/bin/bash + cloudstack.py --project <your_project> $@ + + +When run against a specific host, this script returns the following attributes +based on the data obtained from CloudStack API: + + "web01": { + "cpu_number": 2, + "nic": [ + { + "ip": "10.102.76.98", + "mac": "02:00:50:99:00:01", + "type": "Isolated", + "netmask": "255.255.255.0", + "gateway": "10.102.76.1" + }, + { + "ip": "10.102.138.63", + "mac": "06:b7:5a:00:14:84", + "type": "Shared", + "netmask": "255.255.255.0", + "gateway": "10.102.138.1" + } + ], + "default_ip": "10.102.76.98", + "zone": "ZUERICH", + "created": "2014-07-02T07:53:50+0200", + "hypervisor": "VMware", + "memory": 2048, + "state": "Running", + "tags": [], + "cpu_speed": 1800, + "affinity_group": [], + "service_offering": "Small", + "cpu_used": "62%" + } + + +usage: cloudstack.py [--list] [--host HOST] [--project PROJECT] [--domain DOMAIN] +""" + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +import sys +import argparse +import json + +try: + from cs import CloudStack, CloudStackException, read_config +except ImportError: + print("Error: CloudStack library must be installed: pip install cs.", + file=sys.stderr) + sys.exit(1) + + +class CloudStackInventory(object): + def __init__(self): + + parser = argparse.ArgumentParser() + parser.add_argument('--host') + parser.add_argument('--list', action='store_true') + parser.add_argument('--tag', help="Filter machines by a tag. Should be in the form key=value.") + parser.add_argument('--project') + parser.add_argument('--domain') + + options = parser.parse_args() + try: + self.cs = CloudStack(**read_config()) + except CloudStackException: + print("Error: Could not connect to CloudStack API", file=sys.stderr) + + domain_id = None + if options.domain: + domain_id = self.get_domain_id(options.domain) + + project_id = None + if options.project: + project_id = self.get_project_id(options.project, domain_id) + + if options.host: + data = self.get_host(options.host, project_id, domain_id) + print(json.dumps(data, indent=2)) + + elif options.list: + tags = dict() + if options.tag: + tags['tags[0].key'], tags['tags[0].value'] = options.tag.split('=') + data = self.get_list(project_id, domain_id, **tags) + print(json.dumps(data, indent=2)) + else: + print("usage: --list [--tag <tag>] | --host <hostname> [--project <project>] [--domain <domain_path>]", + file=sys.stderr) + sys.exit(1) + + def get_domain_id(self, domain): + domains = self.cs.listDomains(listall=True) + if domains: + for d in domains['domain']: + if d['path'].lower() == domain.lower(): + return d['id'] + print("Error: Domain %s not found." % domain, file=sys.stderr) + sys.exit(1) + + def get_project_id(self, project, domain_id=None): + projects = self.cs.listProjects(domainid=domain_id) + if projects: + for p in projects['project']: + if p['name'] == project or p['id'] == project: + return p['id'] + print("Error: Project %s not found." % project, file=sys.stderr) + sys.exit(1) + + def get_host(self, name, project_id=None, domain_id=None, **kwargs): + hosts = self.cs.listVirtualMachines(projectid=project_id, domainid=domain_id, fetch_list=True, **kwargs) + data = {} + if not hosts: + return data + for host in hosts: + host_name = host['displayname'] + if name == host_name: + data['zone'] = host['zonename'] + if 'group' in host: + data['group'] = host['group'] + data['state'] = host['state'] + data['service_offering'] = host['serviceofferingname'] + data['affinity_group'] = host['affinitygroup'] + data['security_group'] = host['securitygroup'] + data['cpu_number'] = host['cpunumber'] + if 'cpu_speed' in host: + data['cpu_speed'] = host['cpuspeed'] + if 'cpuused' in host: + data['cpu_used'] = host['cpuused'] + data['memory'] = host['memory'] + data['tags'] = host['tags'] + if 'hypervisor' in host: + data['hypervisor'] = host['hypervisor'] + data['created'] = host['created'] + data['nic'] = [] + for nic in host['nic']: + nicdata = { + 'ip': nic['ipaddress'], + 'mac': nic['macaddress'], + 'netmask': nic['netmask'], + 'gateway': nic['gateway'], + 'type': nic['type'], + } + if 'ip6address' in nic: + nicdata['ip6'] = nic['ip6address'] + if 'gateway' in nic: + nicdata['gateway'] = nic['gateway'] + if 'netmask' in nic: + nicdata['netmask'] = nic['netmask'] + data['nic'].append(nicdata) + if nic['isdefault']: + data['default_ip'] = nic['ipaddress'] + if 'ip6address' in nic: + data['default_ip6'] = nic['ip6address'] + break + return data + + def get_list(self, project_id=None, domain_id=None, **kwargs): + data = { + 'all': { + 'hosts': [], + }, + '_meta': { + 'hostvars': {}, + }, + } + + groups = self.cs.listInstanceGroups(projectid=project_id, domainid=domain_id) + if groups: + for group in groups['instancegroup']: + group_name = group['name'] + if group_name and group_name not in data: + data[group_name] = { + 'hosts': [] + } + + hosts = self.cs.listVirtualMachines(projectid=project_id, domainid=domain_id, fetch_list=True, **kwargs) + if not hosts: + return data + for host in hosts: + host_name = host['displayname'] + data['all']['hosts'].append(host_name) + data['_meta']['hostvars'][host_name] = {} + + # Make a group per zone + data['_meta']['hostvars'][host_name]['zone'] = host['zonename'] + group_name = host['zonename'] + if group_name not in data: + data[group_name] = { + 'hosts': [] + } + data[group_name]['hosts'].append(host_name) + + if 'group' in host: + data['_meta']['hostvars'][host_name]['group'] = host['group'] + data['_meta']['hostvars'][host_name]['state'] = host['state'] + data['_meta']['hostvars'][host_name]['service_offering'] = host['serviceofferingname'] + data['_meta']['hostvars'][host_name]['affinity_group'] = host['affinitygroup'] + data['_meta']['hostvars'][host_name]['security_group'] = host['securitygroup'] + data['_meta']['hostvars'][host_name]['cpu_number'] = host['cpunumber'] + if 'cpuspeed' in host: + data['_meta']['hostvars'][host_name]['cpu_speed'] = host['cpuspeed'] + if 'cpuused' in host: + data['_meta']['hostvars'][host_name]['cpu_used'] = host['cpuused'] + data['_meta']['hostvars'][host_name]['created'] = host['created'] + data['_meta']['hostvars'][host_name]['memory'] = host['memory'] + data['_meta']['hostvars'][host_name]['tags'] = host['tags'] + if 'hypervisor' in host: + data['_meta']['hostvars'][host_name]['hypervisor'] = host['hypervisor'] + data['_meta']['hostvars'][host_name]['created'] = host['created'] + data['_meta']['hostvars'][host_name]['nic'] = [] + for nic in host['nic']: + nicdata = { + 'ip': nic['ipaddress'], + 'mac': nic['macaddress'], + 'netmask': nic['netmask'], + 'gateway': nic['gateway'], + 'type': nic['type'], + } + if 'ip6address' in nic: + nicdata['ip6'] = nic['ip6address'] + if 'gateway' in nic: + nicdata['gateway'] = nic['gateway'] + if 'netmask' in nic: + nicdata['netmask'] = nic['netmask'] + data['_meta']['hostvars'][host_name]['nic'].append(nicdata) + if nic['isdefault']: + data['_meta']['hostvars'][host_name]['default_ip'] = nic['ipaddress'] + if 'ip6address' in nic: + data['_meta']['hostvars'][host_name]['default_ip6'] = nic['ip6address'] + + group_name = '' + if 'group' in host: + group_name = host['group'] + + if group_name and group_name in data: + data[group_name]['hosts'].append(host_name) + return data + + +if __name__ == '__main__': + CloudStackInventory() |