gpt4 book ai didi

ansible - 如何在 Ansible 中的不同库存之间共享 group_vars?

转载 作者:行者123 更新时间:2023-12-02 17:40:23 25 4
gpt4 key购买 nike

Ansible 最佳实践文档 recommends分离库存:

inventories/   production/      hosts.ini           # inventory file for production servers      group_vars/         group1           # here we assign variables to particular groups         group2           # ""      host_vars/         hostname1        # if systems need specific variables, put them here         hostname2        # ""   staging/      hosts.ini           # inventory file for staging environment      group_vars/         group1           # here we assign variables to particular groups         group2           # ""      host_vars/         stagehost1       # if systems need specific variables, put them here         stagehost2       # ""

My staging and production environments are structured in the same way. I have in both environments the same groups. And it turns out that I have also the same group_vars for the same groups. This means redundancy I would like to wipe out.

Is there a way to share some group_vars between different inventories?

As a work-around I started to put shared group_vars into the roles.

my_var:
my_group:
- { var1: 1, var2: 2 }

这使得可以通过将主机组与定义的变量相交来迭代某些变量:

with_items: "{{group_names | intersect(my_var.keys())}}"

但这理解起来有点复杂,我认为角色不应该了解有关组的任何信息。

我想分离大部分库存,但以易于理解的方式共享一些 group_vars。是否可以将全局 group_vars 与库存特定的 group_vars 合并?

最佳答案

我放弃了遵循 Ansible 推荐的想法。现在一年过去了,我确信 Ansible 的建议对我的要求没有用。相反,我认为在不同阶段之间尽可能多地共享很重要。

现在我将所有库存放在同一个目录中:

production.ini
reference.ini

我会注意每个 list 都定义一个组,其中包括具有阶段名称的所有主机。

文件生产.ini具有组生产:

[production:children]
all_production_hosts

文件reference.ini具有组reference:

[reference:children]
all_reference_hosts

我只有一个 group_vars 目录,我在其中为每个暂存组定义一个文件:

group_vars/production.yml
group_vars/reference.yml

每个文件定义一个stage变量。文件 product.yml 定义了这一点:

---
stage: production

文件 reference.yml 定义:

---
stage: reference

这使得在生产和引用之间共享所有其他内容成为可能。但主人却完全不同。通过使用正确的 list ,剧本可以在生产主机或引用主机上运行:

ansible-playbook -i production.ini site.yml
ansible-playbook -i reference.ini site.yml

如果 site.yml 或角色需要在生产环境和引用环境中表现略有不同,则可以使用 stage 变量来使用条件。但我什至试图避免这种情况。因为最好将所有差异移至暂存文件 development.ymlreference.yml 中的等效定义。

例如,如果group_vars/all.yml定义了一些用户:

users:
- alice
- bob
- mallory

我想在两个环境中创建用户,但我想从生产环境中排除 mallory,我可以定义一个名为 effective_users 的新组。在 reference.yml 中,它与 users 列表相同:

effective_users: >-
{{ users }}

但是在生产.yml中我可以排除mallory:

effective_users: >-
{{ users | difference(['mallory']) }}

剧本或角色不需要区分这两个阶段,它们可以简单地使用组 effective_users 。只需选择库存,该组就会自动包含正确的用户列表。

关于ansible - 如何在 Ansible 中的不同库存之间共享 group_vars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40606890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com