020 Clone jails and create inventory (role)

Tree

shell> tree .
.
├── ansible.cfg
├── host_vars
│   ├── iocage_01
│   │   └── iocage.yml
│   └── iocage_02
│       └── iocage.yml
├── iocage-hosts.ini
├── pb-iocage-fetch-base-clone.yml
├── pb-iocage-list.yml
└── pb-test-01.yml

Synopsis

This example demonstrates a functionality similar to that of 010 Clone jails and create inventory (plugins). But, the role vbotka.freebsd.iocage is used instead of the plugins.

  • On two iocage hosts:

    • iocage_01

    • iocage_02

    In the playbook pb-iocage-fetch-base-clone.yml, use the role vbotka.freebsd.iocage to:

    • fetch the release

    • create basejail

    • clone 3 jails from the basejail.

    In the playbook pb-iocage-list.yml, use the role vbotka.freebsd.iocage to:

    • create the lists of bases and jails

    • optionally display the lists.

    In the playbook pb-test-01.yml:

    • create the inventory group test and compose variables

    • display the hosts and composed variables in the group test

    • display all groups.

Requirements

Notes

Inventory iocage-hosts.ini

iocage_01 ansible_host=10.1.0.18
iocage_02 ansible_host=10.1.0.73

[iocage]
iocage_01
iocage_02

[iocage:vars]
ansible_user=admin
ansible_become=true

host_vars/iocage_01/iocage.yml

ansible_python_interpreter: /usr/local/bin/python3.9

freebsd_iocage_pool: pool2
freebsd_iocage_pool_mount: /mnt/pool2
freebsd_iocage_mount: "{{ freebsd_iocage_pool_mount }}/iocage"

properties:
  vnet: 'on'
  defaultrouter: 10.1.0.10
  notes: "vmm={{ inventory_hostname }}"

fetch:
  - 13.3-RELEASE
  - 13.4-RELEASE

basejails:
  - name: ansible_client
    release: 13.4-RELEASE
    properties:
      ip4_addr: 'vnet0|10.1.0.198/24'

clones:
  - name: test_101
    clone_from: ansible_client
    properties:
      ip4_addr: 'vnet0|10.1.0.101/24'
  - name: test_102
    clone_from: ansible_client
    properties:
      ip4_addr: 'vnet0|10.1.0.102/24'
  - name: test_103
    clone_from: ansible_client
    properties:
      ip4_addr: 'vnet0|10.1.0.103/24'

start:
  - test_103

host_vars/iocage_02/iocage.yml

ansible_python_interpreter: /usr/local/bin/python3.11

freebsd_iocage_runner_env:
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1

freebsd_iocage_pool: zroot
freebsd_iocage_pool_mount: /zroot
freebsd_iocage_mount: "{{ freebsd_iocage_pool_mount }}/iocage"

properties:
  notes: "vmm={{ inventory_hostname }}"

fetch:
  - 14.1-RELEASE

basejails:
  - name: ansible_client
    release: 14.1-RELEASE
    properties:
      ip4_addr: 'em0|10.1.0.199/24'

clones:
  - name: test_111
    clone_from: ansible_client
    properties:
      ip4_addr: 'em0|10.1.0.111/24'
  - name: test_112
    clone_from: ansible_client
    properties:
      ip4_addr: 'em0|10.1.0.112/24'
  - name: test_113
    clone_from: ansible_client
    properties:
      ip4_addr: 'em0|10.1.0.113/24'

start:
  - test_113

Playbook pb-iocage-fetch-base-clone.yml

