Recording Ansible

building ansible with Ansible

& testing it with Ansible



David Moreau-Simard (fosstodon.org/@rfc2549)
Config Management Camp 2023



$ whoami

---
- name: David Moreau-Simard
  hosts:
    - dmsimard:matrix.org
    - fosstodon.org/@rfc2549
  vars:
    location: Montreal, Canada (or rabbit holes)
    profile: sysadmin, dev/ops, CI/CD, SRE
  roles:
    - Ansible user since version 1.8 or so (2014?)
    - Previously in the Ansible community team @ Red Hat
    - Part time open source contributor (between dev ops and dad ops)

About this presentation

  • You can try this at home and even help improve it: it's open source πŸŽ‰
  • Not exhaustive: meant as a high level overview with references to explore
  • Happy to chat about it, feel free to reach out !

Ansible

ansible readme
https://github.com/ansible/ansible/blob/devel/README.rst

Configuration management with Ansible

- name: Setup nginx
  hosts: web01
  become: true
  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted
  tasks:
    - name: Install nginx
      package:
        name: nginx
        state: present
    - name: Configure virtual host
      template:
        src: vhost.conf.j2
        dest: /etc/nginx/conf.d/service.conf
      notify:
        - Restart nginx
    - name: Ensure nginx is started
      service:
        name: nginx
        state: started
        enabled: true

Other use cases

golden hammer
https://www.youtube.com/watch?v=TVq88JeJbw4
<3 geerlingguy

ansible

IncludesΒ ansible-coreΒ and is a batteries-included package that provides a curated set of Ansible collections

ansible pypi
https://pypi.org/project/ansible/

ansible-core

Contains the base engine and a small subset of modules and plugins

Provides the CLIs for: ansible, ansible-doc, ansible-inventory, ansible-playbook, ansible-galaxy, ansible-test

ansible pypi
https://pypi.org/project/ansible-core/

Can we build ansible with Ansible ?


What could go wrong ?

Β―\(ツ)/Β―

Building a python source distribution package

Doing it manually

$ git clone https://github.com/ansible/ansible ~/src/ansible
$ cd ~/src/ansible; python3 setup.py sdist
$ ls dist/
ansible-core-2.15.0.dev0.tar.gz  # <-- ansible-core !

Doing it with Ansible

- name: Clone the ansible repository
  git:
    repo: https://github.com/ansible/ansible
    dest: "{{ '~/src/ansible' | expanduser }}"

- name: Build a distribution package
  command: python3 setup.py sdist
  args:
    chdir: "{{ '~/src/ansible' | expanduser }}"
    creates: "{{ '~/src/ansible' | expanduser }}/dist/ansible-core-2.15.0.dev0.tar.gz"

Why ?

xkcd automation
https://xkcd.com/1319/

Building a python source distribution package

Doing it manually

$ git clone https://github.com/ansible/ansible
fatal: destination path 'ansible' already exists and is not an empty directory.

Doing it with Ansible

TASK [Clone the ansible repository] *****************************************************************************************************
ok: [localhost]

TASK [Build a distribution package] *****************************************************************************************************
ok: [localhost]

PLAY RECAP ******************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

What about the ansible package ?

$ wget https://files.pythonhosted.org/packages/05/cd/d5c46caa5d8c6c11ebad76accd2cec355a10ba80c71780ecdf0bc6748a62/ansible-7.1.0.tar.gz
$ tar -xzf ansible-7.1.0.tar.gz
$ tree -L 1 ansible-7.1.0
ansible-7.1.0
β”œβ”€β”€ ansible_collections  # included collections ("batteries included")
β”œβ”€β”€ ansible.egg-info
β”œβ”€β”€ build-ansible.sh     # intended to rebuild the package
β”œβ”€β”€ CHANGELOG-v7.rst     # aggregated changelog from every collection
β”œβ”€β”€ COPYING
β”œβ”€β”€ debian
β”œβ”€β”€ MANIFEST.in
β”œβ”€β”€ PKG-INFO
β”œβ”€β”€ porting_guide_7.rst  # aggregated porting guide from every collection
β”œβ”€β”€ README.rst
β”œβ”€β”€ setup.cfg
└── setup.py

3 directories, 9 files

Inside ansible_collections

