#!/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_container_copy author: - Alessandro Rossi (@kubealex) short_description: Copy file to/from a container notes: - Podman may required elevated privileges in order to run properly. description: - Copy file or folder from the host to a container and vice-versa. 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 src: description: - Path of the file/folder to copy from/to the container type: str required: True dest: description: - Path of the destination file/folder to copy from/to the container required: True type: str container: description: - Name/ID of the container to copy from/to required: True type: str from_container: description: - Specify whether or not the file must be copied from the container to the host required: False default: False type: bool archive: description: - Chown copied files to the primary uid/gid of the destination container. required: False default: True type: bool overwrite: description: - Allow to overwrite directories with non-directories and vice versa required: False default: False type: bool """ EXAMPLES = r""" - name: Copy file "test.yml" on the host to the "apache" container's root folder containers.podman.podman_container_copy: src: test.yml dest: / container: apache - name: Copy file "test.yml" in the "apache" container's root folder to the playbook's folder containers.podman.podman_container_copy: src: /test.yml dest: ./ container: apache from_container: True """ from ansible.module_utils.basic import AnsibleModule def copy_file(module, executable, src, dest, container, from_container, archive, overwrite): if from_container: command = [executable, "cp", "{0}:{1}".format(container, src), dest] else: command = [executable, "cp", src, "{0}:{1}".format(container, dest)] if not archive: command.append("--archive=False") if overwrite: command.append("--overwrite") rc, out, err = module.run_command(command) if rc != 0: module.fail_json(msg="Unable to copy file to/from container - {out}".format(out=err)) else: changed = True return changed, out, err def main(): module = AnsibleModule( argument_spec=dict( executable=dict(type="str", default="podman"), src=dict(type="str", required=True), dest=dict(type="str", required=True), container=dict(type="str", required=True), from_container=dict(type="bool", required=False, default=False), archive=dict(type="bool", required=False, default=True), overwrite=dict(type="bool", required=False, default=False), ), supports_check_mode=False, ) executable = module.params["executable"] src = module.params["src"] dest = module.params["dest"] container = module.params["container"] from_container = module.params["from_container"] archive = module.params["archive"] overwrite = module.params["overwrite"] executable = module.get_bin_path(executable, required=True) changed, out, err = copy_file(module, executable, src, dest, container, from_container, archive, overwrite) results = dict(changed=changed) module.exit_json(**results) if __name__ == "__main__": main()