Loops 使用循环添加到yaml列表

Loops 使用循环添加到yaml列表,loops,variables,yaml,jinja2,ansible,Loops,Variables,Yaml,Jinja2,Ansible,我正在使用geerlingguy.firewall ansible galaxy角色添加iptables规则。其中有一个firewall_additional_rules list变量,我在其中添加了一些脚本,以允许来自某些IP,我希望提供另一个list变量 white_listed_ips: - 1.1.1.1 - 1.1.1.2 等 我希望能够通过循环从白色列表的ips列表中生成防火墙附加规则列表。然而,我找不到任何方法来做到这一点。您能循环变量并添加到yaml中的数组吗 所以

我正在使用geerlingguy.firewall ansible galaxy角色添加iptables规则。其中有一个firewall_additional_rules list变量,我在其中添加了一些脚本,以允许来自某些IP,我希望提供另一个list变量

white_listed_ips:
   - 1.1.1.1
   - 1.1.1.2

我希望能够通过循环从白色列表的ips列表中生成防火墙附加规则列表。然而,我找不到任何方法来做到这一点。您能循环变量并添加到yaml中的数组吗

所以我想在一个var文件中做类似的事情(我知道这不起作用,请允许我)

这是进入角色中的jinja2模板,您可以在这里看到:

Ansible Playbook、vars文件等不是jinja2模板,因此正如您所说的,像
{%for…%}
这样的jinja2结构在它们中不起作用。但话虽如此,只需简单地将jinja2代码移动到它应该属于的模板中即可

如果您查看中的
防火墙\u其他\u规则
,此处仅参考:

# 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 %}

你能详细解释一下“这行不通”吗?错误消息。。看看示例(),您的代码应该已经运行了。我正在尝试在var文件中执行类似的操作,而不是jinja templateYep。将IP转换为正常jinja上下文之外的规则的唯一方法将涉及
map
和regex。在模板中执行此操作要容易得多。列表->列表目前在Ansible上很难看。编辑从Ansible galaxy下载的角色是可以的。它不像jquery或其他不应该被黑客攻击的库。我认为OP试图在不编辑下载角色的情况下添加自定义规则这不是我要问的,我不想编辑角色,因为这意味着它在其他地方不可用。我要求用更动态的方式来改变yaml中的变量……难道没有办法添加到数组/列表/任何东西吗?我将jinja2语法放在那里,作为我在var文件中尝试执行的示例。如果我不能做到这一点,有没有办法在我的项目中本地覆盖jinja2模板?我面临的挑战与@MichaelMallett完全相同。
{% 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 %}