.. _example_204:

204 Create DHCP jails with auto UUID and iocage_tags v2
-------------------------------------------------------

Extending example :ref:`example_203`

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

.. index:: single: swarms; Example 204

.. index:: single: template ansible_client; Example 204
.. index:: single: ansible_client; Example 204
.. index:: single: DHCP; Example 204
.. index:: single: property notes; Example 204
.. index:: single: notes; Example 204

.. index:: single: filter vbotka.freebsd.iocage; Example 204
.. index:: single: inventory vbotka.freebsd.iocage; Example 204
.. index:: single: module ansible.builtin.command; Example 204
.. index:: single: pb-iocage-ansible-clients-v2.yml; Example 204

.. index:: single: option get_properties; Example 204
.. index:: single: get_properties; Example 204
.. index:: single: option hooks_results; Example 204
.. index:: single: hooks_results; Example 204
.. index:: single: option compose; Example 204
.. index:: single: compose; Example 204
.. index:: single: option groups; Example 204

.. index:: single: option iocage --count; Example 204
.. index:: single: option iocage --short; Example 204
.. index:: single: option iocage --template; Example 204

.. index:: single: variable iocage_jails; Example 204
.. index:: single: iocage_jails; Example 204
.. index:: single: variable iocage_hooks; Example 204
.. index:: single: iocage_hooks; Example 204
.. index:: single: variable iocage_properties; Example 204
.. index:: single: iocage_properties; Example 204
.. index:: single: variable iocage_tags; Example 204
.. index:: single: iocage_tags; Example 204

Use case
^^^^^^^^

Instead of the `module vbotka.freebsd.iocage`_ create the variable ``iocage_jails`` using the
`filter vbotka.freebsd.iocage`_

.. literalinclude:: pb-iocage-ansible-clients-v2/iocage_jails.yml
   :language: yaml
   :caption:

**Test filter vbotka.freebsd.iocage**

Given the input ``vars/iocage_datasets.yml``

.. literalinclude:: vars/iocage_datasets.yml
   :language: yaml

The below playbook ``pb-test-filter.yml``

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

gives

.. literalinclude:: out/out-pb-test-filter.txt
   :language: yaml
   :force:

Tree
^^^^

::

  shell> tree .
  .
  ├── ansible.cfg
  ├── group_vars
  │   └── all
  │       └── iocage.yml
  ├── hosts
  │   ├── 02_iocage.yml
  │   ├── 04_iocage.yml
  │   └── 99_constructed.yml
  ├── iocage.ini
  ├── pb-iocage-ansible-clients-v2
  │   ├── iocage_jails.yml
  │   ├── swarm_destroy.yml
  │   └── swarm.yml
  ├── pb-iocage-ansible-clients-v2.yml
  ├── pb-test.yml
  ├── pb-test-filter.yml
  └── vars
      └── iocage_datasets.yml

Synopsis
^^^^^^^^

* At two managed nodes:

  * iocage_02
  * iocage_04

  In the playbook ``pb-iocage-ansible-clients-v2.yml``, use:

  * module ``ansible.builtin.command`` to:

    * create variable ``iocage_jails``
    * create jails
    * start jails
    * optionally, stop and destroy the jails.

* At all created jails:

  In the playbook ``pb-test.yml``:

  * connect to the created jails
  * display the basic jails' configuration.

Requirements
^^^^^^^^^^^^

* `filter vbotka.freebsd.iocage`_
* `inventory plugin vbotka.freebsd.iocage`_
* root privilege in the managed nodes
* templates created in :ref:`example_202`

Notes
^^^^^

Templates created in :ref:`example_202` are used in this example.

.. seealso::

   * `binary iocage`_

Templates at iocage_02
^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

   [iocage_02]# iocage list -lt

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

Templates at iocage_04
^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

   [iocage_04]# iocage list -lt

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

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

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

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

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

group_vars
^^^^^^^^^^

.. literalinclude:: group_vars/all/iocage.yml
   :language: yaml
   :caption:

Playbook pb-iocage-ansible-clients-v2.yml
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. literalinclude:: pb-iocage-ansible-clients-v2.yml
   :language: yaml

Playbook output - Create and start jails
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

   (env) > ansible-playbook pb-iocage-ansible-clients-v2.yml \
                            -i iocage.ini \
                            -t swarm -e swarm=true -e debug=true

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

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

.. code-block:: console

   [iocage_02]# iocage list -l

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

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

.. code-block:: console

   [iocage_04]# iocage list -l

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

Inventory hosts
^^^^^^^^^^^^^^^

.. literalinclude:: hosts/02_iocage.yml
   :language: yaml
   :caption:
   :emphasize-lines: 4,9

.. literalinclude:: hosts/04_iocage.yml
   :language: yaml
   :caption:
   :emphasize-lines: 4,9

.. literalinclude:: hosts/99_constructed.yml
   :language: yaml
   :caption:

.. note::

   The option ``get_properties: True`` is needed to get the dictionary ``iocage_properties``.

Display inventory
^^^^^^^^^^^^^^^^^

.. code-block:: console

   (env) > ansible-inventory -i hosts --graph

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

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

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

Playbook output - Display iocage_tags
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: console

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

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

.. hint::

   The below command stops and destroys the jails in ``swarms`` ::

     ansible-playbook pb-iocage-ansible-clients-v2.yml \
                      -i iocage.ini \
                      -t swarm_destroy -e swarm_destroy=true

.. _module vbotka.freebsd.iocage: https://galaxy.ansible.com/ui/repo/published/vbotka/freebsd/content/module/iocage/
.. _filter vbotka.freebsd.iocage: https://galaxy.ansible.com/ui/repo/published/vbotka/freebsd/content/filter/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/iocage/iocage/