- hosts: iocage

  vars:

    freebsd_iocage_runner_exec: "fetch,create,clone"
    freebsd_iocage_runner_cmd: |
      {% filter from_yaml %}
      fetch:
      {% for release in fetch %}
      - cmd: iocage fetch --release {{ release }}
        creates: {{ freebsd_iocage_mount }}/releases/{{ release }}
      {% endfor %}
      create:
      {% for jail in basejails %}
      - cmd: iocage create --release {{ jail.release }} --name {{ jail.name }}
        creates: {{ freebsd_iocage_mount }}/jails/{{ jail.name }}
      {% endfor %}
      {% for jail in basejails %}
      {% for k, v in (properties | combine(jail.properties)).items() %}
      - cmd: iocage set {{ k }}={{ v }} {{ jail.name }}
      {% endfor %}
      {% endfor %}
      clone:
      {% for jail in clones %}
      - cmd: iocage clone {{ jail.clone_from }} --name {{ jail.name }}
        creates: {{ freebsd_iocage_mount }}/jails/{{ jail.name }}
      {% endfor %}
      {% for jail in clones %}
      {% for k, v in (properties | combine(jail.properties)).items() %}
      - cmd: iocage set {{ k }}={{ v }} {{ jail.name }}
      {% endfor %}
      {% endfor %}
      {% endfilter %}

  tasks:

    - name: Debug
      when: debug | d(false) | bool
      tags: debug
      ansible.builtin.debug:
        msg: |
          freebsd_iocage_runner_exec: {{ freebsd_iocage_runner_exec }}
          freebsd_iocage_runner_cmd:
            {{ freebsd_iocage_runner_cmd | to_nice_yaml(indent=2) | indent(2) }}

    - name: Fetch releases, create jails, and clone jails.
      tags: runner
      block:

        - name: Run commands
          register: out
          ansible.builtin.import_role:
            name: vbotka.freebsd.iocage
            tasks_from: runner.yml

        - name: Debug
          when: debug2 | d(false) | bool
          ansible.builtin.debug:
            var: out

Playbook debug output

(env) > ansible-playbook pb-iocage-fetch-base-clone.yml -i iocage-hosts.ini \
                                                        -t debug \
							-e debug=true

PLAY [iocage] ******************************************************************

TASK [Debug] *******************************************************************
ok: [iocage_01] => 
  msg: |-
    freebsd_iocage_runner_exec: fetch,create,clone
    freebsd_iocage_runner_cmd:
      clone:
      - cmd: iocage clone ansible_client --name test_101
        creates: /mnt/pool2/iocage/jails/test_101
      - cmd: iocage clone ansible_client --name test_102
        creates: /mnt/pool2/iocage/jails/test_102
      - cmd: iocage clone ansible_client --name test_103
        creates: /mnt/pool2/iocage/jails/test_103
      - cmd: iocage set vnet=on test_101
      - cmd: iocage set defaultrouter=10.1.0.10 test_101
      - cmd: iocage set notes=vmm=iocage_01 test_101
      - cmd: iocage set ip4_addr=vnet0|10.1.0.101/24 test_101
      - cmd: iocage set vnet=on test_102
      - cmd: iocage set defaultrouter=10.1.0.10 test_102
      - cmd: iocage set notes=vmm=iocage_01 test_102
      - cmd: iocage set ip4_addr=vnet0|10.1.0.102/24 test_102
      - cmd: iocage set vnet=on test_103
      - cmd: iocage set defaultrouter=10.1.0.10 test_103
      - cmd: iocage set notes=vmm=iocage_01 test_103
      - cmd: iocage set ip4_addr=vnet0|10.1.0.103/24 test_103
      create:
      - cmd: iocage create --release 13.4-RELEASE --name ansible_client
        creates: /mnt/pool2/iocage/jails/ansible_client
      - cmd: iocage set vnet=on ansible_client
      - cmd: iocage set defaultrouter=10.1.0.10 ansible_client
      - cmd: iocage set notes=vmm=iocage_01 ansible_client
      - cmd: iocage set ip4_addr=vnet0|10.1.0.198/24 ansible_client
      fetch:
      - cmd: iocage fetch --release 13.3-RELEASE
        creates: /mnt/pool2/iocage/releases/13.3-RELEASE
      - cmd: iocage fetch --release 13.4-RELEASE
        creates: /mnt/pool2/iocage/releases/13.4-RELEASE
