diff options
| author | Thomas Wiest <twiest@users.noreply.github.com> | 2015-04-20 17:25:57 -0400 | 
|---|---|---|
| committer | Thomas Wiest <twiest@users.noreply.github.com> | 2015-04-20 17:25:57 -0400 | 
| commit | 96dd0ab929b7f391eee9b23209aa377537114b72 (patch) | |
| tree | d1f9aa5becd04097213fe56aa4982bd35830df10 /inventory | |
| parent | 0722304b2f9c94a2f70054e0a3c7feceaedb195c (diff) | |
| parent | dbb252bc04a6488c1fde05dbc325b246fd4a651e (diff) | |
| download | openshift-96dd0ab929b7f391eee9b23209aa377537114b72.tar.gz openshift-96dd0ab929b7f391eee9b23209aa377537114b72.tar.bz2 openshift-96dd0ab929b7f391eee9b23209aa377537114b72.tar.xz openshift-96dd0ab929b7f391eee9b23209aa377537114b72.zip | |
Merge pull request #139 from detiber/configUpdatesMaster
Massive refactor, deployment-type support, config updates, reduce duplication
Diffstat (limited to 'inventory')
| -rw-r--r-- | inventory/aws/group_vars/all | 2 | ||||
| -rw-r--r-- | inventory/aws/hosts/ec2.ini (renamed from inventory/aws/ec2.ini) | 0 | ||||
| -rwxr-xr-x | inventory/aws/hosts/ec2.py (renamed from inventory/aws/ec2.py) | 0 | ||||
| -rw-r--r-- | inventory/aws/hosts/hosts | 1 | ||||
| -rw-r--r-- | inventory/byo/group_vars/all | 28 | ||||
| -rw-r--r-- | inventory/byo/hosts | 26 | ||||
| -rw-r--r-- | inventory/gce/group_vars/all | 2 | ||||
| -rwxr-xr-x | inventory/gce/hosts/gce.py (renamed from inventory/gce/gce.py) | 0 | ||||
| -rw-r--r-- | inventory/gce/hosts/hosts | 1 | ||||
| -rw-r--r-- | inventory/libvirt/group_vars/all | 2 | ||||
| -rw-r--r-- | inventory/libvirt/hosts | 2 | ||||
| -rw-r--r-- | inventory/libvirt/hosts/hosts | 1 | ||||
| -rw-r--r-- | inventory/libvirt/hosts/libvirt.ini | 20 | ||||
| -rwxr-xr-x | inventory/libvirt/hosts/libvirt_generic.py | 179 | 
14 files changed, 227 insertions, 37 deletions
| diff --git a/inventory/aws/group_vars/all b/inventory/aws/group_vars/all deleted file mode 100644 index b22da00de..000000000 --- a/inventory/aws/group_vars/all +++ /dev/null @@ -1,2 +0,0 @@ ---- -ansible_ssh_user: root diff --git a/inventory/aws/ec2.ini b/inventory/aws/hosts/ec2.ini index eaab0a410..eaab0a410 100644 --- a/inventory/aws/ec2.ini +++ b/inventory/aws/hosts/ec2.ini diff --git a/inventory/aws/ec2.py b/inventory/aws/hosts/ec2.py index f231ff4c2..f231ff4c2 100755 --- a/inventory/aws/ec2.py +++ b/inventory/aws/hosts/ec2.py diff --git a/inventory/aws/hosts/hosts b/inventory/aws/hosts/hosts new file mode 100644 index 000000000..6c590ac93 --- /dev/null +++ b/inventory/aws/hosts/hosts @@ -0,0 +1 @@ +localhost ansible_sudo=no ansible_python_interpreter=/usr/bin/python2 diff --git a/inventory/byo/group_vars/all b/inventory/byo/group_vars/all deleted file mode 100644 index d63e96668..000000000 --- a/inventory/byo/group_vars/all +++ /dev/null @@ -1,28 +0,0 @@ ---- -# lets assume that we want to use the root as the ssh user for all hosts -ansible_ssh_user: root - -# default debug level for all OpenShift hosts -openshift_debug_level: 4 - -# set the OpenShift deployment type for all hosts -openshift_deployment_type: enterprise - -# Override the default registry for development -openshift_registry_url: docker-buildvm-rhose.usersys.redhat.com:5000/openshift3_beta/ose-${component}:${version} - -# Use latest Errata puddle as an additional repo: -#openshift_additional_repos: -#- id: ose-devel -#  name: ose-devel -#  baseurl: http://buildvm-devops.usersys.redhat.com/puddle/build/OpenShiftEnterpriseErrata/3.0/latest/RH7-RHOSE-3.0/$basearch/os -#  enabled: 1 -#  gpgcheck: 0 - -# Use latest Whitelist puddle as an additional repo: -openshift_additional_repos: -- id: ose-devel -  name: ose-devel -  baseurl: http://buildvm-devops.usersys.redhat.com/puddle/build/OpenShiftEnterprise/3.0/latest/RH7-RHOSE-3.0/$basearch/os -  enabled: 1 -  gpgcheck: 0 diff --git a/inventory/byo/hosts b/inventory/byo/hosts index 2dd854778..e9af5e571 100644 --- a/inventory/byo/hosts +++ b/inventory/byo/hosts @@ -1,5 +1,30 @@  # This is an example of a bring your own (byo) host inventory +# Create an OSEv3 group that contains the maters and nodes groups +[OSEv3:children] +masters +nodes + +# Set variables common for all OSEv3 hosts +[OSEv3:vars] +# SSH user, this user should allow ssh based auth without requiring a password +ansible_ssh_user=root + +# If ansible_ssh_user is not root, ansible_sudo must be set to true +#ansible_sudo=true + +# To deploy origin, change deployment_type to origin +deployment_type=enterprise + +# Pre-release registry URL +openshift_registry_url=docker-buildvm-rhose.usersys.redhat.com:5000/openshift3_beta/ose-${component}:${version} + +# Pre-release additional repo +openshift_additional_repos=[{'id': 'ose-devel', 'name': 'ose-devel', 'baseurl': 'http://buildvm-devops.usersys.redhat.com/puddle/build/OpenShiftEnterprise/3.0/latest/RH7-RHOSE-3.0/$basearch/os', 'enabled': 1, 'gpgcheck': 0}] + +# Origin copr repo +#openshift_additional_repos=[{'id': 'openshift-origin-copr', 'name': 'OpenShift Origin COPR', 'baseurl': 'https://copr-be.cloud.fedoraproject.org/results/maxamillion/origin-next/epel-7-$basearch/', 'enabled': 1, 'gpgcheck': 1, gpgkey: 'https://copr-be.cloud.fedoraproject.org/results/maxamillion/origin-next/pubkey.gpg'}] +  # host group for masters  [masters]  ose3-master-ansible.test.example.com @@ -7,4 +32,3 @@ ose3-master-ansible.test.example.com  # host group for nodes  [nodes]  ose3-node[1:2]-ansible.test.example.com - diff --git a/inventory/gce/group_vars/all b/inventory/gce/group_vars/all deleted file mode 100644 index b22da00de..000000000 --- a/inventory/gce/group_vars/all +++ /dev/null @@ -1,2 +0,0 @@ ---- -ansible_ssh_user: root diff --git a/inventory/gce/gce.py b/inventory/gce/hosts/gce.py index 3403f735e..3403f735e 100755 --- a/inventory/gce/gce.py +++ b/inventory/gce/hosts/gce.py diff --git a/inventory/gce/hosts/hosts b/inventory/gce/hosts/hosts new file mode 100644 index 000000000..6c590ac93 --- /dev/null +++ b/inventory/gce/hosts/hosts @@ -0,0 +1 @@ +localhost ansible_sudo=no ansible_python_interpreter=/usr/bin/python2 diff --git a/inventory/libvirt/group_vars/all b/inventory/libvirt/group_vars/all deleted file mode 100644 index b22da00de..000000000 --- a/inventory/libvirt/group_vars/all +++ /dev/null @@ -1,2 +0,0 @@ ---- -ansible_ssh_user: root diff --git a/inventory/libvirt/hosts b/inventory/libvirt/hosts deleted file mode 100644 index 6a818f268..000000000 --- a/inventory/libvirt/hosts +++ /dev/null @@ -1,2 +0,0 @@ -# Eventually we'll add the GCE, AWS, etc dynamic inventories, but for now... -localhost ansible_python_interpreter=/usr/bin/python2 diff --git a/inventory/libvirt/hosts/hosts b/inventory/libvirt/hosts/hosts new file mode 100644 index 000000000..9cdc31449 --- /dev/null +++ b/inventory/libvirt/hosts/hosts @@ -0,0 +1 @@ +localhost ansible_sudo=no ansible_python_interpreter=/usr/bin/python2 connection=local diff --git a/inventory/libvirt/hosts/libvirt.ini b/inventory/libvirt/hosts/libvirt.ini new file mode 100644 index 000000000..62ff204dd --- /dev/null +++ b/inventory/libvirt/hosts/libvirt.ini @@ -0,0 +1,20 @@ +# Ansible libvirt external inventory script settings +# + +[libvirt] + +uri = qemu:///system + +# API calls to libvirt can be slow. For this reason, we cache the results of an API +# call. Set this to the path you want cache files to be written to. Two files +# will be written to this directory: +#   - ansible-libvirt.cache +#   - ansible-libvirt.index +cache_path = /tmp + +# The number of seconds a cache file is considered valid. After this many +# seconds, a new API call will be made, and the cache file will be updated. +cache_max_age = 900 + + + diff --git a/inventory/libvirt/hosts/libvirt_generic.py b/inventory/libvirt/hosts/libvirt_generic.py new file mode 100755 index 000000000..4652f112e --- /dev/null +++ b/inventory/libvirt/hosts/libvirt_generic.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python2 + +""" +libvirt external inventory script +================================= + +Ansible has a feature where instead of reading from /etc/ansible/hosts +as a text file, it can query external programs to obtain the list +of hosts, groups the hosts are in, and even variables to assign to each host. + +To use this, copy this file over /etc/ansible/hosts and chmod +x the file. +This, more or less, allows you to keep one central database containing +info about all of your managed instances. + +""" + +# (c) 2015, Jason DeTiberus <jdetiber@redhat.com> +# +# 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/>. + +###################################################################### + +import argparse +import ConfigParser +import os +import re +import sys +from time import time +import libvirt +import xml.etree.ElementTree as ET + +try: +    import json +except ImportError: +    import simplejson as json + + +class LibvirtInventory(object): + +    def __init__(self): +        self.inventory = dict()  # A list of groups and the hosts in that group +        self.cache = dict()  # Details about hosts in the inventory + +        # Read settings and parse CLI arguments +        self.read_settings() +        self.parse_cli_args() + +        if self.args.host: +            print self.json_format_dict(self.get_host_info(), self.args.pretty) +        elif self.args.list: +            print self.json_format_dict(self.get_inventory(), self.args.pretty) +        else:  # default action with no options +            print self.json_format_dict(self.get_inventory(), self.args.pretty) + +    def read_settings(self): +        config = ConfigParser.SafeConfigParser() +        config.read( +            os.path.dirname(os.path.realpath(__file__)) + '/libvirt.ini' +        ) +        self.libvirt_uri = config.get('libvirt', 'uri') + +    def parse_cli_args(self): +        parser = argparse.ArgumentParser( +            description='Produce an Ansible Inventory file based on libvirt' +        ) +        parser.add_argument( +            '--list', +            action='store_true', +            default=True, +            help='List instances (default: True)' +        ) +        parser.add_argument( +            '--host', +            action='store', +            help='Get all the variables about a specific instance' +        ) +        parser.add_argument( +            '--pretty', +            action='store_true', +            default=False, +            help='Pretty format (default: False)' +        ) +        self.args = parser.parse_args() + +    def get_host_info(self): +        inventory = self.get_inventory() +        if self.args.host in inventory['_meta']['hostvars']: +            return inventory['_meta']['hostvars'][self.args.host] + +    def get_inventory(self): +        inventory = dict(_meta=dict(hostvars=dict())) + +        conn = libvirt.openReadOnly(self.libvirt_uri) +        if conn is None: +            print "Failed to open connection to %s" % libvirt_uri +            sys.exit(1) + +        domains = conn.listAllDomains() +        if domains is None: +            print "Failed to list domains for connection %s" % libvirt_uri +            sys.exit(1) + +        arp_entries = self.parse_arp_entries() + +        for domain in domains: +            hostvars = dict(libvirt_name=domain.name(), +                            libvirt_id=domain.ID(), +                            libvirt_uuid=domain.UUIDString()) +            domain_name = domain.name() + +            # TODO: add support for guests that are not in a running state +            state, _ = domain.state() +            # 2 is the state for a running guest +            if state != 1: +                continue + +            hostvars['libvirt_status'] = 'running' + +            root = ET.fromstring(domain.XMLDesc()) +            ns = {'ansible': 'https://github.com/ansible/ansible'} +            for tag_elem in root.findall('./metadata/ansible:tags/ansible:tag', ns): +                tag = tag_elem.text +                self.push(inventory, "tag_%s" % tag, domain_name) +                self.push(hostvars, 'libvirt_tags', tag) + +            # TODO: support more than one network interface, also support +            # interface types other than 'network' +            interface = root.find("./devices/interface[@type='network']") +            if interface is not None: +                mac_elem = interface.find('mac') +                if mac_elem is not None: +                    mac = mac_elem.get('address') +                    if mac in arp_entries: +                        ip_address = arp_entries[mac]['ip_address'] +                        hostvars['ansible_ssh_host'] = ip_address +                        hostvars['libvirt_ip_address'] = ip_address + +            inventory['_meta']['hostvars'][domain_name] = hostvars + +        return inventory + +    def parse_arp_entries(self): +        arp_entries = dict() +        with open('/proc/net/arp', 'r') as f: +            # throw away the header +            f.readline() + +            for line in f: +                ip_address, _, _, mac, _, device = line.strip().split() +                arp_entries[mac] = dict(ip_address=ip_address, device=device) + +        return arp_entries + +    def push(self, my_dict, key, element): +        if key in my_dict: +            my_dict[key].append(element) +        else: +            my_dict[key] = [element] + +    def json_format_dict(self, data, pretty=False): +        if pretty: +            return json.dumps(data, sort_keys=True, indent=2) +        else: +            return json.dumps(data) + +LibvirtInventory() | 
