在另一个角色

时间:2016-03-17 20:43:09

标签: ansible ansible-playbook

(这是来自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。

1 个答案:

答案 0 :(得分:1)

hash_behavior: mergecombine过滤器没有帮助,因为它们适用于哈希。如果我得到了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}}"