$ tree -L 2 ansible-7.1.0/ansible_collections/
ansible-7.1.0/ansible_collections/
β”œβ”€β”€ amazon
β”‚Β Β  └── aws
β”œβ”€β”€ ansible
β”‚Β Β  β”œβ”€β”€ netcommon
β”‚Β Β  β”œβ”€β”€ posix
β”‚Β Β  β”œβ”€β”€ utils
β”‚Β Β  └── windows
β”œβ”€β”€ ansible_community.py
β”œβ”€β”€ ansible_release.py
β”œβ”€β”€ arista
β”‚Β Β  └── eos
β”œβ”€β”€ awx
β”‚Β Β  └── awx
β”œβ”€β”€ azure
β”‚Β Β  └── azcollection
β”œβ”€β”€ check_point
β”‚Β Β  └── mgmt
β”œβ”€β”€ chocolatey
β”‚Β Β  └── chocolatey
β”œβ”€β”€ cisco
β”‚Β Β  β”œβ”€β”€ aci
β”‚Β Β  β”œβ”€β”€ asa
β”‚Β Β  β”œβ”€β”€ dnac
β”‚Β Β  β”œβ”€β”€ intersight
β”‚Β Β  β”œβ”€β”€ ios
β”‚Β Β  β”œβ”€β”€ iosxr
β”‚Β Β  β”œβ”€β”€ ise
β”‚Β Β  β”œβ”€β”€ meraki
β”‚Β Β  β”œβ”€β”€ mso
β”‚Β Β  β”œβ”€β”€ nso
β”‚Β Β  β”œβ”€β”€ nxos
β”‚Β Β  └── ucs
β”œβ”€β”€ cloud
β”‚Β Β  └── common
β”œβ”€β”€ cloudscale_ch
β”‚Β Β  └── cloud
β”œβ”€β”€ community
β”‚Β Β  β”œβ”€β”€ aws
β”‚Β Β  β”œβ”€β”€ azure
β”‚Β Β  β”œβ”€β”€ ciscosmb
β”‚Β Β  β”œβ”€β”€ crypto
β”‚Β Β  β”œβ”€β”€ digitalocean
β”‚Β Β  β”œβ”€β”€ dns
β”‚Β Β  β”œβ”€β”€ docker
β”‚Β Β  β”œβ”€β”€ fortios
β”‚Β Β  β”œβ”€β”€ general
β”‚Β Β  β”œβ”€β”€ google
β”‚Β Β  β”œβ”€β”€ grafana
β”‚Β Β  β”œβ”€β”€ hashi_vault
β”‚Β Β  β”œβ”€β”€ hrobot
β”‚Β Β  β”œβ”€β”€ libvirt
β”‚Β Β  β”œβ”€β”€ mongodb
β”‚Β Β  β”œβ”€β”€ mysql
β”‚Β Β  β”œβ”€β”€ network
β”‚Β Β  β”œβ”€β”€ okd
β”‚Β Β  β”œβ”€β”€ postgresql
β”‚Β Β  β”œβ”€β”€ proxysql
β”‚Β Β  β”œβ”€β”€ rabbitmq
β”‚Β Β  β”œβ”€β”€ routeros
β”‚Β Β  β”œβ”€β”€ sap
β”‚Β Β  β”œβ”€β”€ sap_libs
β”‚Β Β  β”œβ”€β”€ skydive
β”‚Β Β  β”œβ”€β”€ sops
β”‚Β Β  β”œβ”€β”€ vmware
β”‚Β Β  β”œβ”€β”€ windows
β”‚Β Β  └── zabbix
β”œβ”€β”€ containers
β”‚Β Β  └── podman
β”œβ”€β”€ cyberark
β”‚Β Β  β”œβ”€β”€ conjur
β”‚Β Β  └── pas
β”œβ”€β”€ dellemc
β”‚Β Β  β”œβ”€β”€ enterprise_sonic
β”‚Β Β  β”œβ”€β”€ openmanage
β”‚Β Β  β”œβ”€β”€ os10
β”‚Β Β  β”œβ”€β”€ os6
β”‚Β Β  └── os9
β”œβ”€β”€ f5networks
β”‚Β Β  └── f5_modules
β”œβ”€β”€ fortinet
β”‚Β Β  β”œβ”€β”€ fortimanager
β”‚Β Β  └── fortios
β”œβ”€β”€ frr
β”‚Β Β  └── frr
β”œβ”€β”€ gluster
β”‚Β Β  └── gluster
β”œβ”€β”€ google
β”‚Β Β  └── cloud
β”œβ”€β”€ grafana
β”‚Β Β  └── grafana
β”œβ”€β”€ hetzner
β”‚Β Β  └── hcloud
β”œβ”€β”€ hpe
β”‚Β Β  └── nimble
β”œβ”€β”€ ibm
β”‚Β Β  β”œβ”€β”€ qradar
β”‚Β Β  └── spectrum_virtualize
β”œβ”€β”€ infinidat
β”‚Β Β  └── infinibox
β”œβ”€β”€ infoblox
β”‚Β Β  └── nios_modules
β”œβ”€β”€ inspur
β”‚Β Β  β”œβ”€β”€ ispim
β”‚Β Β  └── sm
β”œβ”€β”€ junipernetworks
β”‚Β Β  └── junos
β”œβ”€β”€ kubernetes
β”‚Β Β  └── core
β”œβ”€β”€ lowlydba
β”‚Β Β  └── sqlserver
β”œβ”€β”€ mellanox
β”‚Β Β  └── onyx
β”œβ”€β”€ netapp
β”‚Β Β  β”œβ”€β”€ aws
β”‚Β Β  β”œβ”€β”€ azure
β”‚Β Β  β”œβ”€β”€ cloudmanager
β”‚Β Β  β”œβ”€β”€ elementsw
β”‚Β Β  β”œβ”€β”€ ontap
β”‚Β Β  β”œβ”€β”€ storagegrid
β”‚Β Β  └── um_info
β”œβ”€β”€ netapp_eseries
β”‚Β Β  └── santricity
β”œβ”€β”€ netbox
β”‚Β Β  └── netbox
β”œβ”€β”€ ngine_io
β”‚Β Β  β”œβ”€β”€ cloudstack
β”‚Β Β  β”œβ”€β”€ exoscale
β”‚Β Β  └── vultr
β”œβ”€β”€ openstack
β”‚Β Β  └── cloud
β”œβ”€β”€ openvswitch
β”‚Β Β  └── openvswitch
β”œβ”€β”€ ovirt
β”‚Β Β  └── ovirt
β”œβ”€β”€ purestorage
β”‚Β Β  β”œβ”€β”€ flasharray
β”‚Β Β  β”œβ”€β”€ flashblade
β”‚Β Β  └── fusion
β”œβ”€β”€ sensu
β”‚Β Β  └── sensu_go
β”œβ”€β”€ splunk
β”‚Β Β  └── es
β”œβ”€β”€ theforeman
β”‚Β Β  └── foreman
β”œβ”€β”€ t_systems_mms
β”‚Β Β  └── icinga_director
β”œβ”€β”€ vmware
β”‚Β Β  └── vmware_rest
β”œβ”€β”€ vultr
β”‚Β Β  └── cloud
β”œβ”€β”€ vyos
β”‚Β Β  └── vyos
└── wti
    └── remote

