From 3d61f077ec1ba2c0fdd4d493c730a4299e2f883d Mon Sep 17 00:00:00 2001 From: Jordon Replogle Date: Wed, 30 Jul 2014 10:08:22 -0700 Subject: [PATCH 1/2] Added OpenVZ Inventory python script --- plugins/inventory/openvz.py | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 plugins/inventory/openvz.py diff --git a/plugins/inventory/openvz.py b/plugins/inventory/openvz.py new file mode 100644 index 00000000000..1f441a39f54 --- /dev/null +++ b/plugins/inventory/openvz.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# openvz.py +# +# Copyright 2014 jordonr +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# +# Inspired by libvirt_lxc.py inventory script +# https://github.com/ansible/ansible/blob/e5ef0eca03cbb6c8950c06dc50d0ca22aa8902f4/plugins/inventory/libvirt_lxc.py +# +# Groups are determined by the description field of openvz guests +# multiple groups can be seperated by commas: webserver,dbserver + +from subprocess import Popen,PIPE +import sys +import json + + +#List openvz hosts +vzhosts = ['192.168.1.3','192.168.1.2','192.168.1.1'] +#Add openvzhosts to the inventory +inventory = {'vzhosts': {'hosts': vzhosts}} +#default group, when description not defined +default_group = ['vzguest'] + +def getGuests(): + #Loop through vzhosts + for h in vzhosts: + #SSH to vzhost and get the list of guests in json + pipe = Popen(['ssh', h,'vzlist','-j'], stdout=PIPE, universal_newlines=True) + + #Load Json info of guests + json_data = json.loads(pipe.stdout.read()) + + #loop through guests + for j in json_data: + #determine group from guest description + if j['description'] is not None: + groups = j['description'].split(",") + else: + groups = default_group + + #add guest to inventory + for g in groups: + if g not in inventory: + inventory[g] = {'hosts': []} + + for ip in j['ip']: + inventory[g]['hosts'].append(ip) + + print json.dumps(inventory) + +if len(sys.argv) == 2 and sys.argv[1] == '--list': + getGuests() +elif len(sys.argv) == 3 and sys.argv[1] == '--host': + print json.dumps({}); +else: + print "Need an argument, either --list or --host " From 0ff2936626afe83e2898e8ccecf59b891e550bf5 Mon Sep 17 00:00:00 2001 From: Jordon Replogle Date: Wed, 13 Aug 2014 10:28:43 -0700 Subject: [PATCH 2/2] Updated per Revision Request --- plugins/inventory/openvz.py | 73 +++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/plugins/inventory/openvz.py b/plugins/inventory/openvz.py index 1f441a39f54..fd0bd9ff794 100644 --- a/plugins/inventory/openvz.py +++ b/plugins/inventory/openvz.py @@ -5,21 +5,20 @@ # # Copyright 2014 jordonr # -# This program is free software; you can redistribute it and/or modify +# 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 2 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# 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 +# 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 this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -# +# along with Ansible. If not, see . # # Inspired by libvirt_lxc.py inventory script # https://github.com/ansible/ansible/blob/e5ef0eca03cbb6c8950c06dc50d0ca22aa8902f4/plugins/inventory/libvirt_lxc.py @@ -33,42 +32,46 @@ import json #List openvz hosts -vzhosts = ['192.168.1.3','192.168.1.2','192.168.1.1'] -#Add openvzhosts to the inventory -inventory = {'vzhosts': {'hosts': vzhosts}} +vzhosts = ['vzhost1','vzhost2','vzhost3'] +#Add openvz hosts to the inventory and Add "_meta" trick +inventory = {'vzhosts': {'hosts': vzhosts}, '_meta': {'hostvars': {}}} #default group, when description not defined default_group = ['vzguest'] -def getGuests(): - #Loop through vzhosts - for h in vzhosts: - #SSH to vzhost and get the list of guests in json - pipe = Popen(['ssh', h,'vzlist','-j'], stdout=PIPE, universal_newlines=True) +def get_guests(): + #Loop through vzhosts + for h in vzhosts: + #SSH to vzhost and get the list of guests in json + pipe = Popen(['ssh', h,'vzlist','-j'], stdout=PIPE, universal_newlines=True) - #Load Json info of guests - json_data = json.loads(pipe.stdout.read()) + #Load Json info of guests + json_data = json.loads(pipe.stdout.read()) - #loop through guests - for j in json_data: - #determine group from guest description - if j['description'] is not None: - groups = j['description'].split(",") - else: - groups = default_group + #loop through guests + for j in json_data: + #Add information to host vars + inventory['_meta']['hostvars'][j['hostname']] = {'ctid': j['ctid'], 'veid': j['veid'], 'vpsid': j['vpsid'], 'private_path': j['private'], 'root_path': j['root'], 'ip': j['ip']} - #add guest to inventory - for g in groups: - if g not in inventory: - inventory[g] = {'hosts': []} + #determine group from guest description + if j['description'] is not None: + groups = j['description'].split(",") + else: + groups = default_group - for ip in j['ip']: - inventory[g]['hosts'].append(ip) + #add guest to inventory + for g in groups: + if g not in inventory: + inventory[g] = {'hosts': []} + + inventory[g]['hosts'].append(j['hostname']) + + return inventory - print json.dumps(inventory) if len(sys.argv) == 2 and sys.argv[1] == '--list': - getGuests() + inv_json = get_guests() + print json.dumps(inv_json, sort_keys=True) elif len(sys.argv) == 3 and sys.argv[1] == '--host': - print json.dumps({}); + print json.dumps({}); else: - print "Need an argument, either --list or --host " + print "Need an argument, either --list or --host "