loops - 使用循环添加到 yaml 列表

标签 loops variables yaml jinja2 ansible

我正在使用 geerlingguy.firewall ansible Galaxy 角色来添加 iptables 规则。其中有一个firewall_additional_rules列表变量,我在其中添加一些脚本以允许来自某些ip,我想为其提供另一个列表变量

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

最佳答案

Ansible playbook、vars 文件等不是 jinja2 模板,因此正如您所说,像 {% for ... %} 这样的 jinja2 结构在其中不起作用。但话虽如此,只需将 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 %}

关于loops - 使用循环添加到 yaml 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29700363/

相关文章:

javascript - 让变量继承现有原型(prototype)的方法?

ruby-on-rails - 如何在yaml中创建关联数组列表

ruby-on-rails - Rails - 查找不同语言环境之间丢失的键(.yml 文件)

python - for 循环的下一个抽象级别?

javascript - 如何在每次循环迭代中一个一个地移动数组的 3 个元素?

MySQL:@变量与变量。有什么不同?

php - 在php循环中增加不存在的变量

c# - 在 foreach 循环中检查 null

python 遍历列表

kubernetes - helm 重写基本模板图表中的图表和值 yaml