152 directories, 2 files

Inside a collection: community.general

$ tree -L 3 ansible-7.1.0/ansible_collections/community/general
ansible-7.1.0/ansible_collections/community/general/
β”œβ”€β”€ CHANGELOG.rst
β”œβ”€β”€ CHANGELOG.rst.license
β”œβ”€β”€ changelogs
β”‚Β Β  β”œβ”€β”€ changelog.yaml
β”‚Β Β  β”œβ”€β”€ changelog.yaml.license
β”‚Β Β  β”œβ”€β”€ config.yaml
β”‚Β Β  └── fragments
β”œβ”€β”€ commit-rights.md
β”œβ”€β”€ CONTRIBUTING.md
β”œβ”€β”€ COPYING
β”œβ”€β”€ docs
β”‚Β Β  └── docsite
β”‚Β Β      β”œβ”€β”€ extra-docs.yml
β”‚Β Β      β”œβ”€β”€ helper
β”‚Β Β      β”œβ”€β”€ links.yml
β”‚Β Β      └── rst
β”œβ”€β”€ FILES.json
β”œβ”€β”€ LICENSES
β”‚Β Β  β”œβ”€β”€ BSD-2-Clause.txt
β”‚Β Β  β”œβ”€β”€ GPL-3.0-or-later.txt
β”‚Β Β  β”œβ”€β”€ MIT.txt
β”‚Β Β  └── PSF-2.0.txt
β”œβ”€β”€ MANIFEST.json
β”œβ”€β”€ meta
β”‚Β Β  └── runtime.yml
β”œβ”€β”€ plugins
β”‚Β Β  β”œβ”€β”€ action
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iptables_state.py
β”‚Β Β  β”‚Β Β  └── shutdown.py
β”‚Β Β  β”œβ”€β”€ become
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ doas.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dzdo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ksu.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ machinectl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pbrun.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pfexec.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pmrun.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sesu.py
β”‚Β Β  β”‚Β Β  └── sudosu.py
β”‚Β Β  β”œβ”€β”€ cache
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memcached.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pickle.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis.py
β”‚Β Β  β”‚Β Β  └── yaml.py
β”‚Β Β  β”œβ”€β”€ callback
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cgroup_memory_recap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ context_demo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ counter_enabled.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dense.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ diy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ elastic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hipchat.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jabber.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ loganalytics.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logdna.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logentries.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ log_plays.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logstash.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mail.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nrdp.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ null.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opentelemetry.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ say.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ selective.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ slack.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ splunk.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sumologic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ syslog_json.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ unixy.py
β”‚Β Β  β”‚Β Β  └── yaml.py
β”‚Β Β  β”œβ”€β”€ connection
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ chroot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ funcd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iocage.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jail.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ qubes.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ saltstack.py
β”‚Β Β  β”‚Β Β  └── zone.py
β”‚Β Β  β”œβ”€β”€ doc_fragments
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ alicloud.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ attributes.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ auth_basic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitbucket.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dimensiondata.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dimensiondata_wait.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ emc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hpe3par.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_storage.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxca_common.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nomad.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ online.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opennebula.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ openswitch.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle_creatable_resource.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle_display_name_option.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle_name_option.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle_tags.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle_wait_options.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pritunl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ purestorage.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rackspace.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_waitable_resource.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vexata.py
β”‚Β Β  β”‚Β Β  └── xenserver.py
β”‚Β Β  β”œβ”€β”€ filter
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ counter.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ crc32.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dict_kv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dict.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ from_csv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ groupby_as_dict.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hashids_decode.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hashids_encode.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hashids.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ json_query.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lists_mergeby.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ random_mac.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ time.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_days.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_hours.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_milliseconds.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_minutes.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_months.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_seconds.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_time_unit.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_weeks.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ to_years.yml
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ unicode_normalize.py
β”‚Β Β  β”‚Β Β  └── version_sort.py
β”‚Β Β  β”œβ”€β”€ inventory
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cobbler.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_runners.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icinga2.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linode.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nmap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ online.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opennebula.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ stackpath_compute.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ virtualbox.py
β”‚Β Β  β”‚Β Β  └── xen_orchestra.py
β”‚Β Β  β”œβ”€β”€ lookup
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitwarden.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cartesian.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ chef_databag.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ collection_version.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ consul_kv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ credstash.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cyberarkpassword.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dependent.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dig.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dnstxt.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dsv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ etcd3.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ etcd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filetree.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flattened.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hiera.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keyring.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lastpass.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lmdb_kv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manifold.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ onepassword.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ onepassword_raw.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ passwordstore.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ random_pet.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ random_string.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ random_words.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ revbitspss.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ shelvefile.py
β”‚Β Β  β”‚Β Β  └── tss.py
β”‚Β Β  β”œβ”€β”€ modules
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aerospike_migrations.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ airbrake_deployment.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aix_devices.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aix_filesystem.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aix_inittab.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aix_lvg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ aix_lvol.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ alerta_customer.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ali_instance_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ali_instance.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ alternatives.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ansible_galaxy_install.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apache2_mod_proxy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apache2_module.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apk.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apt_repo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apt_rpm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ archive.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ atomic_container.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ atomic_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ atomic_image.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ awall.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ beadm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bearychat.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bigpanda.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitbucket_access_key.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitbucket_pipeline_key_pair.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitbucket_pipeline_known_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bitbucket_pipeline_variable.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bower.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bundler.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ bzr.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ campfire.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ capabilities.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cargo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ catapult.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ circonus_annotation.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cisco_webex.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_aa_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_alert_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_blueprint_package.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_firewall_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_loadbalancer.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_modify_server.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_publicip.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_server.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ clc_server_snapshot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cloudflare_dns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cloud_init_data_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cobbler_sync.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cobbler_system.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ composer.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ consul_acl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ consul_kv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ consul.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ consul_session.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ copr.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cpanm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cronvar.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ crypttab.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ datadog_downtime.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ datadog_event.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ datadog_monitor.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dconf.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ deploy_helper.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dimensiondata_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dimensiondata_vlan.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ discord.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ django_manage.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dnf_versionlock.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dnsimple_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dnsimple.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dnsmadeeasy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dpkg_divert.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ easy_install.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ejabberd_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ elasticsearch_plugin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ emc_vnx_sg_member.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ etcd3.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ facter.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filesize.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filesystem.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flatpak.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flatpak_remote.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flowdock.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gandi_livedns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gconftool2_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gconftool2.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gem.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ git_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_deploy_key.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_issue.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_key.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_release.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_repo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_webhook_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ github_webhook.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_branch.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_deploy_key.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_group_members.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_group_variable.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_hook.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_project_badge.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_project_members.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_project.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_project_variable.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_protected_branch.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_runner.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ grove.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gunicorn.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hana_query.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ haproxy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ heroku_collaborator.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hipchat.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ homebrew_cask.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ homebrew.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ homebrew_tap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ homectl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ honeybadger_deployment.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hpilo_boot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hpilo_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hponcfg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ htpasswd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_ecs_instance.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_evs_disk.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_network_vpc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_smn_topic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_eip.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_peering_connect.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_port.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_private_ip.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_route.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_security_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_security_group_rule.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_vpc_subnet.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_domain.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_host_ports.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_pool.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_vol_map.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_vol.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icinga2_feature.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icinga2_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ idrac_redfish_command.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ idrac_redfish_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ idrac_redfish_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ilo_redfish_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ilo_redfish_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imc_rest.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imgadm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ infinity.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb_database.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb_query.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb_retention_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb_write.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ini_file.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ installp.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ interfaces_file.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_dnsrecord.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_dnszone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_hbacrule.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_hostgroup.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_otpconfig.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_otptoken.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_pwpolicy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_role.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_service.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_subca.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_sudocmdgroup.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_sudocmd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_sudorule.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa_vault.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipify_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipinfoio_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipmi_boot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipmi_power.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ip_netns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iptables_state.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipwcli_dns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ irc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iso_create.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iso_customize.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iso_extract.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jabber.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ java_cert.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ java_keystore.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jboss.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins_build.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins_job_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins_job.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins_plugin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins_script.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jira.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ kernel_blacklist.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_authentication.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_client.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_client_rolemapping.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_clientscope.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_clientsecret_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_clientsecret_regenerate.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_clienttemplate.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_identity_provider.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_realm_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_realm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_role.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_user_federation.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keycloak_user_rolemapping.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keyring_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ keyring.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ kibana_plugin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ launchd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ layman.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lbu.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap_attrs.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap_entry.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap_passwd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap_search.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ librato_annotation.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linode.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linode_v4.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ listen_ports_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lldp.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ locale_gen.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logentries_msg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logentries.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logstash_plugin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lvg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lvol.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxca_cmms.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxca_nodes.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxc_container.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd_container.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd_profile.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd_project.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ macports.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mail.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ make.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_alert_profiles.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_alerts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_policies_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_policies.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_provider.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_tags_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_tags.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_tenant.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mas.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ matrix.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mattermost.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ maven_artifact.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_dns_reload.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_memstore_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_server_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_zone_domain.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_zone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset_zone_record.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mksysb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ modprobe.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ monit.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mqtt.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mssql_db.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mssql_script.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nagios.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ netcup_dns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ newrelic_deployment.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nexmo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nginx_status_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nictagadm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nmcli.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nomad_job_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nomad_job.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nosh.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ npm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ nsupdate.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oci_vcn.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ odbc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ office_365_connector_card.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ohai.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ omapi_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_firewall_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_load_balancer.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_monitoring_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_private_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_public_ip.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone_server.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_image_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_image.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ onepassword_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_service.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_template.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_datacenter_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_enclosure_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_ethernet_network_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_ethernet_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_fc_network_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_fc_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_fcoe_network_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_fcoe_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_logical_interconnect_group_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_logical_interconnect_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_network_set_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_network_set.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_san_manager_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview_san_manager.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ one_vm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ online_server_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ online_user_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ openbsd_pkg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opendj_backendprop.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ open_iscsi.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ openwrt_init.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opkg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ osx_defaults.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ovh_ip_failover.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ovh_ip_loadbalancing_backend.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ovh_monthly_billing.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pacemaker_cluster.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_device.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_ip_subnet.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_project.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_sshkey.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_volume_attachment.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ packet_volume.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pacman_key.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pacman.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pagerduty_alert.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pagerduty_change.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pagerduty.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pagerduty_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pamd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pam_limits.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ parted.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pear.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pids.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pingdom.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pip_package_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pipx_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pipx.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pkg5_publisher.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pkg5.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pkgin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pkgng.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pkgutil.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pmem.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ portage.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ portinstall.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pritunl_org_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pritunl_org.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pritunl_user_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pritunl_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ profitbricks_datacenter.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ profitbricks_nic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ profitbricks.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ profitbricks_volume_attachments.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ profitbricks_volume.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_disk.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_domain_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_group_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_kvm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_nic.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_snap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_storage_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_tasks_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_template.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox_user_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pubnub_blocks.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pulp_repo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ puppet.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pushbullet.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pushover.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ python_requirements_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_cbs_attachments.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_cbs.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_cdb_database.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_cdb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_cdb_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_clb_nodes.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_clb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_clb_ssl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_dns.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_dns_record.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_files_objects.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_files.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_identity.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_keypair.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_meta.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_mon_alarm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_mon_check.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_mon_entity.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_mon_notification_plan.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_mon_notification.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_queue.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_scaling_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax_scaling_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ read_csv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redfish_command.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redfish_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redfish_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redhat_subscription.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis_data_incr.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis_data_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis_data.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rhevm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rhn_channel.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rhn_register.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rhsm_release.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rhsm_repository.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ riak.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rocketchat.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rollbar_deployment.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rpm_ostree_pkg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck_acl_policy.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck_job_executions_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck_job_run.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck_project.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ runit.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sapcar_extract.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sap_task_list_execute.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ say.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_compute_private_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_compute.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container_namespace_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container_namespace.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container_registry_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_container_registry.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_database_backup.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_function_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_function_namespace_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_function_namespace.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_function.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_image_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_ip_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_ip.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_lb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_organization_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_private_network.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_security_group_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_security_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_security_group_rule.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_server_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_snapshot_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_sshkey.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_user_data.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_volume_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway_volume.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sefcontext.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ selinux_permissive.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ selogin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sendgrid.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sensu_check.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sensu_client.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sensu_handler.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sensu_silence.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sensu_subscription.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ seport.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ serverless.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ shutdown.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ slackpkg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ slack.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sl_vm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ smartos_image_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ snap_alias.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ snap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ snmp_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ solaris_zone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sorcery.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ spectrum_device.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ spectrum_model_attrs.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ spotinst_aws_elastigroup.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ss_3par_cpg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ssh_config.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ stackdriver.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ stacki_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ statsd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ statusio_maintenance.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sudoers.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ supervisorctl.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ svc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ svr4pkg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ swdepot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ swupd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ syslogger.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ syspatch.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sysrc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sysupgrade.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ taiga_issue.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ telegram.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ terraform.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ timezone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ twilio.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ typetalk.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ udm_dns_record.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ udm_dns_zone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ udm_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ udm_share.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ udm_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ufw.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ uptimerobot.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ urpmi.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_aaa_group_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_aaa_group.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_ca_host_key_cert_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_ca_host_key_cert.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_dns_host.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_network_interface_address_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_network_interface_address.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_auth_profile.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_exception.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_frontend_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_frontend.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_location_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_proxy_location.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vdo.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vertica_configuration.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vertica_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vertica_role.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vertica_schema.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vertica_user.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vexata_eg.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vexata_volume.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vmadm.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ wakeonlan.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ wdc_redfish_command.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ wdc_redfish_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ webfaction_app.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ webfaction_db.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ webfaction_domain.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ webfaction_mailbox.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ webfaction_site.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xattr.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xbps.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xcc_redfish_command.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xenserver_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xenserver_guest_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xenserver_guest_powerstate.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xenserver_guest.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xfconf_info.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xfconf.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xfs_quota.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xml.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ yarn.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ yum_versionlock.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ zfs_delegate_admin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ zfs_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ zfs.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ znode.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ zpool_facts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ zypper.py
β”‚Β Β  β”‚Β Β  └── zypper_repository.py
β”‚Β Β  β”œβ”€β”€ module_utils
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ alicloud_ecs.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cloud.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cmd_runner.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ csv.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ database.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ deps.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dimensiondata.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gandi_livedns_api.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gconftool2.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gitlab.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ heroku.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hwc_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibm_sa_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ identity
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ilo_redfish_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ influxdb.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipa.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jenkins.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ known_hosts.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ldap.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linode.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lxd.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ manageiq.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ memset.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ mh
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ module_helper.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ _mount.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ net_tools
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneandone.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ onepassword.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oneview.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ online.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ opennebula.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ oracle
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pipx.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ proxmox.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pure.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rax.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redfish_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redhat.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ redis.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ remote_management
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ rundeck.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ saslprep.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaleway.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ source_control
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ storage
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ univention_umc.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ utm_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ version.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ vexata.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ wdc_redfish_utils.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ xenserver.py
β”‚Β Β  β”‚Β Β  └── xfconf.py
β”‚Β Β  └── test
β”‚Β Β      └── a_module.py
β”œβ”€β”€ README.md
└── tests
    β”œβ”€β”€ config.yml
    β”œβ”€β”€ integration
    β”‚Β Β  └── targets
    β”œβ”€β”€ requirements.yml
    β”œβ”€β”€ sanity
    β”‚Β Β  β”œβ”€β”€ extra
    β”‚Β Β  β”œβ”€β”€ ignore-2.11.txt
    β”‚Β Β  β”œβ”€β”€ ignore-2.11.txt.license
    β”‚Β Β  β”œβ”€β”€ ignore-2.12.txt
    β”‚Β Β  β”œβ”€β”€ ignore-2.12.txt.license
    β”‚Β Β  β”œβ”€β”€ ignore-2.13.txt
    β”‚Β Β  β”œβ”€β”€ ignore-2.13.txt.license
    β”‚Β Β  β”œβ”€β”€ ignore-2.14.txt
    β”‚Β Β  β”œβ”€β”€ ignore-2.14.txt.license
    β”‚Β Β  β”œβ”€β”€ ignore-2.15.txt
    β”‚Β Β  └── ignore-2.15.txt.license
    β”œβ”€β”€ unit
    β”‚Β Β  β”œβ”€β”€ compat
    β”‚Β Β  β”œβ”€β”€ mock
    β”‚Β Β  β”œβ”€β”€ plugins
    β”‚Β Β  └── requirements.txt
    └── utils
        β”œβ”€β”€ constraints.txt
        └── shippable

