Jinja2
======
Delimiters
* ``{%....%}`` are for statements
* ``{{....}}`` are expressions used to print to template output
* ``{#....#}`` are for comments which are not included in the template output
* ``#....##`` are used as line statements
Let's create a new playbook named **jinja.yml** and use the code below. One additional Jinja function we'll use is **joiner**. *Joiner* allows the passing of list items
and all but the last item will get the delimiter added to it. In our example that's the ``,`` .
.. code-block:: yaml
:caption: jinja.yml
---
- hosts: all
gather_facts: false
connection: local
vars:
var1: itema,itemb,itemc,itemd
tasks:
- name: Set Fact from vars (build a list)
ansible.builtin.set_fact:
jinja: "{{ var1.split(',') }}"
- name: Echo jinja List
ansible.builtin.debug:
var: jinja
- name: Echo jinja loop
ansible.builtin.debug:
msg: "{% set comma=joiner(',') %} {% for item in jinja %} {{comma()}} {{ item }} {% endfor %}"
To run this example:
.. code-block:: bash
ansible-playbook -i "localhost," jinja.yml
An example of a F5 deployment using a j2 (Jinja) template
.. code-block:: yaml
:caption: Example Ansible task
:linenos:
- name: Push Declaration
ansible.builtin.uri:
url: "https://{{ hostvar[groups['adc'][0]]['ansible_host']/mgmt/shared/appsvcs/declare"
method: POST
body: "{{ lookup('template', 'exampleFile.j2', split_lines=False) }}"
body_format: json
headers:
Content-type: application/json
X-F5-Auth-Token: "{{ Auth.tok.json.token.token }}"
status_code: 200
timeout: 300
validate_certs: no
delegate_to: localhost
This example (thanks to Forrest Crenshaw @F5 on `Linklight `_ Exercise 3) is used to loop through all our pool members from inventory and add them to the Virtual Server
::
"members": [
{
"servicePort": {{ item.svc_port }},
"serverAddresses": [
{% set comma = joiner(",") %}
{% for mem in item.pool_members %}
{{comma()}} "{{ hostvars[mem]['ansible_host'] }}"
{% endfor %}
]
You can run Jinja2 functions on an online parser `here `_ .
In this example you can use the online parser to run your tempate code and supply the associated YAML values.
.. code-block:: json
:caption: Jinja Template
{
"allowed-ip": [
{% set comma = joiner(",") %}
{% for acl in acls %}{{ comma() }}
{
"name": "{{ acl.acl_name }}",
"config": {
"ipv4": {
"address": "{{ acl.acl_ip }}",
"prefix-length": "{{ acl.acl_prefixLength }}",
"port": {{ acl.acl_port }}
}
}
}{% endfor %}
]
}
.. code-block:: yaml
:caption: Values(YAML)
acls:
- acl_name: test
acl_ip: 10.1.10.11
acl_prefixLength: 24
acl_port: 22
- acl_name: test
acl_ip: 10.1.10.12
acl_prefixLength: 24
acl_port: 22