使用循环添加到yaml列表

时间:2015-04-17 13:18:45

标签: loops variables yaml jinja2 ansible

我使用geerlingguy.firewall ansible galaxy角色添加iptables规则。在那里有一个firewall_additional_rules列表变量,我在一些脚本中添加允许从某些ips,我想提供另一个列表变量

white_listed_ips:
   - 1.1.1.1
   - 1.1.1.2

我希望能够通过循环生成white_listed_ips列表中的firewall_additional_rules列表。但是我找不到任何办法。你可以循环遍历变量并添加到yaml中的数组吗?

所以我想在var文件中做这样的事情(我知道这不起作用,放纵我)

firewall_additional_rules:
{% for ip in white_listed_ips %}
  - iptables -A INPUT -p tcp -s {{ ip }} --dport ssh -j ACCEPT
  - iptables -A INPUT -p tcp -s {{ ip }} --dport 80 -j ACCEPT
{% endfor %}

这是进入角色的jinja2模板,你可以在这里看到: https://github.com/geerlingguy/ansible-role-firewall/blob/master/templates/firewall.bash.j2

1 个答案:

答案 0 :(得分:1)

Ansible playbooks,vars文件等不是jinja2模板,所以正如你所说的那样jinja2构造像{% for ... %}一样在其中工作。但话说回来,将jinja2代码简单地移动到应该属于它的模板中是一件简单的事情。

如果您查看firewall.bash.j2中的firewall_additional_rules,则仅在此处引用:

# Additional custom rules.
{% for rule in firewall_additional_rules %}
{{ rule }}
{% endfor %}

你需要做的就是改变它,或者在它之前或之后添加另一个包含你已经写过的确切代码的for循环:

{% for ip in white_listed_ips %}
  - iptables -A INPUT -p tcp -s {{ ip }} --dport ssh -j ACCEPT
  - iptables -A INPUT -p tcp -s {{ ip }} --dport 80 -j ACCEPT
{% endfor %}