(这是来自the mailing list的交叉帖子,因为我在那里没有得到任何答案。)
我最近使用https://galaxy.ansible.com/tersmitten/fail2ban/在我的一台服务器上为ssh设置了fail2ban。这很容易,我喜欢星系。
现在,我想扩展fail2ban以阻止在Apache中进行过多次基本身份验证检查失败的IP。由于我的所有主机都运行ssh,但并非所有运行Apache,我为此创建了一个新角色(巧妙地命名为'apache',而第一个是'common')。但是,如fail2ban角色的README中所示,单个服务的配置是使用数组,fail2ban_services完成的,并且重新定义在我的apache角色中,会覆盖共同定义的内容(或者,由于时间安排,反之亦然)。
我已经看到了I can change the hash behavior,这似乎可以做我想要的。然而,我对此持谨慎态度,因为这是一次全球变化。
还有the combine filter for jinja,但reports表示我无法做我想做的事,这将是
fail2ban_services: "{{ fail2ban_services | combine({...}) }}"
还有其他方法可以进行此组合吗?或许我是以错误的方式解决这个问题,应该以不同的方式构建它?
我正在使用ansible 2.0.1.0。
答案 0 :(得分:1)
hash_behavior: merge
和combine
过滤器没有帮助,因为它们适用于哈希。如果我得到了fail2ban的文档,那么fail2ban_services
变量就是哈希列表:
fail2ban_services:
- name: serviceA
...
- name: serviceB
...
- name: serviceC
...
您可以轻松合并列表:
listA: "{{ listB + listC }}"
...但是同样的限制适用于联合收割机过滤器。你不能覆盖一个依赖于它自己的变量,Ansible会抱怨一些"检测到的递归循环"或者。不知道为什么这对Ansible来说是个大问题,在a = a + b
做任何事都不应该是递归的。但不幸的是,它是怎么回事。
如果我了解您的说明,则在您的角色fail2ban_services
中定义common
列表。然后,您希望在角色apache
中重新定义它。实际上如何实现fail2ban角色?那你的剧本中有3个角色吗?
roles:
- common
- apache
- fail2ban
目标是,第一个角色定义了最后一个角色使用的内容?
鉴于上述限制,我唯一的想法就是重命名你的变量。角色common
将定义fail2ban_services_common
,角色apache
将定义fail2ban_services_apache
,然后您将合并后的值传递给fail2ban
:
roles:
- common
- apache
- role: fail2ban
fail2ban_services: "{{ fail2ban_services_common + fail2ban_services_apache}}"