在 Ansible 剧本中为 ufw 任务动态设置变量内容

Dynamically set variable content in Ansible playbook for ufw task

我目前正在尝试找到一种在某些主机上动态创建一些防火墙规则(使用 ufw ansible 模块)的方法。在当前上下文中,我们谈论的是 docker 群。

我想做的是为每个源 ip 创建一组规则(不同的协议、端口),但要随着主机的数量(和 IP)动态扩展,这样无论数量是多少或节点的 IP,它总是最终在每个节点上创建一组规则 PER 节点。理想情况下,我也可以排除 运行 所在的当前主机。

我对 ansible 不是很熟悉,我不确定它是否可行,因为它可能需要在创建规则时在一个循环中循环。 我尝试使用 ip_swarm: "{{groups['all']|join(',') }}" 加入组内的地址,但 ufw 不允许您以这种方式创建规则,并且看起来每个 port/ip/proto 需要一行(或者 ansible 确实如此,但看着模块的代码,好像是ufw).

我假设是否有办法,这是在定义变量时使用一些 jinja 循环?或者 with_subelements ?

这是我当前的代码,尽管这无济于事,因为这是针对一个变量保存一个字符串的情况,该字符串包含 IP 的逗号分隔值:

- name: Regles pare feu pour docker swarm
  ufw:
    rule: allow
    direction: "{{ item.direction }}"
    proto: "{{ item.proto }}"
    port: "{{ item.port }}"
    from_ip: "{{ item.from_ip }}"
    state: reloaded
  loop:
    - direction: "in"
      proto: "tcp"
      port: "2377"
      from_ip: " {{ ip_swarm }}"
    - direction: "in"
      proto: "tcp"
      port: "7946"
      from_ip: " {{ ip_swarm }}"
    - direction: "in"
      proto: "udp"
      port: "7946"
      from_ip: " {{ ip_swarm }}"
    - direction: "in"
      proto: "udp"
      port: "4789"
      from_ip: " {{ ip_swarm }}"

给你 :) 如果你有什么想法,我很乐意采纳。祝你有美好的一天!

好吧,事实证明它比我想要的要简单得多。 Ansible 确实有嵌套循环,使用 with_nested,或者使用非弃用选项,loopproduct 过滤器(第一个选项更容易阅读)。参见 https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html

我的包含 FW 参数的 vars 文件(用于指示):

---
liste_regle_pare_feu:
  - direction: "in"
    proto: "tcp"
    port: "2377"
  - direction: "in"
    proto: "tcp"
    port: "7946"
  - direction: "in"
    proto: "udp"
    port: "7946"
  - direction: "in"
    proto: "udp"
    port: "4789"

和任务本身:

- name: Regles pare feu pour docker swarm
  ufw:
    rule: allow
    direction: "{{ item.1.direction }}"
    proto: "{{ item.1.proto }}"
    port: "{{ item.1.port }}"
    from_ip: "{{ item.0 }}"
  loop: "{{ groups['all']|product(liste_regle_pare_feu)|list }}"

对于第一个对象(此处 groups['all'],所有 IP 的列表)中的每个项目,循环将遍历我的规则列表(哈希表)。有关产品过滤器的详细信息,请参阅文档