Appending files with Template Module in Ansible

14,427

Solution 1

You can use blockinfile module and template lookup to manage per-client blocks in your stunnel.conf:

- include_vars:
    file: customers.yml
    name: customers

- blockinfile:
    dest: stunnel.conf
    block: "{{ lookup('template', 'stunnel.j2') }}"
    marker: "; {mark} ANSIBLE MANAGED BLOCK FOR {{ cust }}"

I've shortened file paths for readability.

This way Ansible will look for managed block for specific client ({{ cust }} variable) and add/replace with content from templated stunnel.j2.

Solution 2

I would like suggest to do it like this:

  1. Save output of template to temporary file.
  2. Append Stunnel.conf file with content of temporary file.
  3. Delete temporary file.

In playbook it could look like:

- include_vars:
    file: /home/vagrant/stunnelSimAnsPractice/roles/ns16/vars/customers.yml
    name: customers

- template:
    src: /home/vagrant/stunnelSimAnsPractice/roles/ns16/templates/stunnel.j2
    dest: /home/vagrant/stunnelSimAnsPractice/roles/ns16/output/temp.conf
    owner: root
    group: root

- name: "Append stunnel.conf with content of temporary file"
  shell: cat temp.conf >> stunnel.conf
  args:
    chdir: "/home/vagrant/stunnelSimAnsPractice/roles/ns16/output"

- name: "Delete temporary file"
  file:
    path: /home/vagrant/stunnelSimAnsPractice/roles/ns16/output/temp.conf
    state: absent
Share:
14,427
Johnny Gillespie
Author by

Johnny Gillespie

Updated on June 09, 2022

Comments

  • Johnny Gillespie
    Johnny Gillespie almost 2 years

    So I have an ansible playbook that is using a Jinja2 template to create a log file. Everytime I run the playbook it is pulling in customer information from customers.yml and outputting the completed template into a 'stunnel.conf' file. The template works fine but I am trying to find a way to append the previous 'stunnel.conf' rather than overwriting it using the Template module. I wish to add text to the beginning of the 'stunnel.conf' manually and not have it overwritten. Do you think this would be possible?

    Stunnel.conf

    ; GFAM - PBSTP
    [customer-GFAM-34074]
    cert = /etc/stunnel/stunnel.pem
    accept = 34094
    connect = 35094
    
    ; GUANFABANK - FXSIM
    [customer-GUANFABANK-34051]
    cert = /etc/stunnel/stunnel.pem
    accept = 34095
    connect = 35095
    
    ; ONEZERO2 - TRADESTREAM
    [customer-ONEZERO2-39124]
    cert = /etc/stunnel/stunnel.pem
    accept = 34096
    connect = 35096
    
    ; BTG-VELOCITY - PBSTP
    [customer-BTG-VELOCITY-42533]
    cert = /etc/stunnel/stunnel.pem
    accept = 34097
    connect = 35097
    

    Jinja2 Template

    {#CONTEXT: {{ customers }}#}
    {% set currentport = 34093%}
    {% for cust, config in customers.items() %}
    ; {{ cust }} - {{ config['type'] }}
    [customer-{{ cust }}-{{ config['accept'] }}]
    cert = {{ "/etc/stunnel/stunnel.pem" }}
    {#accept = {{ config['accept'] }}#}
    {#connect = {{ config['connect'] }}#}
    accept = {{ currentport + 1 }}
    connect = {{ currentport + 1001 }}
    {% set currentport = currentport + 1 %}
    
    {% endfor %}
    

    playbook.yml

    - include_vars:
        file: /home/vagrant/stunnelSimAnsPractice/roles/ns16/vars/customers.yml
        name: customers
    
    - template:
        src: /home/vagrant/stunnelSimAnsPractice/roles/ns16/templates/stunnel.j2
        dest: /home/vagrant/stunnelSimAnsPractice/roles/ns16/output/stunnel.conf
        owner: root
        group: root