Commit 75b68724 by Michel Blanc

Adds filter option to setup module

Adds facts filtering using fnmatch, via the 'filter' option.

Usage:
ansible -m setup -a 'filter=ansible_*_mb'
parent 3f2fd22e
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
import array import array
import fcntl import fcntl
import fnmatch
import glob import glob
import platform import platform
import re import re
...@@ -30,7 +31,13 @@ DOCUMENTATION = ''' ...@@ -30,7 +31,13 @@ DOCUMENTATION = '''
--- ---
module: setup module: setup
short_description: Gathers facts about remote hosts short_description: Gathers facts about remote hosts
options: {} options:
filter:
description:
- a filter that will be applied to the keys; only key matching filter will
be returned. The filter should be a shell-style wildcard.
required: false
default: *
description: description:
- This module is automatically called by playbooks to gather useful - This module is automatically called by playbooks to gather useful
variables about remote hosts that can be used in playbooks. It can also be variables about remote hosts that can be used in playbooks. It can also be
...@@ -1084,9 +1091,12 @@ def run_setup(module): ...@@ -1084,9 +1091,12 @@ def run_setup(module):
setup_options = {} setup_options = {}
facts = ansible_facts() facts = ansible_facts()
filtr = module.params['filter']
for (k, v) in facts.items(): for (k, v) in facts.items():
setup_options["ansible_%s" % k.replace('-', '_')] = v k = "ansible_%s" % k.replace('-', '_')
if fnmatch.fnmatch(k, module.params['filter']):
setup_options[k] = v
# if facter is installed, and we can use --json because # if facter is installed, and we can use --json because
# ruby-json is ALSO installed, include facter data in the JSON # ruby-json is ALSO installed, include facter data in the JSON
...@@ -1100,7 +1110,9 @@ def run_setup(module): ...@@ -1100,7 +1110,9 @@ def run_setup(module):
facter = False facter = False
if facter: if facter:
for (k,v) in facter_ds.items(): for (k,v) in facter_ds.items():
setup_options["facter_%s" % k] = v k = "facter_%s" % k
if fnmatch.fnmatch(k, module.params['filter']):
setup_options[k] = v
# ditto for ohai, but just top level string keys # ditto for ohai, but just top level string keys
# because it contains a lot of nested stuff we can't use for # because it contains a lot of nested stuff we can't use for
...@@ -1117,7 +1129,8 @@ def run_setup(module): ...@@ -1117,7 +1129,8 @@ def run_setup(module):
for (k,v) in ohai_ds.items(): for (k,v) in ohai_ds.items():
if type(v) == str or type(v) == unicode: if type(v) == str or type(v) == unicode:
k2 = "ohai_%s" % k.replace('-', '_') k2 = "ohai_%s" % k.replace('-', '_')
setup_options[k2] = v if fnmatch.fnmatch(k2, module.params['filter']):
setup_options[k2] = v
setup_result = {} setup_result = {}
setup_result['ansible_facts'] = setup_options setup_result['ansible_facts'] = setup_options
...@@ -1130,7 +1143,9 @@ def run_setup(module): ...@@ -1130,7 +1143,9 @@ def run_setup(module):
def main(): def main():
global module global module
module = AnsibleModule( module = AnsibleModule(
argument_spec = dict(), argument_spec = dict(
filter=dict(default="*", required=False),
),
supports_check_mode = True, supports_check_mode = True,
) )
data = run_setup(module) data = run_setup(module)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment