Vikram Nallamala
Vikram Nallamala

Reputation: 61

Ansible Playbook- Pass variables in for loop

I am trying to create tomcat cluster based on number of hosts, and I am trying to pass variables to a for loop in template file.

I want to control num_hosts from variables.

The template file snippet is:

{% for id in range(1,( {{ num_hosts }} )) %}
    <Member
       className="org.apache.catalina.tribes.membership.StaticMember"
       port="4110"
       host="${test.server.web.other{{ id }}.fqdn}"
       domain="delta-static"
    />
{% endfor %}

Got the below error

fatal: [test-web01.aliceapp.com]: FAILED! =>
{"changed": false,
"failed": true,
"invocation": {"module_args": {"dest": "/home/tomcat/apache-tomcat/conf/server.xml", "src": "test/server.j2"}, "module_name": "template"},
"msg": "AnsibleError: an unexpected type error occurred. Error was an integer is required"}

I have tried multiple combination of syntaxes, bot none of them are working.

Upvotes: 4

Views: 1712

Answers (2)

Vikram Nallamala
Vikram Nallamala

Reputation: 61

Finally able to make it work with following syntax.

{% for id in range(1, ( num_hosts|int ) ) %}

Upvotes: 2

SztupY
SztupY

Reputation: 10546

range accespts integers as it's parameters, but jinja will be default convert everything to string. You can use the int built in jinja2 filter to convert values to integer:

{% for id in range(1,( {{ num_hosts | int }} )) %}

Upvotes: 3

Related Questions