39 directories, 805 files
        

What we need to do

  1. Find out the latest version of a list of collections (within a defined range of versions)
  2. Download them from Ansible galaxy
  3. Create (or update) build and version files
  4. Aggregate release notes and porting guides with upgrade notes about breaking changes
  5. Supply necessary and miscellaneous python and distribution packaging files
  6. Build the package
  7. Test it
  8. Maybe other things, too

... and record Ansible doing that.

Finding versions of included collections

ansible build data
https://github.com/ansible-community/ansible-build-data/blob/main/7/ansible-7.build

Finding versions of included collections

ansible build data
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/setup.yaml

Finding the latest versions

ansible galaxy
https://galaxy.ansible.com/community/general

Finding the latest versions

ansible galaxy api
https://galaxy.ansible.com/api/v2/collections/community/general/

... and downloading them

ansible galaxy api
https://github.com/ansible-community/antsibull/blob/main/src/antsibull/build_ansible_commands.py

Aggregating changelog fragments

changelog fragments
https://github.com/ansible-collections/community.general/tree/main/changelogs/fragments

Aggregating changelog fragments

changelog fragments
https://github.com/ansible-community/ansible-build-data/blob/main/7/CHANGELOG-v7.rst

Aggregating changelog fragments

(Major or breaking changes, deprecations)

