Skip to content

Teach Ansible to search directories #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: updox-2.8.5
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions lib/ansible/plugins/lookup/dirglob.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# (c) 2012, Michael DeHaan <[email protected]>
# (c) 2017 Ansible Project
# (c) 2020, Estelle Poulin <[email protected]>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

DOCUMENTATION = """
lookup: dirglob
author: Estelle Poulin <[email protected]>
version_added: "2.8.5"
short_description: list files matching a pattern
description:
- Matches all directories in a single directory, non-recursively, that match a pattern.
It calls Python's "glob" library.
options:
_terms:
description: path(s) of directories to read
required: True
notes:
- Patterns are only supported on directories, not files.
- Matching is against local system files on the Ansible controller.
To iterate a list of directories on a remote node, use the M(find) module.
- Returns a string list of paths joined by commas, or an empty list if no directories match. For a 'true list' pass C(wantlist=True) to the lookup.
"""

EXAMPLES = """
- name: List all home directories on the system.
debug: msg={{ lookup('dirglob', '/home/*') }}

- name: Include all roles in a directory.
include_role: name={{ item }}
with_dirglob: "../roles/*"
"""

RETURN = """
_list:
description:
- list of directories
"""

import os
import glob

from ansible.plugins.lookup import LookupBase
from ansible.errors import AnsibleFileNotFound
from ansible.module_utils._text import to_bytes, to_text


class LookupModule(LookupBase):

def run(self, terms, variables=None, **kwargs):

ret = []
for term in terms:
term_file = os.path.basename(term)
dwimmed_path = self.find_file_in_search_path(variables, 'files', os.path.dirname(term))
if dwimmed_path:
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isdir(g))
return ret