ok: [iocage_02] => 
  msg: |-
    freebsd_iocage_runner_exec: fetch,create,clone
    freebsd_iocage_runner_cmd:
      clone:
      - cmd: iocage clone ansible_client --name test_111
        creates: /zroot/iocage/jails/test_111
      - cmd: iocage clone ansible_client --name test_112
        creates: /zroot/iocage/jails/test_112
      - cmd: iocage clone ansible_client --name test_113
        creates: /zroot/iocage/jails/test_113
      - cmd: iocage set notes=vmm=iocage_02 test_111
      - cmd: iocage set ip4_addr=em0|10.1.0.111/24 test_111
      - cmd: iocage set notes=vmm=iocage_02 test_112
      - cmd: iocage set ip4_addr=em0|10.1.0.112/24 test_112
      - cmd: iocage set notes=vmm=iocage_02 test_113
      - cmd: iocage set ip4_addr=em0|10.1.0.113/24 test_113
      create:
      - cmd: iocage create --release 14.1-RELEASE --name ansible_client
        creates: /zroot/iocage/jails/ansible_client
      - cmd: iocage set notes=vmm=iocage_02 ansible_client
      - cmd: iocage set ip4_addr=em0|10.1.0.199/24 ansible_client
      fetch:
      - cmd: iocage fetch --release 14.1-RELEASE
        creates: /zroot/iocage/releases/14.1-RELEASE

PLAY RECAP *********************************************************************
iocage_01: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
iocage_02: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Playbook runner output

(env) > ansible-playbook pb-iocage-fetch-base-clone.yml -i iocage-hosts.ini \
                                                        -t runner

PLAY [iocage] ******************************************************************

TASK [vbotka.freebsd.iocage : Runner: Debug. freebsd_iocage_debug=False] *******
skipping: [iocage_01]
skipping: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are available.] ******
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are iocage.] *********
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Run listed commands.] ********************
ok: [iocage_01] => (item=iocage fetch --release 13.3-RELEASE)
ok: [iocage_02] => (item=iocage fetch --release 14.1-RELEASE)
ok: [iocage_01] => (item=iocage fetch --release 13.4-RELEASE)
ok: [iocage_02] => (item=iocage create --release 14.1-RELEASE --name ansible_client)
ok: [iocage_01] => (item=iocage create --release 13.4-RELEASE --name ansible_client)
changed: [iocage_01] => (item=iocage set vnet=on ansible_client)
changed: [iocage_01] => (item=iocage set defaultrouter=10.1.0.10 ansible_client)
changed: [iocage_02] => (item=iocage set notes=vmm=iocage_02 ansible_client)
changed: [iocage_01] => (item=iocage set notes=vmm=iocage_01 ansible_client)
changed: [iocage_01] => (item=iocage set ip4_addr=vnet0|10.1.0.198/24 ansible_client)
ok: [iocage_01] => (item=iocage clone ansible_client --name test_101)
changed: [iocage_02] => (item=iocage set ip4_addr=em0|10.1.0.199/24 ansible_client)
ok: [iocage_01] => (item=iocage clone ansible_client --name test_102)
ok: [iocage_02] => (item=iocage clone ansible_client --name test_111)
ok: [iocage_01] => (item=iocage clone ansible_client --name test_103)
ok: [iocage_02] => (item=iocage clone ansible_client --name test_112)
ok: [iocage_02] => (item=iocage clone ansible_client --name test_113)
changed: [iocage_01] => (item=iocage set vnet=on test_101)
changed: [iocage_01] => (item=iocage set defaultrouter=10.1.0.10 test_101)
changed: [iocage_02] => (item=iocage set notes=vmm=iocage_02 test_111)
changed: [iocage_01] => (item=iocage set notes=vmm=iocage_01 test_101)
changed: [iocage_01] => (item=iocage set ip4_addr=vnet0|10.1.0.101/24 test_101)
changed: [iocage_01] => (item=iocage set vnet=on test_102)
changed: [iocage_02] => (item=iocage set ip4_addr=em0|10.1.0.111/24 test_111)
changed: [iocage_01] => (item=iocage set defaultrouter=10.1.0.10 test_102)
changed: [iocage_01] => (item=iocage set notes=vmm=iocage_01 test_102)
changed: [iocage_02] => (item=iocage set notes=vmm=iocage_02 test_112)
changed: [iocage_01] => (item=iocage set ip4_addr=vnet0|10.1.0.102/24 test_102)
changed: [iocage_01] => (item=iocage set vnet=on test_103)
changed: [iocage_02] => (item=iocage set ip4_addr=em0|10.1.0.112/24 test_112)
changed: [iocage_01] => (item=iocage set defaultrouter=10.1.0.10 test_103)
changed: [iocage_01] => (item=iocage set notes=vmm=iocage_01 test_103)
changed: [iocage_02] => (item=iocage set notes=vmm=iocage_02 test_113)
changed: [iocage_01] => (item=iocage set ip4_addr=vnet0|10.1.0.103/24 test_103)
changed: [iocage_02] => (item=iocage set ip4_addr=em0|10.1.0.113/24 test_113)

