312 Clone jails and create inventory (role)

Use case

Fetch releases, create basejails, clone from the basejails, and start the jails. Create and display the inventory. Use the role vbotka.freebsd.iocage instead of the Plugins.

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

  • 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

Configuration ansible.cfg

[defaults]
gathering = explicit
callback_result_format = yaml

[connection]
pipelining = true

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
ansible_become_password: admin

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