010 Clone basejails and create inventory

Use case

Fetch releases, create basejails, clone jails from the basejails, and start the jails. Use the inventory plugin vbotka.freebsd.iocage to create the inventory. Display the created inventory.

Tree

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

Synopsis

  • At two managed nodes:

    • iocage_02

    • iocage_04

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

    • fetch the release

    • create basejail

    • clone 3 jails from the basejail

    • start 1 jail

    • display lists of bases, plugins, templates, and jails.

  • At the managed node iocage_04

    In the playbook pb-test.yml, use the inventory plugin vbotka.freebsd.iocage to:

    • create the inventory groups and compose variables

    • display the hosts and composed variables in the group test

    • display all created groups.

Requirements

Notes

The fetching of a release is a quite time-consuming process. Optionally, fetch the releases manually before you run the play. For example,

[iocage_02]# iocage fetch
[0] 13.4-RELEASE
[1] 13.5-RELEASE
[2] 14.1-RELEASE (EOL)
[3] 14.2-RELEASE

Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (14.2-RELEASE)
Type EXIT to quit: 3
Fetching: 14.2-RELEASE

Extracting: base.txz...
Extracting: lib32.txz...
Extracting: src.txz...

* Updating 14.2-RELEASE to the latest patch level...
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 14.2-RELEASE from update2.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.
The following files will be removed as part of updating to
14.2-RELEASE-p3:
/etc/ssl/certs/08063a00.0
/etc/ssl/certs/18856ac4.0
/etc/ssl/certs/57bcb2da.0
...

ansible.cfg

[defaults]
gathering = explicit
callback_result_format = yaml
display_skipped_hosts = false

[connection]
pipelining = true

Inventory iocage.ini

iocage_02 ansible_host=10.1.0.73
iocage_04 ansible_host=10.1.0.29

[iocage]
iocage_02
iocage_04

[iocage:vars]
ansible_user=admin
ansible_become=true
ansible_python_interpreter=auto_silent

host_vars

host_vars/iocage_02/iocage.yml
fetch:
  - 14.3-RELEASE

basejails:
  - name: ansible_client
    release: 14.3-RELEASE

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

iocage_env:
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
host_vars/iocage_04/iocage.yml
fetch:
  - 15.0-RELEASE

basejails:
  - name: ansible_client
    release: 15.0-RELEASE

clones:
  - name: test_131
    clone_from: ansible_client
    properties:
      vnet: 'on'
      defaultrouter: 10.1.0.10
      ip4_addr: 'vnet0|10.1.0.131/24'
  - name: test_132
    clone_from: ansible_client
    properties:
      vnet: 'on'
      defaultrouter: 10.1.0.10
      ip4_addr: 'vnet0|10.1.0.132/24'
  - name: test_133
    clone_from: ansible_client
    properties:
      vnet: 'on'
      defaultrouter: 10.1.0.10
      ip4_addr: 'vnet0|10.1.0.133/24'

start:
  - test_133

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

- name: Iocage fetch releases, create basejail, clone and start jails.
  hosts: iocage
  environment: "{{ iocage_env | d({}) }}"

  tasks:

    - name: Fetch releases
      tags: fetch
      vbotka.freebsd.iocage:
        release: "{{ item }}"
      loop: "{{ fetch }}"

    - name: Create basejail
      tags: create
      vbotka.freebsd.iocage:
        state: basejail
        name: "{{ item.name }}"
        release: "{{ item.release }}"
        properties: "{{ item.properties | d(omit) }}"
      loop: "{{ basejails }}"
      loop_control:
        label: "{{ item.name }} {{ item.release }}"

    - name: Clone from basejail
      tags: clone
      vbotka.freebsd.iocage:
        state: cloned
        clone_from: "{{ item.clone_from }}"
        name: "{{ item.name }}"
        properties: "{{ item.properties | d(omit) }}"
      loop: "{{ clones }}"
      loop_control:
        label: "{{ item.name }} {{ item.clone_from }}"

    - name: Start clones
      tags: start
      vbotka.freebsd.iocage:
        state: started
        name: "{{ item }}"
      loop: "{{ start }}"

    - name: Display iocage_*
      tags: debug
      block:

        - name: Create Ansible facts iocage_*
          vbotka.freebsd.iocage:

        - name: Display lists of bases, plugins, templates, and jails.
          debug:
            msg: |-
              {{ ansible_facts.iocage_releases }}
              {{ ansible_facts.iocage_plugins.keys() | list }}
              {{ ansible_facts.iocage_templates.keys() | list }}
              {{ ansible_facts.iocage_jails.keys() | list }}

