.. _example_010:

010 Clone basejails and create inventory
----------------------------------------

.. contents::
   :local:
   :depth: 1

.. index:: single: module vbotka.freebsd.iocage; Example 010
.. index:: single: inventory vbotka.freebsd.iocage; Example 010
.. index:: single: option compose; Example 010
.. index:: single: compose; Example 010
.. index:: single: option keyed_groups; Example 010
.. index:: single: keyed_groups; Example 010

.. index:: single: iocage_jails; Example 010
.. index:: single: iocage_plugins; Example 010
.. index:: single: iocage_releases; Example 010
.. index:: single: iocage_templates; Example 010

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
^^^^^^^^^^^^

* `module vbotka.freebsd.iocage`_
* `inventory plugin vbotka.freebsd.iocage`_
* 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,

.. code-block:: console

   [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
   ...

.. seealso::

   * `Fetch a Release`_
   * `Create a Jail`_
   * `Start, Stop, or Restart a Jail`_
   * `Listing Jails`_

ansible.cfg
^^^^^^^^^^^

.. literalinclude:: ansible.cfg
   :language: ini

Inventory iocage.ini
^^^^^^^^^^^^^^^^^^^^

.. literalinclude:: iocage.ini
   :language: ini

host_vars
^^^^^^^^^

.. literalinclude:: host_vars/iocage_02/iocage.yml
   :language: yaml
   :caption:

.. literalinclude:: host_vars/iocage_04/iocage.yml
   :language: yaml
   :caption:

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

.. literalinclude:: pb-iocage-fetch-base-clone-list.yml
   :language: yaml

Playbook output - fetch, create, clone, and start
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

   (env) > ansible-playbook pb-iocage-fetch-base-clone-list.yml -i iocage.ini

.. literalinclude:: out/out-01.txt
   :language: yaml
   :force:

Jails at iocage_02
^^^^^^^^^^^^^^^^^^

.. code-block:: console

   [iocage_02]# iocage list -l

.. literalinclude:: out/out-02.txt
   :language: bash

Jails at iocage_04
^^^^^^^^^^^^^^^^^^

.. code-block:: console

   [iocage_04]# iocage list -l

.. literalinclude:: out/out-03.txt
   :language: bash

Inventory iocage.yml
^^^^^^^^^^^^^^^^^^^^

The jails at ``iocage_04``

.. literalinclude:: iocage.yml
   :language: yaml
   :emphasize-lines: 2

.. seealso::

   * `Inventory plugin ansible.builtin.constructed`_
   * `Enabling inventory cache plugins`_

Playbook pb-test.yml
^^^^^^^^^^^^^^^^^^^^

.. literalinclude:: pb-test.yml
   :language: yaml

Playbook output - Display groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

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

.. literalinclude:: out/out-04.txt
   :language: yaml
   :force:
   :emphasize-lines: 30-35


.. _module vbotka.freebsd.iocage: https://galaxy.ansible.com/ui/repo/published/vbotka/freebsd/content/module/iocage/
.. _inventory plugin vbotka.freebsd.iocage: https://galaxy.ansible.com/ui/repo/published/vbotka/freebsd/content/inventory/iocage/
.. _role vbotka.freebsd.iocage: https://galaxy.ansible.com/ui/repo/published/vbotka/freebsd/content/role/iocage/
.. _binary iocage: https://github.com/freebsd/iocage/
.. _Inventory plugin ansible.builtin.constructed: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/constructed_inventory.html#ansible-collections-ansible-builtin-constructed-inventory
.. _Enabling inventory cache plugins: https://docs.ansible.com/ansible/latest/plugins/cache.html#enabling-inventory-cache-plugins
.. _Fetch a Release: https://freebsd.github.io/iocage/basic-use.html#fetch-a-release
.. _Create a Jail: https://freebsd.github.io/iocage/basic-use.html#create-a-jail
.. _Start, Stop, or Restart a Jail: https://freebsd.github.io/iocage/basic-use.html#start-stop-or-restart-a-jail
.. _Listing Jails: https://freebsd.github.io/iocage/basic-use.html#listing-jails
