Ansible循环在模板中的字母范围

时间:2017-07-07 15:15:08

标签: ansible jinja2

我正在尝试生成一个Ansible模板,该模板按字母顺序而非数字递增字母。是否有类似于range(x)的功能可以帮助我?

伪代码示例

{% for letter in range(a, d) %}
{{ letter }}
{% endfor %}

预期产出

a
b
c
d

或者有没有办法在Ansible中将数字转换为字母顺序?

{% for i in range(6) %}
{{ convert(i) }}
{% endfor %}

更新

对于那些好奇的人,以下是我最终应用@ zigam解决方案的方法。目标是使用来自主机组的每个主机创建xml标记。

我的角色默认值为:

ids: "ABCDEFGHIGJKLMNPQRSTUVWXYZ"

在我的模板中:

{% for host in groups['some_group'] %}
<host-id="{{ ids[loop.index] }}" hostName="{{ host }}" port="8888" />
{% endfor %}

2 个答案:

答案 0 :(得分:2)

您可以迭代字符串:

 {% for letter in 'abcd' %}
 {{ letter }}
 {% endfor %}

如果你想迭代一个字母范围:

 {% set letters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' %}
 {% for letter in letters[:6] %} {# first 6 chars #}
 {{ letter }}
 {% endfor %}

答案 1 :(得分:0)

您可以使用自定义过滤器插件来执行您想要的操作

在filter_plugins / scratch_filter.py中

def scratch_filter(n):
    return chr(n)

class FilterModule(object):
    ''' Number to Character filter '''
    def filters(self):
        return {
            'scratch_filter': scratch_filter
        }

在scratch-template.j2中:

{% for x in range(101, 113) %}
    {{ x|scratch_filter }}
{% endfor %}

在scratch_playbook.yml

---
- hosts: localhost
  tasks:

  - name: test loop
    template: 
      src: "{{ playbook_dir }}/scratch-template.j2"
      dest: "{{ playbook_dir }}/scratch-template-output.txt"