porting guide
https://github.com/ansible-community/ansible-build-data/blob/main/7/porting_guide_7.rst

Aggregating changelog fragments

porting guide
https://github.com/ansible-community/antsibull/blob/main/src/antsibull/build_changelog.py

Python packaging files

packaging files
https://github.com/ansible-community/antsibull/tree/main/src/antsibull/data

Building the ansible package

antsibull build
https://github.com/ansible-community/antsibull/blob/main/src/antsibull/build_ansible_commands.py

Building the ansible package wheel

antsibull build wheel
https://github.com/ansible-community/antsibull/blob/main/src/antsibull/build_ansible_commands.py

Pulling it all together (with Ansible)

antsibull role build 1
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/build.yaml

Pulling it all together (with Ansible)

antsibull role build 2
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/build.yaml

Installing ansible with Ansible 😱

packaging tests #1
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/tests.yaml

Testing what gets installed

packaging tests #2
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/tests.yaml

We must go deeper

Testing ansible with ansible-playbook πŸ˜‚

packaging tests #3
https://github.com/ansible-community/antsibull/blob/main/roles/build-release/tasks/tests.yaml

Testing module and collection availability

nested tests #1
https://github.com/ansible-community/antsibull/blob/main/playbooks/nested-ansible-tests.yaml

