016 Multiple inventory constructed

This example extends 015 Multiple inventory caches.

Use case

Create inventory groups using the inventory plugin ansible.builtin.constructed after loading the two inventory vbotka.freebsd.iocage configuration files.

Tree

shell> tree .
.
├── ansible.cfg
├── hosts
│   ├── 02_iocage.yml
│   ├── 04_iocage.yml
│   └── 99_constructed.yml
└── pb-test.yml

Synopsis

  • The inventory vbotka.freebsd.iocage retrieves the jails:

    • test_111:113 from host iocage_02

    • test_131:133 from host iocage_04

    and creates the inventory groups test_02 and test_04.

  • The inventory plugin ansible.builtin.constructed creates the inventory groups:

    • test comprising hosts whose names start with 'test'

    • test_up comprising running hosts whose names start with 'test'

Requirements

Notes

Jails on iocage_02

[iocage_02]# iocage list -l
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+
| JID  |      NAME      | BOOT | STATE | TYPE |     RELEASE     |        IP4        | IP6 |    TEMPLATE    | BASEJAIL |
+======+================+======+=======+======+=================+===================+=====+================+==========+
| None | ansible_client | off  | down  | jail | 14.3-RELEASE-p8 | em0|10.1.0.199/24 | -   | -              | yes      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+
| None | test_111       | off  | down  | jail | 14.3-RELEASE-p8 | em0|10.1.0.111/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+
| None | test_112       | off  | down  | jail | 14.3-RELEASE-p8 | em0|10.1.0.112/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+
| None | test_113       | off  | down  | jail | 14.3-RELEASE-p8 | em0|10.1.0.113/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+

Jails on iocage_04

[iocage_04]# iocage list -l
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| JID  |      NAME      | BOOT | STATE | TYPE |     RELEASE     |         IP4         | IP6 |    TEMPLATE    | BASEJAIL |
+======+================+======+=======+======+=================+=====================+=====+================+==========+
| None | ansible_client | off  | down  | jail | 15.0-RELEASE-p3 | vnet0|10.1.0.198/24 | -   | -              | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_131       | off  | down  | jail | 15.0-RELEASE-p3 | vnet0|10.1.0.131/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_132       | off  | down  | jail | 15.0-RELEASE-p3 | vnet0|10.1.0.132/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_133       | off  | down  | jail | 15.0-RELEASE-p3 | vnet0|10.1.0.133/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+

ansible.cfg

[defaults]
callback_result_format = yaml
display_skipped_hosts = False
gathering = explicit
host_key_checking = false
interpreter_python = auto_silent
log_path = /var/log/ansible.log
deprecation_warnings = False

[connection]
pipelining = true

hosts

hosts/02_iocage.yml
plugin: vbotka.freebsd.iocage
host: 10.1.0.73
user: admin
sudo: true
sudo_preserve_env: true
env:
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
compose:
  ansible_host: iocage_ip4
groups:
  test_02: inventory_hostname.startswith('test')
hosts/04_iocage.yml
plugin: vbotka.freebsd.iocage
host: 10.1.0.29
user: admin
sudo: true
compose:
  ansible_host: iocage_ip4
groups:
  test_04: inventory_hostname.startswith('test')
hosts/99_constructed.yml
plugin: ansible.builtin.constructed
groups:
    test: inventory_hostname.startswith('test')
    test_up: inventory_hostname.startswith('test') and iocage_state == 'up'

Playbook pb-test.yml

- hosts: test

  tasks:

    - debug:
        var: iocage_ip4

    - debug:
        msg: |
          {% for group in groups %}
          {{ group }}: {{ groups[group] }}
          {% endfor %}
      run_once: true

Playbook output - Display groups

(env) > ansible-playbook -i hosts pb-test.yml
PLAY [test] ********************************************************************

TASK [debug] *******************************************************************
ok: [test_111] => 
    iocage_ip4: 10.1.0.111
ok: [test_112] => 
    iocage_ip4: 10.1.0.112
ok: [test_113] => 
    iocage_ip4: 10.1.0.113
ok: [test_131] => 
    iocage_ip4: 10.1.0.131
ok: [test_132] => 
    iocage_ip4: 10.1.0.132
ok: [test_133] => 
    iocage_ip4: 10.1.0.133

TASK [debug] *******************************************************************
ok: [test_111] => 
    msg: |-
        all: ['ansible_client', 'test_111', 'test_112', 'test_113', 'test_131', 'test_132', 'test_133']
        ungrouped: ['ansible_client']
        test_02: ['test_111', 'test_112', 'test_113']
        test_04: ['test_131', 'test_132', 'test_133']
        test: ['test_111', 'test_112', 'test_113', 'test_131', 'test_132', 'test_133']

PLAY RECAP *********************************************************************
test_111                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_112                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_113                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_131                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_132                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_133                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0