diff options
author | Michael DeHaan <michael.dehaan@gmail.com> | 2014-09-26 10:40:16 -0400 |
---|---|---|
committer | Michael DeHaan <michael.dehaan@gmail.com> | 2014-09-26 10:40:16 -0400 |
commit | b1e789968bdb5cbad54e86c0d09ec42213eafd7a (patch) | |
tree | 4cf0326387831c1040e8b06f108228874ead09c9 /system/getent.py | |
parent | 50f105578a07361e60f95a63da6acb5660765871 (diff) | |
download | ansible-modules-extras-b1e789968bdb5cbad54e86c0d09ec42213eafd7a.tar.gz |
File extensions!
Diffstat (limited to 'system/getent.py')
-rw-r--r-- | system/getent.py | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/system/getent.py b/system/getent.py new file mode 100644 index 00000000..0173618f --- /dev/null +++ b/system/getent.py @@ -0,0 +1,143 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2014, Brian Coca <brian.coca+dev@gmail.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/>. +# + + +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.8" +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 split the database values into lists/arrays such as ':' or '\t', otherwise it will try to pick one depending on the database" + fail_key: + required: False + default: True + description: + - If a supplied key is missing this will make the task fail if True + +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 + register: root_info + +# get all groups +- getent: database=group split=':' + register: groups + +# get all hosts, split by tab +- getent: database=hosts + register: hosts + +# get http service info, no error if missing +- getent: database=services key=http fail_key=False + register: http_info + +# get user password hash (requires sudo/root) +- getent: database=shadow key=www-data split=: + register: pw_hash + +''' + +def main(): + module = AnsibleModule( + argument_spec = dict( + database = dict(required=True), + key = dict(required=False, default=None), + split = dict(required=False, default=None), + fail_key = dict(required=False, default=True), + ), + supports_check_mode = True, + ) + + colon = [ 'passwd', 'shadow', 'group', 'gshadow' ] + + database = module.params['database'] + key = module.params.get('key') + split = module.params.get('split') + fail_key = module.params.get('fail_key') + + getent_bin = module.get_bin_path('getent', True) + + if key is not None: + cmd = [ getent_bin, database, key ] + else: + cmd = [ getent_bin, database ] + + if split is None and database in colon: + split = ':' + + 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: + msg = "One or more supplied key could not be found in the database." + if not fail_key: + results[dbtree][key] = None + module.exit_json(ansible_facts=results, msg=msg) + 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() + |