2016-11-16 24 views
2

我想在defaults/main.yml中生成一個ip地址列表(使用最後8位的範圍,所以120-190轉換爲xxx120 - xxx190)角色,並在以後使用它來創建新的網絡接口並生成新的配置文件。我試過這個方法:在jinja模板內使用給定範圍創建ip的列表

默認/ 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%}"

,然後用它在模板

template.conf.j2:

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

和所有我在生成的配置文件是:

  s 
      e 
      r 
      v 
      e 
      r 


      : 
      6 
      6 
      6 
      6 

      s 
      e 
      r 
      v 
      e 
      r 

      1 
      : 
      6 

所以我的猜測是,我不是生成列表,而只是一個很長的字符串,當我在template.conf.j2使用循環我遍歷單個字符。我嘗試使用this問題的答案,但我得到的只是語法錯誤。任何想法可以幫助我?

回答

6

如果您希望它們成爲列表,您應該將您的變量格式化爲JSON列表。
1.1.1.1 2.2.2.2 3.3.3.3是一個字符串。
['1.1.1.1', '2.2.2.2', '3.3.3.3']將被轉換爲列表。

但還有另一種方法適合你:

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 }}" 
+0

替代aproach似乎很酷,但出於好奇,如何將一個格式變量格式作爲JSON列表在我的情況? – Sackhorn

+1

請按照我在答案中的示例列表:在IP地址周圍放置單引號,在每個地址後面放置逗號,並在兩側放置方括號。 –

+0

我得到如何JSON列表看起來像但我有問題與忍者模板語法,我想知道是否(以及如何)這是適用於我的情況:) – Sackhorn

1

Kostantin答案是有很大幫助,但我發現剛剛意識到在我的情況下產生的配置項可以在一個更簡單的方式來解決。而不是試圖遍歷列表或神社模板文件中的字符串變量,變量template.conf.j2像那樣:

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

,你可以只輸入插入新行的標誌,而在默認生成的字符串/主.yml

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

,然後只需插入整個字符串轉換成template.conf.j2這樣的:

{{conf_line}} 

然而,我沒有其他想法如何生成列表除了康斯坦丁提出的一個IP地址。