Testing module and collection availability

nested tests #2
https://github.com/ansible-community/antsibull/blob/main/playbooks/nested-ansible-tests.yaml

By the way: ansible_builtin_runtime.yml

nested tests #1
https://github.com/ansible/ansible/blob/devel/lib/ansible/config/ansible_builtin_runtime.yml

Testing ansible with ansible-playbook running ansible with the ansible repository
🀣

nested tests #2
https://github.com/ansible-community/antsibull/blob/main/playbooks/nested-ansible-tests.yaml

... and then record all that with a parrot

Is this cheating ?

It's not: Ansible is a great abstraction layer for automating workflows and integrating tools together.
ara readme
https://github.com/ansible-community/ara

It records playbooks

ara playbooks
https://demo.recordsansible.org/?path=build-single-release.yaml

It records hosts, tasks, results and files

(and a bunch of other things, too)

Demo !

ara playbook report
https://demo.recordsansible.org/playbooks/3519.html

Getting started

# Install ansible (or ansible-core) with ara (including API server dependencies)
python3 -m pip install --user ansible "ara[server]"

# Configure Ansible to use the ara callback plugin
export ANSIBLE_CALLBACK_PLUGINS="$(python3 -m ara.setup.callback_plugins)"

# Run an Ansible playbook as usual
ansible-playbook hello-world.yml

