Automation Blog

from Stefan Schnell


Get Python Packages


Python

import importlib.metadata
import json

def handler(context: dict, inputs: dict) -> dict:

    result: list = []
    outputs: dict = {}

    packages: list = sorted(
        package.name for package in \
            importlib.metadata.distributions()
    )

    for package in packages:
        packageVersion: str = importlib.metadata.version(package)
        result.append(package + " version: " + packageVersion)
        print(package + " version: " + packageVersion)

    # In release 8.18.1 is pip 23.3.2 and in 9.0.0 is 24.0
    # In release 8.18.1 is setuptools 65.5.1 and in 9.0.0 is 69.0.3

    outputs = {
      "status": "done",
      "result": result
    }

    return outputs

Ansible

---

- name: Gets information of Python packages and modules on different ways
  hosts: localhost
  gather_facts: false

  vars:

    # The pip wheel is in files directory
    pip: pip-25.3-py3-none-any.whl

    detect_packages_python_code: |
      #!/usr/bin/python3
     
      import importlib.metadata
     
      def main():
     
          packages: list = sorted(
              package.name for package in \
                  importlib.metadata.distributions()
          )
     
          for package in packages:
              packageVersion: str = importlib.metadata.version(package)
              print(package, "version:", packageVersion)
     
      if __name__ == "__main__":
          main()

  tasks:

    # Package installer for Python (pip)

    - name: Write pip wheel
      ansible.builtin.copy:
        src: "{{ pip }}"
        dest: /tmp/{{ pip }}
        mode: "0644"

    - name: Get all installed packages via pip list
      register: python_packages_pip
      ansible.builtin.shell:
        cmd: /usr/bin/python3 /tmp/{{ pip }}/pip list

    - name: Delete pip wheel
      ansible.builtin.file:
        path: /tmp/{{ pip }}
        state: absent

    - name: Print result of pip list
     ansible.builtin.debug:
        msg: "{{ python_packages_pip }}"

    # Help system

    - name: Get all available modules via built-in help system
      register: python_modules
      ansible.builtin.shell:
        cmd: /usr/bin/python3 -c "help('modules')"

    - name: Print result of help modules
      ansible.builtin.debug:
        msg: "{{ python_modules }}"

    # Library that accesses the metadata

    - name: Detect all packages via metadata
      changed_when: python_packages_metadata.rc != 0
      register: python_packages_metadata
      ansible.builtin.command:
        cmd: "/usr/bin/python3 -c '{{ detect_packages_python_code }}'"

    - name: Print result of the Python script
      ansible.builtin.debug:
        msg: "{{ python_packages_metadata.stdout_lines }}"