【问题标题】:Adding to yaml list using a loop使用循环添加到 yaml 列表
【发布时间】:2015-06-24 08:57:39
【问题描述】:

我正在使用 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

【问题讨论】:

标签: loops variables yaml jinja2 ansible


【解决方案1】:

Ansible playbooks、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 %}

【讨论】:

  • 是的。将 ips 转换为正常 jinja 上下文之外的规则的唯一方法将涉及map 和正则表达式。在模板中执行此操作要容易得多。列表 -> 列表目前对于 Ansible 来说很难看。
  • 可以编辑从 ansible-galaxy 下载的角色。它不像 jquery 或一些不应被黑客攻击的此类库。我认为 OP 正在尝试添加自定义规则而不编辑下载的角色
  • 这不是我要问的,我不想编辑角色,因为这意味着它不能在其他地方使用。我正在寻求更动态的方法来更改 yaml 中的变量……有没有办法添加到数组/列表/其他中?我将 jinja2 语法放在那里作为我在 var 文件中尝试执行的操作的示例。如果我不能这样做,有没有办法在我的项目中本地覆盖 jinja2 模板?
  • 我面临的挑战与@MichaelMallett 完全相同。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 2014-01-22
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多