73438de862
* A basic start on an lxd dynamic inventory script The script is a fairly basic start on an lxd dynamic inventory script. Only tested on ubuntu 16.04 and currently only reports ipv4 container addresses. Improvements to come. * Updated formatting, indenting and python3 support Updated to work on python3 * Additional options read from the ini file Added options for connection and group to the ini file and modified to use these. Host returned is now the name by default. For non-lxd connection, the ansible_host var is populated with the ip address. * Additional options for group and connection * Minor change to re-run tests
103 lines
3.7 KiB
Python
103 lines
3.7 KiB
Python
#!/usr/bin/env python
|
|
|
|
# (c) 2013, Michael Scherer <misc@zarb.org>
|
|
# (c) 2014, Hiroaki Nakamura <hnakamur@gmail.com>
|
|
# (c) 2016, Andew Clarke <andrew@oscailte.org>
|
|
#
|
|
# This file is based on https://github.com/ansible/ansible/blob/devel/plugins/inventory/libvirt_lxc.py which is part of Ansible,
|
|
# and https://github.com/hnakamur/lxc-ansible-playbooks/blob/master/provisioning/inventory-lxc.py
|
|
#
|
|
# NOTE, this file has some obvious limitations, improvements welcome
|
|
#
|
|
# 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 os
|
|
from subprocess import Popen,PIPE
|
|
import distutils.spawn
|
|
import sys
|
|
import json
|
|
try:
|
|
import configparser
|
|
except:
|
|
from six.moves import configparser
|
|
|
|
# Set up defaults
|
|
resource = 'local:'
|
|
group = 'lxd'
|
|
connection = 'lxd'
|
|
hosts = {}
|
|
result = {}
|
|
|
|
# Read the settings from the lxd.ini file
|
|
config = configparser.SafeConfigParser()
|
|
config.read(os.path.dirname(os.path.realpath(__file__)) + '/lxd.ini')
|
|
if config.has_option('lxd', 'resource'):
|
|
resource = config.get('lxd', 'resource')
|
|
if config.has_option('lxd', 'group'):
|
|
group = config.get('lxd', 'group')
|
|
if config.has_option('lxd', 'connection'):
|
|
connection = config.get('lxd', 'connection')
|
|
|
|
# Ensure executable exists
|
|
if distutils.spawn.find_executable('lxc'):
|
|
|
|
# Set up containers result and hosts array
|
|
result[group] = {}
|
|
result[group]['hosts'] = []
|
|
|
|
# Run the command and load json result
|
|
pipe = Popen(['lxc', 'list', resource, '--format', 'json'], stdout=PIPE, universal_newlines=True)
|
|
lxdjson = json.load(pipe.stdout)
|
|
|
|
# Iterate the json lxd output
|
|
for item in lxdjson:
|
|
|
|
# Check state and network
|
|
if 'state' in item and item['state'] is not None and 'network' in item['state']:
|
|
network = item['state']['network']
|
|
|
|
# Check for eth0 and addresses
|
|
if 'eth0' in network and 'addresses' in network['eth0']:
|
|
addresses = network['eth0']['addresses']
|
|
|
|
# Iterate addresses
|
|
for address in addresses:
|
|
|
|
# Only return inet family addresses
|
|
if 'family' in address and address['family'] == 'inet':
|
|
if 'address' in address:
|
|
ip = address['address']
|
|
name = item['name']
|
|
|
|
# Add the host to the results and the host array
|
|
result[group]['hosts'].append(name)
|
|
hosts[name] = ip
|
|
|
|
# Set the other containers result values
|
|
result[group]['vars'] = {}
|
|
result[group]['vars']['ansible_connection'] = connection
|
|
|
|
# Process arguments
|
|
if len(sys.argv) == 2 and sys.argv[1] == '--list':
|
|
print(json.dumps(result))
|
|
elif len(sys.argv) == 3 and sys.argv[1] == '--host':
|
|
if sys.argv[2] == 'localhost':
|
|
print(json.dumps({'ansible_connection': 'local'}))
|
|
else:
|
|
if connection == 'lxd':
|
|
print(json.dumps({'ansible_connection': connection}))
|
|
else:
|
|
print(json.dumps({'ansible_connection': connection, 'ansible_host': hosts[sys.argv[2]]}))
|
|
else:
|
|
print("Need an argument, either --list or --host <host>")
|