# Use the CLI to see recorded playbooks
ara playbook list

# Start the development server at http://127.0.0.1:8000
# to query the API or browse recorded results
ara-manage runserver

Getting started (with a server)

# Create a directory for a volume to store settings and a sqlite database
mkdir -p ~/.ara/server

# Start an API server with docker from the image on DockerHub:
docker run --name api-server --detach --tty \
  --volume ~/.ara/server:/opt/ara -p 8000:8000 \
  docker.io/recordsansible/ara-api:latest

# or with podman from the image on quay.io:
podman run --name api-server --detach --tty \
  --volume ~/.ara/server:/opt/ara -p 8000:8000 \
  quay.io/recordsansible/ara-api:latest

Getting started (with a server)

# Install ansible (or ansible-core) with ara (excluding API server dependencies)
python3 -m pip install --user ansible ara

# Configure Ansible to use the ara callback plugin
export ANSIBLE_CALLBACK_PLUGINS="$(python3 -m ara.setup.callback_plugins)"

# Set up the ara callback to know where the API server is located
export ARA_API_CLIENT="http"
export ARA_API_SERVER="http://127.0.0.1:8000"

# Run an Ansible playbook as usual
ansible-playbook playbook.yaml

# Use the CLI to see recorded playbooks
ara playbook list

# Browse http://127.0.0.1:8000 (running from the container)
# to view the reporting interface

Want to know more ?

Thank You!

Any questions?

Come chat with the community:

Reach out: