tmconfpy - Ansible collection

Purpose

tmconfpy as well as the tmconfpy ansible collection aim to make BIG-IP configurations more accessible by serializing the tmconf format to python data structures.

This can be used to replace facts gathering in ansible, for ansible implementation specific purposes like checking for dependencies, or to query specific configuration information.

It also can help to audit configurations by comparing the “on-device” configuration with stored references.

As the module copies configuration files from F5 BIG-IP devices, those configurations might contain sensitive data. Make sure YOU, as the implementor, ensure data security!

For more details about the relevant configuration files, data formats, tmconfpy and its ansible collection please have a look in the documentation.

Installation

You can install the tmconfpy ansible collection either from or from github.

ansible-galaxy collection install simonkowallik.tmconfpy

ansible-galaxy collection install git@github.com:simonkowallik/tmconfpy.git#ansible_collections/simonkowallik/tmconfpy,main

In your requirements.yml file you can use both ways as well:

---
- name: simonkowallik/tmconfpy
  type: galaxy
  version: 1.1.0

#- source: https://github.com/simonkowallik/tmconfpy.git#ansible_collections/simonkowallik/tmconfpy
#  type: git
#  version: main

Example Playbook

---
- name: "tmconfpy example playbook"
  hosts: all
  connection: httpapi
  gather_facts: false

  vars:
    provider:
      server: 192.0.2.245
      server_port: 443
      user: admin
      password: admin  # use vault!
      validate_certs: yes

    # map provider variables to collection v2 variables
    ansible_host: "{{ provider.server }}"
    ansible_user: "{{ provider.user }}"
    ansible_httpapi_password: "{{ provider.password }}"
    ansible_httpapi_port: "{{ provider.server_port }}"
    ansible_network_os: f5networks.f5_bigip.bigip
    ansible_httpapi_use_ssl: yes
    ansible_httpapi_validate_certs: "{{ provider.validate_certs }}"
    # the above is typically defined in a group_vars and host_vars and ansible-vault

    # path to the configuration file on the BIG-IP
    bigip_configfile: /config/bigip_user.conf

  tasks:
    - name: "Requirements Note"
      ansible.builtin.debug:
        msg: |
          # This playbook requires the following:
          # requirements.yml
          collections:
          # https://galaxy.ansible.com/ui/repo/published/f5networks/f5_bigip/
          - name: f5networks.f5_bigip
            type: galaxy
            version: ">=3.0.0"
          # https://galaxy.ansible.com/ui/repo/published/simonkowallik/tmconfpy/
          - name: simonkowallik/tmconfpy
            type: galaxy
            version: ">=1.1.0"

    - name: "Fetch {{ bigip_configfile }} in tabular format"
      simonkowallik.tmconfpy.tmconf_get:
        configfile: "{{ bigip_configfile }}"
        format: tabular
      register: tabular_config

    # tabular format has 3 columns, object_path, object_name and the object itself.
    # each entry in the tmconf file is a row.
    - name: "Print {{ bigip_configfile }} in tabular format"
      ansible.builtin.debug:
        var: tabular_config.tmconf_tabular

    # object format uses keys that represent the object_path and object_name. The value is the object itself.
    - name: "Fetch {{ bigip_configfile }} in object format (default)"
      simonkowallik.tmconfpy.tmconf_get:
        configfile: "{{ bigip_configfile }}"
      register: config

    - name: "Print {{ bigip_configfile }} in object format (default)"
      ansible.builtin.debug:
        var: config.tmconf

    - name: "Save tmconf to JSON file"
      ansible.builtin.copy:
        content: "{{ config.tmconf | to_nice_json }}"
        dest: "./{{ bigip_configfile }}"