From 27bf4d8ec44bcb31c38f0d125c12b3bc134c8bd8 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Fri, 21 Mar 2014 22:10:47 -0400 Subject: [PATCH] added getent module to get system data as facts --- library/system/getent | 119 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 library/system/getent diff --git a/library/system/getent b/library/system/getent new file mode 100644 index 00000000000..fd1ac97c55e --- /dev/null +++ b/library/system/getent @@ -0,0 +1,119 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2014, Brian Coca +# +# 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 . +# + + +DOCUMENTATION = ''' +--- +module: getent +short_description: a wrapper to the unix getent utility +description: + - Runs getent against one of it's various databases and returns information into the host's facts +version_added: "1.6" +options: + database: + required: True + description: + - the name of a getent database supported by the target system (passwd, group, hosts, etc). + key: + required: False + default: '' + description: + - key from which to return values from the specified database, otherwise the full contents are returned. + split: + required: False + default: None + description: + - character used to override the split the database values into lists/arrays, i.e ':' or '\t'. +notes: [ Not all databases support enumeration, check system documentation for details ] +requirements: [ ] +author: Brian Coca +''' + +EXAMPLES = ''' +# get root user info +- getent: database=passwd key=root split=':' + +# get all groups +- getent: database=group split=':' + +# get all hosts, split by tab +- getent: database=hosts + +# get http service info +- getent: database=services key=http + +# get user password hash (requires sudo/root) +- getent: database=shadow key=www-data split=: + +''' + +def main(): + module = AnsibleModule( + argument_spec = dict( + database = dict(required=True), + key = dict(required=False, default=None), + split = dict(required=False, default=None), + ), + supports_check_mode = True, + ) + + database = module.params['database'] + key = module.params.get('key') + split = module.params.get('split') + + getent_bin = module.get_bin_path('getent', True) + + if key is not None: + cmd = [ getent_bin, database, key ] + else: + cmd = [ getent_bin, database ] + + try: + rc, out, err = module.run_command(cmd) + except Exception, e: + module.fail_json(msg=str(e)) + + msg = "Unexpected failure!" + dbtree = 'getent_%s' % database + results = { dbtree: {} } + + if rc == 0: + for line in out.splitlines(): + record = line.split(split) + results[dbtree][record[0]] = record[1:] + + module.exit_json(ansible_facts=results) + + elif rc == 1: + msg = "Missing arguments, or database unknown." + elif rc == 2: + results[dbtree][key] = None + module.exit_json(ansible_facts=results, msg="One or more supplied key could not be found in the database.") + elif rc == 3: + msg = "Enumeration not supported on this database." + + module.fail_json(msg=msg) + +# import module snippets +from ansible.module_utils.basic import * + +main() +