TASK [vbotka.freebsd.iocage : Runner: Debug run listed commands. freebsd_iocage_debug=False] ***
skipping: [iocage_01]
skipping: [iocage_02]

TASK [Debug] *******************************************************************
skipping: [iocage_01]
skipping: [iocage_02]

PLAY RECAP *********************************************************************
iocage_01: ok=3    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   
iocage_02: ok=3    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   

Note

The commands “iocage set …” are not idempotent.

Hint

See the log on the remote host

$ tail -f /var/log/iocage.log

List all jails at iocage_01

[iocage_01]# iocage list -l
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| JID  |      NAME      | BOOT | STATE | TYPE |     RELEASE     |         IP4         | IP6 |    TEMPLATE    | BASEJAIL |
+======+================+======+=======+======+=================+=====================+=====+================+==========+
| None | ansible_client | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.198/24 | -   | -              | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_101       | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.101/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_102       | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.102/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| None | test_103       | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.103/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+

List all jails at iocage_02

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

Playbook pb-iocage-list.yml

- hosts: iocage

  vars:

    jail_attr: [jid, name, boot, state, type, release, ip4, ip6, template, basejail]

  tasks:

    - name: Run commands
      tags: runner
      ansible.builtin.import_role:
        name: vbotka.freebsd.iocage
        tasks_from: runner.yml
      vars:
        freebsd_iocage_runner_exec: lists
        freebsd_iocage_runner_cmd:
          lists:
            - cmd: iocage list -rh
            - cmd: iocage list -lh
            - cmd: iocage list -Ph
            - cmd: iocage list -th

    - name: Debug
      when: debug2 | d(false) | bool
      ansible.builtin.debug:
        var: out

    - name: Set lists
      ansible.builtin.set_fact:
        iocage_releases: "{{ out.results.0.stdout.splitlines() }}"
        iocage_jails: "{{ dict(out.results.1.stdout.splitlines()
                               | map('split', '\t')
                               | map('zip', jail_attr)
                               | map('map', 'reverse')
                               | map('community.general.dict')
                               | json_query('[].[name, @]')) }}"

    - name: Display lists
      when: debug | d(false) | bool
      ansible.builtin.debug:
        msg: |-
          iocage_releases: {{ iocage_releases }}
          iocage_jails:
            {{ iocage_jails | to_nice_yaml(indent=2) | indent(2) }}
#         iocage_plugins: {{ iocage_plugins }}
#         iocage_templates: {{ iocage_templates }}

Playbook output

(env) > ansible-playbook pb-iocage-list.yml -i iocage-hosts.ini -e debug=true

PLAY [iocage] ******************************************************************

