Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending files with Template Module in Ansible

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
like image 413
Johnny Gillespie Avatar asked Sep 22 '17 13:09

Johnny Gillespie


People also ask

How do I append Ansible files?

Adding a line to the start of a file in Ansibleinsertbefore – This should be set to BOF to make sure the line is added at the beginning. If the pattern already exists it won't be added. So executing again won't add more lines. path – This should be set to the file which you want to change.

How do I use Ansible template module?

We need to have two parameters when using the Ansible Template module, such as: src: The source of the template file. It can be a relative and absolute path. dest: Dest is the destination path on the remote server.

What is the difference between file and template in Ansible?

The template module also copies a file to a remote server, but it allows you to use Jinja2 to render a template to a file dynamically. This enables you to use variables, such as Ansible facts, to customize a particular file for a specific server.

What is Jinja2 template in Ansible?

Jinja2 templates are simple template files that store variables that can change from time to time. When Playbooks are executed, these variables get replaced by actual values defined in Ansible Playbooks. This way, templating offers an efficient and flexible solution to create or alter configuration file with ease.


2 Answers

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.

like image 163
Konstantin Suvorov Avatar answered Sep 21 '22 04:09

Konstantin Suvorov


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
like image 35
kzygmans Avatar answered Sep 18 '22 04:09

kzygmans