#!/usr/bin/python # doteast; base from skvidal's freezelist # doteast porting to ansible 2.0 # list hosts with ansible var[=value], Or # list all hosts with their corresponding vars # Note that the script will attempt to "match" the supplied value of the var against the values if it the var is multivalued from ansible.parsing.dataloader import DataLoader from ansible.vars import VariableManager from ansible.inventory import Inventory import sys from optparse import OptionParser parser = OptionParser(version="1.0") parser.add_option('-i', dest='inventory', default=None, help="Path to inventory file/dir") parser.add_option('-o', dest='variable', default=None, help="variable name to check") parser.add_option('-a', action="store_true", dest='all_vars', default=None, help="get all vars") opts, args = parser.parse_args(sys.argv[1:]) if ((opts.variable == None and opts.all_vars == None) or (opts.variable != None and opts.all_vars != None)): print "Usage: hosts_with_var_set -o varname[=value] | -a" sys.exit(-1) variable_manager = VariableManager() loader = DataLoader() if opts.inventory: inv = Inventory(loader=loader,variable_manager=variable_manager, host_list=opts.inventory) else: inv = Inventory(loader=loader,variable_manager=variable_manager) variable_manager.set_inventory(inv) matching=True if opts.variable != None: if opts.variable.find("=") == -1: matching=False var_name=opts.variable else: var_name,value = opts.variable.split('=') if value == "": value="None" var_set = [] for host in sorted(inv.get_hosts()): vars = variable_manager.get_vars(loader=loader, host=host) if opts.variable == None: # remove expanded 'all' groups vars.pop('groups') vars['groups']=host.get_groups() print "%s\n%s\n" % (host.get_name(),vars) else: if vars.has_key(var_name): if not matching: var_set.append(host.get_name()) else: if str(vars.get(var_name)).find(value) != -1: var_set.append(host.get_name()) if opts.variable != None: if not matching: print 'hosts with variable %s:' % var_name else: print 'hosts with variable %s matching %s value' % (var_name,value) for host in sorted(var_set): print host