Playbook output - fetch, create, clone, and start

(env) > ansible-playbook pb-iocage-fetch-base-clone-list.yml -i iocage.ini
PLAY [Iocage fetch releases, create basejail, clone and start jails.] **********

TASK [Fetch releases] **********************************************************
ok: [iocage_04] => (item=15.0-RELEASE)
ok: [iocage_02] => (item=14.3-RELEASE)

TASK [Create basejail] *********************************************************
changed: [iocage_04] => (item=ansible_client 15.0-RELEASE)
changed: [iocage_02] => (item=ansible_client 14.3-RELEASE)

TASK [Clone from basejail] *****************************************************
changed: [iocage_04] => (item=test_131 ansible_client)
changed: [iocage_04] => (item=test_132 ansible_client)
changed: [iocage_04] => (item=test_133 ansible_client)
changed: [iocage_02] => (item=test_111 ansible_client)
changed: [iocage_02] => (item=test_112 ansible_client)
changed: [iocage_02] => (item=test_113 ansible_client)

TASK [Start clones] ************************************************************
changed: [iocage_04] => (item=test_133)
changed: [iocage_02] => (item=test_113)

TASK [Create Ansible facts iocage_*] *******************************************
ok: [iocage_04]
ok: [iocage_02]

TASK [Display lists of bases, plugins, templates, and jails.] ******************
ok: [iocage_02] => 
    msg: |-
        ['14.2-RELEASE', '14.3-RELEASE']
        []
        []
        ['ansible_client', 'test_111', 'test_112', 'test_113']
ok: [iocage_04] => 
    msg: |-
        ['14.3-RELEASE', '15.0-RELEASE']
        []
        ['ansible_client_apache', 'ansible_client_pull']
        ['ansible_client', 'test_131', 'test_132', 'test_133']

PLAY RECAP *********************************************************************
iocage_02                  : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
iocage_04                  : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

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.3-RELEASE-p8 | -                 | -   | -              | 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      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+
| 66   | test_113       | off  | up    | jail | 14.3-RELEASE-p8 | em0|10.1.0.113/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+-------------------+-----+----------------+----------+

Jails at 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 | -                   | -   | -              | 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      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+
| 45   | test_133       | off  | up    | jail | 15.0-RELEASE-p3 | vnet0|10.1.0.133/24 | -   | ansible_client | yes      |
+------+----------------+------+-------+------+-----------------+---------------------+-----+----------------+----------+

Inventory iocage.yml

The jails at iocage_04

plugin: vbotka.freebsd.iocage
host: 10.1.0.29
user: admin
compose:
  ansible_host: iocage_ip4
  release: iocage_release | split('-') | first
  release_major: iocage_release | split('-') | first | split('.') | first
  release_minor: iocage_release | split('-') | first | split('.') | last
groups:
    test: inventory_hostname.startswith('test')
keyed_groups:
  - prefix: distro
    key: iocage_release
  - prefix: state
    key: iocage_state

Playbook pb-test.yml

- hosts: test

  tasks:

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

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

Playbook output - Display groups

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

TASK [debug] *******************************************************************
ok: [test_131] => 
    msg: |-
        inventory_hostname: test_131
        ansible_host: 10.1.0.131
        release: 15.0
        release_major: 15
        release_minor: 0
ok: [test_132] => 
    msg: |-
        inventory_hostname: test_132
        ansible_host: 10.1.0.132
        release: 15.0
        release_major: 15
        release_minor: 0
ok: [test_133] => 
    msg: |-
        inventory_hostname: test_133
        ansible_host: 10.1.0.133
        release: 15.0
        release_major: 15
        release_minor: 0

TASK [debug] *******************************************************************
ok: [test_131] => 
    msg: |-
        groups:
          all: [ansible_client, test_131, test_132, test_133]
          distro_15_0_RELEASE_p3: [ansible_client, test_131, test_132, test_133]
          state_down: [ansible_client, test_131, test_132]
          state_up: [test_133]
          test: [test_131, test_132, test_133]
          ungrouped: []

PLAY RECAP *********************************************************************
test_131                   : ok=2    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