如何正确管理ansible变量和group_vars?

时间:2019-05-02 10:49:25

标签: ansible

场景:

  • 一个拥有1名经理和3名工人的码头工人
  • 每个主机都需要防火墙
  • Manager防火墙具有特定的端口
  • Worker防火墙具有特定的端口
  • 所有节点还具有共享端口

all.yml

ports
  - 22
  - 2376
  - 2377

manager.yml

ports
  - 443

worker.yml

ports
  - 80

需要管理节点的输出

ports
  - 22
  - 2376
  - 2377
  - 443

需要工作节点的输出

ports
  - 22
  - 2376
  - 2377
  - 80

问题:

由于ansible允许group_vars,并且模型将替换 vars而不是 merge ,因此如何管理上述情况而不必在每个group_vars文件?

我怀疑答案是重复变量。我已经读过有关允许ansible改用merge的内容,但这仅适用于字典,而不适用于上述列表,并且对此一无所知。

我问的原因是,当使用银河中的股票角色(如防火墙角色)时,(据我所知)正确使用group_vars并列出基于角色几乎是不可能的。是一个或另一个。

上面的示例过于简化,在现实世界中,端口定义大约为6行配置,并且显然重复很多。

2 个答案:

答案 0 :(得分:0)

这是正确的

  

模型是替换var而不是合并

鉴于文件位于group_vars目录中,因此可以选择在manager.yml中声明特定变量

manager_ports:
  - 443

和worker.yml

worker_ports:
  - 80

然后,例如,让我们合并剧本中的列表(未测试)

- hosts: manager
  tasks:
    - set_fact:
        ports: "{{ ports + manager_ports }}"

- hosts: worker
  tasks:
    - set_fact:
        ports: "{{ ports + worker_ports }}"

详细信息可以在Variable precedence: Where should I put a variable?

部分中找到

答案 1 :(得分:0)

好吧,假设您没有将let value:[String:Any] = ["key":"value"] ref.child("Data").childByAutoId().setValue(value) 分配给localhost之外的其他组,则可以在all文件中引用它:

all.yml:

group_vars

manager.yml:

ports:
  - 22
  - 2376
  - 2377

worker.yml:

ports:
  - "{{ hostvars['localhost'].ports }}"
  - 443