How to pass variable to Jinja template in Salt
Yesterday I faced a quite interesting problem. In my SLS definition I was iterating over a hash of hashes and wanted to pass the hash from the current iteration to a Jinja template. To make it more clear, let me show you the problem in the code:
{% for vhost in pillar['vhosts'] %}
/etc/httpd/conf.d/{{ vhost.name }}.conf:
file.managed:
- template: jinja
- source: salt://httpd/files/vhost/vhost_template.conf.jinja
- user: apache
- group: apache
- mode: 644
- require:
- pkg: httpd
{% endfor %}
I simply wanted to use the variable vhost in my template. The variable vhost is nothing more than a hash with parameters for each vhost. We can solve this problem by using context in the salt definition. Here is the final version of my sls snippet (aka the solution):
{% for vhost in pillar['vhosts'] %}
/etc/httpd/conf.d/{{ vhost.name }}.conf:
file.managed:
- template: jinja
- source: salt://httpd/files/vhost/vhost_template.conf.jinja
- user: apache
- group: apache
- mode: 644
- require:
- pkg: httpd
- context: # set up context for template
vhost: {{ vhost }} # it makes vhost hash available inside
# Jinja template under the name vhost
{% endfor %}
Of course you can pass as many variables as you want via the context.
–robert
Comments