Understanding Jinja2 Conditionals#

Creating dynamic and adaptable configurations for various network setups is crucial in network automation. In addition to loops, Jinja2 templates offer powerful conditional structures that allow for even more flexibility. This section will guide you through the basics of Jinja2 conditionals, practical use cases, and best practices for using them effectively.

Basic Syntax of Jinja2 Conditionals#

Jinja2 provides a straightforward syntax for writing conditional statements, similar to Python. Conditionals in Jinja2 are enclosed within {% %} tags and can be used to control the flow of template rendering based on variable values.

{% if variable %}
  {{ variable }}
{% elif other_variable %}
  {{ other_variable }}
{% else %}
  No variable found.
{% endif %}

In this example:

  • If variable is defined and evaluates to True, its value will be printed.

  • If variable is not defined or evaluates to False, but other_variable is defined and evaluates to True, other_variable will be printed.

  • If neither variable nor other_variable are defined or evaluate to True, the text “No variable found.” will be printed.

Dynamic Configuration Generation#

Network configurations often need to be tailored based on specific conditions, such as the presence of certain features or the values of particular variables. Jinja2 conditionals make this easy to manage.

Example: Network Configuration#

We use the same two routers with IP addresses 172.16.10.11 and 172.16.10.14. To configure OSPF, the router 172.16.10.14 has only access to the internet. To populate the default route in the network, we need a different command for this edge router. To achieve this, we need a condition in our script to add the extra command default-information originate, which is not required for router 172.16.10.11.

Here’s an example of using Jinja2 conditionals in a network configuration template. This template configures OSPF (Open Shortest Path First) on a router 172.16.10.14, but only if the OSPF router ID is 1.1.1.1.

router ospf {{ ospf.process_id }}
  router-id {{ ospf.router_id }}
  {% for network in ospf.networks %}
  network {{ network.network }} {{ network.mask }} area 0
  {% if ospf.router_id == '1.1.1.1' %}
  default-information originate
  {% endif %}
  {% endfor %}

In this example:

  • The ospf.router_id condition checks if the router ID is 1.1.1.1.

  • If the OSPF router ID is 1.1.1.1, the template generates the necessary OSPF configuration commands.

  • A loop is used within the conditional to configure each network under the OSPF process.

Jinja2 conditionals are a powerful tool for creating dynamic and adaptable templates. By using {% if %}, {% elif %}, and {% else %} statements, you can control the flow of your templates and generate configurations that adapt to various conditions. Remember to follow best practices to maintain readability and manageability of your templates. Experiment with different conditional structures to suit your specific needs and enhance the flexibility of your network automation tasks.