#!/usr/bin/python # Copyright (c) 2020 Red Hat # 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 = """ --- module: podman_containers author: - "Sagi Shnaidman (@sshnaidm)" version_added: '1.4.0' short_description: Manage podman containers in a batch description: - Manage groups of podman containers requirements: - "podman" options: containers: description: - List of dictionaries with data for running containers for podman_container module. required: True type: list elements: dict debug: description: - Return additional information which can be helpful for investigations. type: bool default: False """ EXAMPLES = """ - name: Run three containers at once podman_containers: containers: - name: alpine image: alpine command: sleep 1d - name: web image: nginx - name: test image: python:3.10-alpine command: python -V """ from ansible.module_utils.basic import AnsibleModule # noqa: F402 from ..module_utils.podman.podman_container_lib import PodmanManager # noqa: F402 from ..module_utils.podman.podman_container_lib import set_container_opts # noqa: F402 def combine(results): changed = any(i.get("changed", False) for i in results) failed = any(i.get("failed", False) for i in results) actions = [] podman_actions = [] containers = [] podman_version = "" diffs = {} stderr = "" stdout = "" for i in results: if "actions" in i and i["actions"]: actions += i["actions"] if "podman_actions" in i and i["podman_actions"]: podman_actions += i["podman_actions"] if "container" in i and i["container"]: containers.append(i["container"]) if "podman_version" in i: podman_version = i["podman_version"] if "diff" in i: diffs[i["container"]["Name"]] = i["diff"] if "stderr" in i: stderr += i["stderr"] if "stdout" in i: stdout += i["stdout"] total = { "changed": changed, "failed": failed, "actions": actions, "podman_actions": podman_actions, "containers": containers, "stdout": stdout, "stderr": stderr, } if podman_version: total["podman_version"] = podman_version if diffs: before = after = "" for k, v in diffs.items(): before += "".join([str(k), ": ", str(v["before"]), "\n"]) after += "".join([str(k), ": ", str(v["after"]), "\n"]) total["diff"] = {"before": before, "after": after} return total def check_input_strict(container): if container["state"] in ["started", "present"] and not container["image"]: return "State '%s' required image to be configured!" % container["state"] def main(): module = AnsibleModule( argument_spec=dict( containers=dict(type="list", elements="dict", required=True), debug=dict(type="bool", default=False), ), supports_check_mode=True, ) # work on input vars results = [] for container in module.params["containers"]: options_dict = set_container_opts(container) options_dict["debug"] = module.params["debug"] or options_dict["debug"] test_input = check_input_strict(options_dict) if test_input: module.fail_json(msg="Failed to run container %s because: %s" % (options_dict["name"], test_input)) res = PodmanManager(module, options_dict).execute() results.append(res) total_results = combine(results) module.exit_json(**total_results) if __name__ == "__main__": main()