From 268122d7d06fc4726af31ccdb8511073678ccbea Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Sun, 23 Mar 2014 10:03:17 -0400 Subject: [PATCH] added control to fail or not on missing key made split 'smarter' but still overridable --- library/system/getent | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/library/system/getent b/library/system/getent index fd1ac97c55e..d1231396591 100644 --- a/library/system/getent +++ b/library/system/getent @@ -25,23 +25,33 @@ 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 + - 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). + - 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. + - 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'. + - character used to override the split the database values into lists/arrays, + i.e ':' or '\t'. Otherwise split tries to be 'smart' depending on DB. + 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 @@ -49,7 +59,7 @@ author: Brian Coca EXAMPLES = ''' # get root user info -- getent: database=passwd key=root split=':' +- getent: database=passwd key=root # get all groups - getent: database=group split=':' @@ -57,8 +67,8 @@ EXAMPLES = ''' # get all hosts, split by tab - getent: database=hosts -# get http service info -- getent: database=services key=http +# get http service info, no error if missing +- getent: database=services key=http fail_key=False # get user password hash (requires sudo/root) - getent: database=shadow key=www-data split=: @@ -71,13 +81,17 @@ def main(): 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) @@ -86,6 +100,9 @@ def main(): 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: @@ -105,8 +122,10 @@ def main(): 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.") + 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."