Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating list of ip's in ansible using given range within jinja template

Tags:

ansible

jinja2

i want to generate a list of ip addresses (using range of last 8bits so 120-190 translates to x.x.x.120 - x.x.x.190) in defaults/main.yml in my role, and later use it to create new network interfaces and generate a new config file. I tried this approach:

defaults/main.yml:

ip_list: "{%for address_end in range(50,99)%} 192.168.0.{{address_end}}{%endfor%}" conf_list: "{%for ip in ip_list%}server {{ip}}:6666 {%endfor%}"

and then to use it in template

template.conf.j2:

{% for conf_line in conf_list %}
{{conf_line}}
{% endfor %}

and all i got in generated config file was:

            s
            e
            r
            v
            e
            r


            :
            6
            6
            6
            6

            s
            e
            r
            v
            e
            r

            1
            :
            6

so my guess is that i'm not generating a list but just a long string and when I use for loop in template.conf.j2 I iterate over single chars. I tried using answer to this problem but all i got was syntax error. Any ideas for what might help me ?

like image 268
Sackhorn Avatar asked Feb 06 '23 16:02

Sackhorn


2 Answers

You should format your vars as JSON lists if you want them to be lists.
1.1.1.1 2.2.2.2 3.3.3.3 is a string.
['1.1.1.1', '2.2.2.2', '3.3.3.3'] will be converted to list.

But there is alternative approach for you:

ip_list: "{{ lookup('sequence', 'start=50 count=12 format=192.168.0.%d', wantlist=True) }}"
conf_list: "{{ ip_list | map('regex_replace','(.*)','server \\1:6666') | list }}"
like image 172
Konstantin Suvorov Avatar answered Mar 05 '23 16:03

Konstantin Suvorov


Kostantin answer was of much help, but i found just realized that generating config entries in my case could be solved in an less complex way. Instead of trying to iterate over list or a string variable variable in jinja template file template.conf.j2 like did with :

{% for conf_line in conf_list %}
{{conf_line}}
{% endfor %}

you could just enter insert new line signs while generating string in defaults/main.yml:

conf_list: "{%for ip in ip_list%}server {{ip}}:6666\n{%endfor%}"

and then just insert that whole string into a template.conf.j2 like this:

{{conf_line}}

nevertheless i have no other idea how to generate list of ip addresses other than the one Konstantin proposed.

like image 29
Sackhorn Avatar answered Mar 05 '23 16:03

Sackhorn