021 Inventory plugin iocage2
Use case
In the inventory plugin vbotka.freebsd.iocage2, use the option inventory_hostname_tag to tell
the plugin which tag to create inventory aliases from.
Tree
shell> tree .
.
├── ansible.cfg
├── group_vars
│ └── all
│ └── swarms.yml
├── hosts
│ ├── 06_iocage2.yml
│ └── 99_constructed.yml
├── host_vars
│ └── iocage_06
│ └── iocage.yml
├── iocage.ini
├── pb-test-all.yml
├── pb-test-connection.yml
└── pb-test-db.yml
Synopsis
In the inventory plugin vbotka.freebsd.iocage2, get the inventory aliases from the tag
aliasIn the inventory plugin ansible.builtin.constructed, create the inventory groups.
Display the jails and groups.
Test the connection.
Requirements
root privilege in the managed nodes
Jails created in 020 Get inventory aliases from notes.
Notes
The inventory files in the directory
hostsare evaluated in alphabetical order.
Templates at iocage_06
[iocage_06]# iocage list -lt
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL |
+======+=========================+======+=======+==========+=================+=======================+=====+==========+==========+
| None | ansible-client | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-client-apache | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-client-pull | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-init | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-init-devel | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-init-example | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-nginx | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-pkg-repo | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-repos | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-syslogng-client | off | down | template | 15.1-RELEASE-p1 | DHCP (not running) | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
| None | ansible-syslogng-server | off | down | template | 15.1-RELEASE-p1 | vnet0|172.16.99.41/24 | - | - | no |
+------+-------------------------+------+-------+----------+-----------------+-----------------------+-----+----------+----------+
ansible.cfg
[defaults]
callback_result_format = yaml
deprecation_warnings = false
display_skipped_hosts = false
gathering = explicit
interpreter_python = auto_silent
[connection]
pipelining = true
Inventory iocage.ini
iocage_06
[iocage]
iocage_06
[iocage:vars]
ansible_user=admin
ansible_become=true
ansible_python_interpreter=auto_silent
group_vars
group_vars/all/swarms.yml
project: sandbox_020
properties:
bpf: 1
dhcp: 1
vnet: 1
host_vars
host_vars/iocage_06/iocage.yml
names: [db1, db2]
swarms:
db:
count: 2
template: ansible_client
hosts
hosts/06_iocage2.yml
plugin: vbotka.freebsd.iocage2
host: iocage_06
user: admin
cache: true
cache_plugin: ansible.builtin.jsonfile
cache_connection: /var/tmp/inventory_cache
cache_timeout: 3600
cache_prefix: iocage_06_
get_properties: true
inventory_hostname_tag: alias
hooks_results:
- /var/db/dhclient-hook.address.epair0b
compose:
iocage_tags: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)'))
iocage_classes: iocage_properties.notes | regex_findall('(?<=class=)[\w\-]+|(?<=,)[\w\-]+')
# connection plugin vbotka.freebsd.jailexec
ansible_connection: "'vbotka.freebsd.jailexec'"
ansible_ssh_user: "'admin'"
ansible_jail_host: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)')).vmm | d('none')
ansible_jail_name: iocage_jid
ansible_jail_privilege_escalation: "'sudo'"
hosts/99_constructed.yml
plugin: ansible.builtin.constructed
keyed_groups:
- prefix: project
key: iocage_tags.project
- prefix: swarm
key: iocage_tags.swarm
- prefix: state
key: iocage_state
- prefix: vmm
key: iocage_tags.vmm
Jails at iocage_06
[iocage_06]# iocage list -l
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL |
+======+===============+======+=======+======+=================+=======================+=====+==================+==========+
| None | 09caf271 | off | down | jail | 15.1-RELEASE-p1 | DHCP (not running) | - | ansible-client | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| None | 1718af82 | off | down | jail | 15.1-RELEASE-p1 | DHCP (not running) | - | ansible-client | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 22 | log-server-01 | on | up | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24 | - | ansible-init | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 21 | pkg-repo | on | up | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.23/24 | - | ansible-pkg-repo | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 18 | repos | on | up | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.21/24 | - | ansible-repos | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 19 | repos-devel | on | up | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.22/24 | - | ansible-repos | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 23 | www-01 | on | up | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116 | - | ansible-init | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 24 | www-02 | on | up | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.147 | - | ansible-init | no |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
Jails graph at iocage_06
(env) > ansible-inventory -i hosts -i iocage.ini --graph
@all:
|--@ungrouped:
|--@state_up:
| |--repos
| |--repos_devel
| |--pkg_repo
| |--log_server_01
| |--www_02
| |--www_01
|--@vmm_iocage_06:
| |--repos
| |--repos_devel
| |--pkg_repo
| |--log_server_01
| |--www_02
| |--www_01
|--@iocage:
| |--iocage_06
Playbook pb-test-all.yml
- name: Display all groups.
hosts: all
tasks:
- debug:
msg: |
{{ iocage_properties.host_hostuuid | d('UNDEFINED') }}
{{ iocage_tags | d({}) | to_yaml }}
- debug:
msg: |
{% for group in groups %}
{{ group }}: {{ groups[group] }}
{% endfor %}
run_once: true
Playbook output - Display all groups
(env) > ansible-playbook -i hosts --flush-cache pb-test-all.yml
PLAY [Display all groups.] *****************************************************
TASK [debug] *******************************************************************
ok: [repos] =>
msg: |-
repos
{class: repos, vmm: iocage_06}
ok: [repos_devel] =>
msg: |-
repos-devel
{alias: repos_devel, class: repos, vmm: iocage_06}
ok: [db1] =>
msg: |-
1718af82
{alias: db1, project: sandbox_020, swarm: db, vmm: iocage_06}
ok: [db2] =>
msg: |-
09caf271
{alias: db2, project: sandbox_020, swarm: db, vmm: iocage_06}
ok: [pkg_repo] =>
msg: |-
pkg-repo
{alias: pkg_repo, class: pkg-repo, vmm: iocage_06}
ok: [log_server_01] =>
msg: |-
log-server-01
{alias: log_server_01, class: log-server, vmm: iocage_06}
ok: [www_02] =>
msg: |-
www-02
{alias: www_02, class: log-client, vmm: iocage_06}
ok: [www_01] =>
msg: |-
www-01
{alias: www_01, class: log-client, vmm: iocage_06}
TASK [debug] *******************************************************************
ok: [repos] =>
msg: |-
all: ['repos', 'db1', 'repos_devel', 'db2', 'pkg_repo', 'log_server_01', 'www_02', 'www_01']
ungrouped: []
state_up: ['repos', 'repos_devel', 'pkg_repo', 'log_server_01', 'www_02', 'www_01']
vmm_iocage_06: ['repos', 'db1', 'repos_devel', 'db2', 'pkg_repo', 'log_server_01', 'www_02', 'www_01']
project_sandbox_020: ['db1', 'db2']
swarm_db: ['db1', 'db2']
state_down: ['db1', 'db2']
PLAY RECAP *********************************************************************
db1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
log_server_01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
pkg_repo : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
repos : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
repos_devel : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
www_01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
www_02 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook pb-test-db.yml
- name: Group swarm_db
hosts: swarm_db
tasks:
- debug:
var: iocage_properties.host_hostuuid
Playbook output - Group swarm_db
(env) > ansible-playbook -i hosts pb-test-db.yml
PLAY [Group swarm_db] **********************************************************
TASK [debug] *******************************************************************
ok: [db1] =>
iocage_properties.host_hostuuid: 1718af82
ok: [db2] =>
iocage_properties.host_hostuuid: 09caf271
PLAY RECAP *********************************************************************
db1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook pb-test-connection.yml
- name: Test connection and get hostname.
hosts: all
tasks:
- command: hostname
register: out
- debug:
msg: |
{{ inventory_hostname }} {{ out.stdout }}
Playbook output - Test connection and get hostname
(env) > ansible-playbook -i hosts pb-test-connection.yml
PLAY [Test connection and get hostname.] ***************************************
TASK [command] *****************************************************************
changed: [pkg_repo]
changed: [repos_devel]
[ERROR]: Task failed: Cannot access jail 'None': Shared connection to iocage_06 closed.
Task failed.
Origin: /export/scratch/collections/ansible_collections/vbotka/freebsd/docs/source/examples/021/pb-test-connection.yml:6:7
4 tasks:
5
6 - command: hostname
^ column 7
<<< caused by >>>
Cannot access jail 'None': Shared connection to iocage_06 closed.
fatal: [db1]: UNREACHABLE! =>
changed: false
msg: 'Task failed: Cannot access jail ''None'': Shared connection to iocage_06 closed.'
unreachable: true
fatal: [db2]: UNREACHABLE! =>
changed: false
msg: 'Task failed: Cannot access jail ''None'': Shared connection to iocage_06 closed.'
unreachable: true
changed: [www_02]
changed: [log_server_01]
changed: [repos]
changed: [www_01]
TASK [debug] *******************************************************************
ok: [repos] =>
msg: |-
repos repos
ok: [repos_devel] =>
msg: |-
repos_devel repos-devel
ok: [pkg_repo] =>
msg: |-
pkg_repo pkg-repo
ok: [www_02] =>
msg: |-
www_02 www-02
ok: [log_server_01] =>
msg: |-
log_server_01 log-server-01
ok: [www_01] =>
msg: |-
www_01 www-01
PLAY RECAP *********************************************************************
db1 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
db2 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
log_server_01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
pkg_repo : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
repos : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
repos_devel : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
www_01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
www_02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0