#!/usr/bin/python # Copyright (c) 2024 Ansible Project # 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 = r''' module: podman_search author: - Derek Waters (@derekwaters) short_description: Search for remote images using podman notes: - Podman may required elevated privileges in order to run properly. description: - Search for remote images using C(podman) options: executable: description: - Path to C(podman) executable if it is not in the C($PATH) on the machine running C(podman) default: 'podman' type: str term: description: - The search term to look for. Will search all default registries unless a registry is defined in the search term. type: str required: True limit: description: - Limit the number of image results returned from the search (per image registry) required: False default: 25 type: int list_tags: description: - Whether or not to return the list of tags associated with each image required: False default: False type: bool ''' EXAMPLES = r""" - name: Search for any rhel images containers.podman.podman_search: term: "rhel" limit: 3 - name: Gather info on a specific remote image containers.podman.podman_search: term: "myimageregistry.com/ansible-automation-platform/ee-minimal-rhel8" - name: Gather tag info on a known remote image containers.podman.podman_search: term: "myimageregistry.com/ansible-automation-platform/ee-minimal-rhel8" list_tags: True """ RETURN = r""" images: description: info from all or specified images returned: always type: list sample: [ { "Automated": "", "Description": "Red Hat Enterprise Linux Atomic Image is a minimal, fully supported base image.", "Index": "registry.access.redhat.com", "Name": "registry.access.redhat.com/rhel7-atomic", "Official": "", "Stars": 0, "Tags": ["1.0", "1.1", "1.1.1-devel"] } ] """ import json from ansible.module_utils.basic import AnsibleModule def search_images(module, executable, term, limit, list_tags): command = [executable, 'search', term, '--format', 'json'] command.extend(['--limit', "{0}".format(limit)]) if list_tags: command.extend(['--list-tags']) rc, out, err = module.run_command(command) if rc != 0 and list_tags and out == "" and "fetching tags list" in err: return out, err if rc != 0: module.fail_json(msg="Unable to gather info for '{0}': {1}".format(term, err)) return out, err def main(): module = AnsibleModule( argument_spec=dict( executable=dict(type='str', default='podman'), term=dict(type='str', required=True), limit=dict(type='int', required=False, default=25), list_tags=dict(type='bool', required=False, default=False) ), supports_check_mode=True, ) executable = module.params['executable'] term = module.params.get('term') limit = module.params.get('limit') list_tags = module.params.get('list_tags') executable = module.get_bin_path(executable, required=True) result_str, errors = search_images(module, executable, term, limit, list_tags) if result_str == "": results = [] else: try: results = json.loads(result_str) except json.decoder.JSONDecodeError: module.fail_json(msg='Failed to parse JSON output from podman search: {out}'.format(out=result_str)) results = dict( changed=False, images=results, stderr=errors, ) module.exit_json(**results) if __name__ == '__main__': main()