mirror of
https://github.com/containers/ansible-podman-collections.git
synced 2026-02-04 07:11:49 +00:00
128 lines
3.7 KiB
Python
128 lines
3.7 KiB
Python
#!/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()
|