TASK [vbotka.freebsd.iocage : Runner: Debug. freebsd_iocage_debug=False] *******
skipping: [iocage_01]
skipping: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are available.] ******
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are iocage.] *********
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Run listed commands.] ********************
changed: [iocage_01] => (item=iocage list -rh)
changed: [iocage_01] => (item=iocage list -lh)
changed: [iocage_02] => (item=iocage list -rh)
changed: [iocage_01] => (item=iocage list -Ph)
changed: [iocage_01] => (item=iocage list -th)
changed: [iocage_02] => (item=iocage list -lh)
changed: [iocage_02] => (item=iocage list -Ph)
changed: [iocage_02] => (item=iocage list -th)

TASK [vbotka.freebsd.iocage : Runner: Debug run listed commands. freebsd_iocage_debug=False] ***
skipping: [iocage_01]
skipping: [iocage_02]

TASK [Debug] *******************************************************************
skipping: [iocage_01]
skipping: [iocage_02]

TASK [Set lists] ***************************************************************
ok: [iocage_01]
ok: [iocage_02]

TASK [Display lists] ***********************************************************
ok: [iocage_01] => 
  msg: |-
    iocage_releases: ['13.3-RELEASE', '13.4-RELEASE']
    iocage_jails:
      ansible_client:
        basejail: 'yes'
        boot: 'off'
        ip4: vnet0|10.1.0.198/24
        ip6: '-'
        jid: '-'
        name: ansible_client
        release: 13.4-RELEASE-p2
        state: down
        template: '-'
        type: jail
      test_101:
        basejail: 'yes'
        boot: 'off'
        ip4: vnet0|10.1.0.101/24
        ip6: '-'
        jid: '-'
        name: test_101
        release: 13.4-RELEASE-p2
        state: down
        template: ansible_client
        type: jail
      test_102:
        basejail: 'yes'
        boot: 'off'
        ip4: vnet0|10.1.0.102/24
        ip6: '-'
        jid: '-'
        name: test_102
        release: 13.4-RELEASE-p2
        state: down
        template: ansible_client
        type: jail
      test_103:
        basejail: 'yes'
        boot: 'off'
        ip4: vnet0|10.1.0.103/24
        ip6: '-'
        jid: '-'
        name: test_103
        release: 13.4-RELEASE-p2
        state: down
        template: ansible_client
        type: jail
ok: [iocage_02] => 
  msg: |-
    iocage_releases: ['14.1-RELEASE']
    iocage_jails:
      ansible_client:
        basejail: 'yes'
        boot: 'off'
        ip4: em0|10.1.0.199/24
        ip6: '-'
        jid: None
        name: ansible_client
        release: 14.1-RELEASE-p6
        state: down
        template: '-'
        type: jail
      test_111:
        basejail: 'yes'
        boot: 'off'
        ip4: em0|10.1.0.111/24
        ip6: '-'
        jid: None
        name: test_111
        release: 14.1-RELEASE-p6
        state: down
        template: ansible_client
        type: jail
      test_112:
        basejail: 'yes'
        boot: 'off'
        ip4: em0|10.1.0.112/24
        ip6: '-'
        jid: None
        name: test_112
        release: 14.1-RELEASE-p6
        state: down
        template: ansible_client
        type: jail
      test_113:
        basejail: 'yes'
        boot: 'off'
        ip4: em0|10.1.0.113/24
        ip6: '-'
        jid: None
        name: test_113
        release: 14.1-RELEASE-p6
        state: down
        template: ansible_client
        type: jail

PLAY RECAP *********************************************************************
iocage_01: ok=5    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   
iocage_02: ok=5    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   

Playbook pb-test-01.yml

- name: Create lists
  import_playbook: pb-iocage-list.yml

- name: Create group test
  hosts: iocage

  vars:

    jails: "{{ hostvars | json_query('*.iocage_jails') | combine }}"

  tasks:

    - name: Create inventory group test
      run_once: true
      block:

        - name: Debug
          when: debug | d(false) | bool
          ansible.builtin.debug:
            var: jails

        - name: Create inventory group test
          ansible.builtin.add_host:
            groups: test
            name: "{{ item }}"
            ansible_host: "{{ jails[item].ip4 | split('|') | last
                                              | split('/') | first }}"
            release:  "{{ jails[item].release }}"
          loop: "{{ jails.keys() | select('match', 'test') }}"
  
