Introduction

Creating a comma-separated list is a common task in templating, but ensuring no trailing comma appears after the last element can be tricky. In Jinja2, the loop.last property provides a simple and elegant solution. In this guide, we’ll explore how to use loop.last in Jinja2 and how to apply it effectively in Ansible playbooks.

Jinja2 Template Example

To avoid a trailing comma, leverage the loop.last property in your Jinja2 template:

{% for item in my_list %}
  {{ item }}{% if not loop.last %},{% endif %}
{% endfor %}

Explanation:

  1. loop.last: A built-in Jinja2 variable that evaluates to True if the current iteration is the last one.
  2. if not loop.last: Ensures a comma is only added when the current item is not the last element.

Input Example:

my_list:
  - apple
  - banana
  - cherry

Output:

apple, banana, cherry

Ansible Playbook Example

To achieve the same result in an Ansible playbook, use the template module or inline Jinja2.

Playbook Example:

---
- name: Generate a comma-separated string
  hosts: localhost
  vars:
    my_list:
      - apple
      - banana
      - cherry
  tasks:
    - name: Create a string with commas
      set_fact:
        comma_separated: >-
          {{ my_list | map('string') | join(', ') }}          

    - name: Debug the result
      debug:
        msg: "{{ comma_separated }}"

Explanation:

  1. join(', '): Combines all elements in the list with a comma and a space.
  2. map('string'): Ensures all elements are converted to strings before joining. This is especially useful when dealing with mixed data types.

Output:

ok: [localhost] => {
    "msg": "apple, banana, cherry"
}

Practical Considerations

Why Use loop.last?

Using loop.last in Jinja2 is a direct and effective way to control list formatting, especially when generating human-readable strings or configuration files.

Ansible and Jinja2 Integration

Ansible leverages Jinja2 for templating, making it a versatile tool for creating dynamic configurations. The use of join in combination with map often simplifies tasks when handling larger or complex lists.


Conclusion

By mastering the loop.last property and the join filter, you can handle comma-separated lists seamlessly in both Jinja2 and Ansible. Whether you’re building templates or automating configurations, these techniques provide clarity and precision to your code.

Subscribe to the YouTube channel, Medium, and Website, X (formerly Twitter) to not miss the next episode of the Ansible Pilot.

Academy

Learn the best practices for Jinja2 and Ansible templating with practical, real-life examples in my book Ansible By Examples.

BUY the Complete PDF BOOK to easily Copy and Paste the 250+ Ansible code

Your support helps keep this content free. Consider donating to the project:

Patreon Buy me a Pizza