mirror of
https://github.com/containers/ansible-podman-collections.git
synced 2026-02-04 07:11:49 +00:00
174 lines
6 KiB
Python
174 lines
6 KiB
Python
#!/usr/bin/python
|
|
# Copyright (c) 2025 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_system_connection_info
|
|
author:
|
|
- "Sagi Shnaidman (@sshnaidm)"
|
|
version_added: '1.18.0'
|
|
short_description: Gather info about podman system connections
|
|
notes: []
|
|
description:
|
|
- Gather info about podman system connections with podman system connection list command.
|
|
requirements:
|
|
- "Podman installed on host"
|
|
options:
|
|
name:
|
|
description:
|
|
- Name of the connection to gather info about
|
|
- If not provided, info about all connections will be returned
|
|
type: str
|
|
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
|
|
"""
|
|
|
|
EXAMPLES = r"""
|
|
- name: Gather info about all connections
|
|
containers.podman.podman_system_connection_info:
|
|
|
|
- name: Gather info about specific connection
|
|
containers.podman.podman_system_connection_info:
|
|
name: production
|
|
|
|
- name: Get connection info and register result
|
|
containers.podman.podman_system_connection_info:
|
|
name: staging
|
|
register: staging_connection
|
|
|
|
- name: Display connection URI
|
|
debug:
|
|
msg: "Staging connection URI: {{ staging_connection.connections[0].URI }}"
|
|
when: staging_connection.connections | length > 0
|
|
"""
|
|
|
|
RETURN = r"""
|
|
connections:
|
|
description: Facts from all or specified connections
|
|
returned: always
|
|
type: list
|
|
sample: [
|
|
{
|
|
"Name": "production",
|
|
"URI": "ssh://root@server.example.com:22/run/user/0/podman/podman.sock",
|
|
"Identity": "/home/user/.ssh/id_rsa",
|
|
"Default": true,
|
|
"ReadWrite": true
|
|
},
|
|
{
|
|
"Name": "local",
|
|
"URI": "unix:///run/user/1000/podman/podman.sock",
|
|
"Identity": "",
|
|
"Default": false,
|
|
"ReadWrite": false
|
|
},
|
|
{
|
|
"Name": "development",
|
|
"URI": "ssh://dev@dev.example.com:22/run/user/1000/podman/podman.sock",
|
|
"Identity": "/home/user/.ssh/dev_rsa",
|
|
"Default": false,
|
|
"ReadWrite": true
|
|
}
|
|
]
|
|
"""
|
|
|
|
import json
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
|
|
def get_connection_info(module, executable, name):
|
|
"""Get connection information from podman system connection list.
|
|
|
|
Retrieves connection information by executing 'podman system connection list --format json'
|
|
and optionally filters the results for a specific connection by name.
|
|
|
|
Args:
|
|
module (AnsibleModule): The Ansible module instance for running commands and error handling
|
|
executable (str): Path to the podman executable
|
|
name (str or None): Name of specific connection to filter for, or None to get all connections
|
|
|
|
Returns:
|
|
tuple: A tuple containing:
|
|
- connections (list): List of connection dictionaries matching the filter criteria
|
|
- out (str): Raw stdout from the podman command
|
|
- err (str): Raw stderr from the podman command
|
|
|
|
Raises:
|
|
AnsibleFailJson: If the podman command fails or JSON parsing fails
|
|
|
|
Note:
|
|
When a specific connection name is provided but not found, an empty list is returned
|
|
rather than failing. This allows for idempotent behavior when checking if connections exist.
|
|
"""
|
|
command = [executable, "system", "connection", "list", "--format", "json"]
|
|
rc, out, err = module.run_command(command)
|
|
|
|
if rc != 0:
|
|
module.fail_json(msg="Unable to get list of connections: %s" % err)
|
|
|
|
try:
|
|
connections = json.loads(out) if out.strip() else []
|
|
except json.JSONDecodeError as e:
|
|
module.fail_json(msg="Failed to parse connection list JSON: %s" % str(e))
|
|
|
|
if name:
|
|
# Filter for specific connection
|
|
filtered_connections = [conn for conn in connections if conn.get("Name") == name]
|
|
# if not filtered_connections:
|
|
# module.fail_json(msg="Connection '%s' not found" % name)
|
|
return filtered_connections, out, err
|
|
|
|
return connections, out, err
|
|
|
|
|
|
def main():
|
|
"""Main entry point for the podman_system_connection_info Ansible module.
|
|
|
|
This function sets up the Ansible module, validates parameters, retrieves connection
|
|
information from podman, and returns the results in the expected format.
|
|
|
|
The module supports check mode and never reports changes since it's an info-gathering
|
|
module that doesn't modify system state.
|
|
|
|
Module Parameters:
|
|
executable (str): Path to podman executable (default: "podman")
|
|
name (str, optional): Name of specific connection to get info about.
|
|
If not provided, returns info about all connections.
|
|
|
|
Each connection dictionary may contain the following fields:
|
|
- Name (str): Connection name
|
|
- URI (str): Connection URI (ssh://, unix://, tcp://)
|
|
- Default (bool): Whether this is the default connection
|
|
- ReadWrite (bool, optional): Read/write access (Podman version dependent)
|
|
- Identity (str, optional): SSH identity file path (Podman version dependent)
|
|
- IsMachine (bool, optional): Whether this is a machine connection (Podman version dependent)
|
|
|
|
Note:
|
|
Some fields like ReadWrite, Identity, and IsMachine are optional and may not be present
|
|
in all Podman versions. The module handles this gracefully.
|
|
"""
|
|
module = AnsibleModule(
|
|
argument_spec=dict(executable=dict(type="str", default="podman"), name=dict(type="str")),
|
|
supports_check_mode=True,
|
|
)
|
|
|
|
name = module.params["name"]
|
|
executable = module.get_bin_path(module.params["executable"], required=True)
|
|
|
|
inspect_results, out, err = get_connection_info(module, executable, name)
|
|
|
|
results = {"changed": False, "connections": inspect_results, "stderr": err}
|
|
|
|
module.exit_json(**results)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|