- name: Use group test
  hosts: test

  tasks:

    - debug:
        msg: |
          inventory_hostname: {{ inventory_hostname }}
          ansible_host: {{ ansible_host }}
          release: {{ release }}

    - debug:
        msg: |
          groups:
            {{ groups | to_yaml(indent=2) | indent(2) }}
      run_once: true

Playbook output

(env) > ansible-playbook pb-test-01.yml -i iocage-hosts.ini

PLAY [iocage] ******************************************************************

TASK [vbotka.freebsd.iocage : Runner: Debug. freebsd_iocage_debug=False] *******
skipping: [iocage_01]
skipping: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are available.] ******
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Assert all commands are iocage.] *********
ok: [iocage_01]
ok: [iocage_02]

TASK [vbotka.freebsd.iocage : Runner: Run listed commands.] ********************
changed: [iocage_01] => (item=iocage list -rh)
changed: [iocage_01] => (item=iocage list -lh)
changed: [iocage_02] => (item=iocage list -rh)
changed: [iocage_01] => (item=iocage list -Ph)
changed: [iocage_01] => (item=iocage list -th)
changed: [iocage_02] => (item=iocage list -lh)
changed: [iocage_02] => (item=iocage list -Ph)
changed: [iocage_02] => (item=iocage list -th)

TASK [vbotka.freebsd.iocage : Runner: Debug run listed commands. freebsd_iocage_debug=False] ***
skipping: [iocage_01]
skipping: [iocage_02]

TASK [Debug] *******************************************************************
skipping: [iocage_01]
skipping: [iocage_02]

TASK [Set lists] ***************************************************************
ok: [iocage_01]
ok: [iocage_02]

TASK [Display lists] ***********************************************************
skipping: [iocage_01]
skipping: [iocage_02]

PLAY [Create group test] *******************************************************

TASK [Debug] *******************************************************************
skipping: [iocage_01]

TASK [Create inventory group test] *********************************************
changed: [iocage_01] => (item=test_101)
changed: [iocage_01] => (item=test_102)
changed: [iocage_01] => (item=test_103)
changed: [iocage_01] => (item=test_111)
changed: [iocage_01] => (item=test_112)
changed: [iocage_01] => (item=test_113)

PLAY [Use group test] **********************************************************

TASK [debug] *******************************************************************
ok: [test_101] => 
  msg: |-
    inventory_hostname: test_101
    ansible_host: 10.1.0.101
    release: 13.4-RELEASE-p2
ok: [test_102] => 
  msg: |-
    inventory_hostname: test_102
    ansible_host: 10.1.0.102
    release: 13.4-RELEASE-p2
ok: [test_103] => 
  msg: |-
    inventory_hostname: test_103
    ansible_host: 10.1.0.103
    release: 13.4-RELEASE-p2
ok: [test_111] => 
  msg: |-
    inventory_hostname: test_111
    ansible_host: 10.1.0.111
    release: 14.1-RELEASE-p6
ok: [test_112] => 
  msg: |-
    inventory_hostname: test_112
    ansible_host: 10.1.0.112
    release: 14.1-RELEASE-p6
ok: [test_113] => 
  msg: |-
    inventory_hostname: test_113
    ansible_host: 10.1.0.113
    release: 14.1-RELEASE-p6

TASK [debug] *******************************************************************
ok: [test_101] => 
  msg: |-
    groups:
      all: [test_101, test_102, test_103, test_111, test_112, test_113, iocage_01, iocage_02]
      iocage: [iocage_01, iocage_02]
      test: [test_101, test_102, test_103, test_111, test_112, test_113]
      ungrouped: []

PLAY RECAP *********************************************************************
iocage_01: ok=5    changed=2    unreachable=0    failed=0    skipped=5    rescued=0    ignored=0   
iocage_02: ok=4    changed=1    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
test_101 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_102 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_103 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_111 : ok=1    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