Ansible 附加到一个可执行的任务';s变量在另一个角色中

Ansible 附加到一个可执行的任务';s变量在另一个角色中,ansible,ansible-playbook,Ansible,Ansible Playbook,(这是来自的交叉帖子,因为我在那里没有得到任何答案。) 我最近使用在我的一台服务器上为ssh设置了fail2ban。这很容易,我喜欢银河系 现在,我想扩展fail2ban,以阻止在Apache中多次通过基本身份验证检查的IP。由于我的所有主机都运行ssh,但不是所有主机都运行Apache,因此我为此创建了一个新角色(巧妙地命名为“Apache”,而第一个是“common”)。但是,如fail2ban角色的自述文件所示,单个服务的配置是通过一个数组完成的,fail2ban_服务,并且在我的apac

(这是来自的交叉帖子,因为我在那里没有得到任何答案。)

我最近使用在我的一台服务器上为ssh设置了fail2ban。这很容易,我喜欢银河系

现在,我想扩展fail2ban,以阻止在Apache中多次通过基本身份验证检查的IP。由于我的所有主机都运行ssh,但不是所有主机都运行Apache,因此我为此创建了一个新角色(巧妙地命名为“Apache”,而第一个是“common”)。但是,如fail2ban角色的自述文件所示,单个服务的配置是通过一个数组完成的,fail2ban_服务,并且在我的apache角色中重新定义它会覆盖公共定义的内容(或者,由于时间原因,反之亦然)

我看到了,这似乎是我想要的。然而,我对此持谨慎态度,因为这是一个全球性的变化

也有,但表明我不能做我想做的事,这将是

fail2ban_services: "{{ fail2ban_services | combine({...}) }}"
有没有其他方法可以进行这种组合?或者,我是不是走错了路,应该以不同的方式进行架构


我使用的是ansible 2.0.1.0。

hash\u行为:merge
combine
过滤器没有帮助,因为它们是用于哈希的。如果我正确获取了fail2ban的文档,
fail2ban_services
变量是一个哈希列表:

fail2ban_services:
  - name: serviceA
    ...
  - name: serviceB
    ...
  - name: serviceC
    ...
您可以轻松合并列表:

listA: "{{ listB + listC }}"
。。。但与联合收割机滤清器相同的限制也适用。您不能重写依赖于自身的变量,Ansible会抱怨某些“检测到的递归循环”等等。不知道为什么这对Ansible来说是一个如此大的问题,在执行
a=a+b
时不应该递归。但不幸的是,事情就是这样

如果我理解您的描述,您可以在您的角色
common
中定义
fail2ban\u services
列表。然后,稍后您要在角色
apache
中重新定义它。fail2ban角色实际上是如何实现的?你的剧本里有三个角色吗

roles:
  - common
  - apache
  - fail2ban
目标是,第一个角色定义最后一个角色使用的是什么

鉴于上述限制,我唯一的想法就是重命名变量。角色
common
将定义
fail2ban_服务\u common
,角色
apache
将定义
fail2ban_服务\u apache
,然后将组合值传递给
fail2ban

roles:
  - common
  - apache
  - role: fail2ban
    fail2ban_services: "{{ fail2ban_services_common + fail2ban_services_apache}}"

common
是一个依赖于galaxy的fail2ban角色的角色(也就是说,
roles/common/meta/main.yaml
指定。
apache
是另一个也依赖于fail2ban角色的角色。我想在
common
中定义ssh相关的fail2ban规则,在
apache
中定义apache相关的fail2ban规则,并将两者结合起来。[…]由于fail2ban是通用的,并且可能由任意数量的变量或其他角色所依赖,因此它不能硬编码可变数量的变量名(而且,它来自galaxy,不是我的,所以我必须分叉).我在想,也许我最好手动创建模板,以便将东西送入
监狱.d
,但我只是想弄清楚ansible是否真的无法处理这种模式,或者我是否遗漏了一些东西。