135 lines
3.8 KiB
Python
135 lines
3.8 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-alpine
|
|
command: python -V
|
|
'''
|
|
|
|
from copy import deepcopy # noqa: F402
|
|
|
|
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()
|