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_04In 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
testdisplay all created groups.
Requirements
root privilege in the managed nodes
activated binary iocage.
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
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
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