如何在Ansible中的不同清单之间共享group_vars?

cev*_*ing 9 ansible

Ansible最佳做法文档建议分隔库存:

库存/
   生产/
      hosts.ini#生产服务器的库存文件
      group_vars /
         group1#在这里,我们将变量分配给特定的组
         group2#“”
      host_vars /
         hostname1#如果系统需要特定的变量,请将其放在此处
         hostname2#“”

   分期/
      hosts.ini#用于暂存环境的清单文件
      group_vars /
         group1#在这里,我们将变量分配给特定的组
         group2#“”
      host_vars /
         stagehost1#如果系统需要特定的变量,请将其放在此处
         stagehost2#“”

我的演出和生产环境的结构是相同的。我在两个环境中都有相同的组。事实证明,对于相同的组,我也具有相同的group_vars。这意味着我想消除冗余。

有没有办法在不同清单之间共享一些group_var?

作为解决方法,我开始将共享的group_vars放入角色中。

my_var:
  my_group:
    - { var1: 1, var2: 2 }
Run Code Online (Sandbox Code Playgroud)

这样可以通过将主机的组与定义的var相交来遍历某些var:

with_items: "{{group_names | intersect(my_var.keys())}}"
Run Code Online (Sandbox Code Playgroud)

但这很难理解,我认为角色不应该对团体一无所知。

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

yda*_*coR 7

这里的简单选项(以及我们所做的)只是符号链接通用组变量文件。

例如,我们可能有一个像 NGINX 这样的通用角色,然后是该角色的一些具体用例。在这种情况下,我们创建一个组变量文件,该文件为每个具体用例使用 NGINX 角色,然后简单地将这些组变量文件符号链接到适当的文件夹中。

我们的项目文件夹结构可能如下所示(大幅简化):

.
??? inventories
?   ??? bar-dev
?   ?   ??? group_vars
?   ?   ?   ??? bar.yml -> ../../shared/bar.yml
?   ?   ?   ??? dev.yml -> ../../shared/dev.yml
?   ?   ??? inventory
?   ??? bar-prod
?   ?   ??? group_vars
?   ?   ?   ??? bar.yml -> ../../shared/bar.yml
?   ?   ?   ??? prod.yml -> ../../shared/prod.yml
?   ?   ??? inventory
?   ??? bar-test
?   ?   ??? group_vars
?   ?   ?   ??? bar.yml -> ../../shared/bar.yml
?   ?   ?   ??? test.yml -> ../../shared/test.yml
?   ?   ??? inventory
?   ??? foo-dev
?   ?   ??? group_vars
?   ?   ?   ??? dev.yml -> ../../shared/dev.yml
?   ?   ?   ??? foo.yml -> ../../shared/foo.yml
?   ?   ??? inventory
?   ??? foo-prod
?   ?   ??? group_vars
?   ?   ?   ??? foo.yml -> ../../shared/foo.yml
?   ?   ?   ??? prod.yml -> ../../shared/prod.yml
?   ?   ??? inventory
?   ??? foo-test
?   ?   ??? group_vars
?   ?   ?   ??? foo.yml -> ../../shared/foo.yml
?   ?   ?   ??? test.yml -> ../../shared/test.yml
?   ?   ??? inventory
?   ??? shared
?       ??? bar.yml
?       ??? dev.yml
?       ??? foo.yml
?       ??? prod.yml
?       ??? test.yml
??? roles
    ??? nginx
        ??? defaults
        ?   ??? main.yml
        ??? meta
        ?   ??? main.yml
        ??? tasks
        ?   ??? main.yml
        ??? templates
            ??? main.yml
Run Code Online (Sandbox Code Playgroud)

现在我们的清单文件可以让主机使用这些共享组变量,只需将主机放在正确的组中即可。


cev*_*ing 7

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

现在,我将所有清单都放在同一目录中:

production.ini
reference.ini
Run Code Online (Sandbox Code Playgroud)

而且我要确保每个清单都定义一个组,其中包括具有阶段名称的所有主机。

该文件production.ini具有以下组production

[production:children]
all_production_hosts
Run Code Online (Sandbox Code Playgroud)

该文件reference.ini具有组reference

[reference:children]
all_reference_hosts
Run Code Online (Sandbox Code Playgroud)

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

group_vars/production.yml
group_vars/reference.yml
Run Code Online (Sandbox Code Playgroud)

每个文件都定义一个stage变量。该文件production.yml定义了以下内容:

---
stage: production
Run Code Online (Sandbox Code Playgroud)

该文件reference.yml定义为:

---
stage: reference
Run Code Online (Sandbox Code Playgroud)

这样就可以在生产和参考之间共享其他所有内容。但是主机完全不同。通过使用正确的清单,剧本可以在生产主机或参考主机上运行:

ansible-playbook -i production.ini site.yml
ansible-playbook -i reference.ini site.yml
Run Code Online (Sandbox Code Playgroud)

如果site.yml或角色在生产和参考环境中的行为必须有所不同,则可以使用stage变量中的条件。但是我尽量避免这种情况。因为最好将所有差异移到登台文件production.yml和中的等效定义中reference.yml

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

users:
  - alice
  - bob
  - mallory
Run Code Online (Sandbox Code Playgroud)

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

effective_users: >-
  {{ users }}
Run Code Online (Sandbox Code Playgroud)

但是在production.yml我可以排除mallory

effective_users: >-
  {{ users | difference(['mallory']) }}
Run Code Online (Sandbox Code Playgroud)

剧本或角色无需在两个阶段之间进行区分,他们只需使用group即可effective_users。只需选择清单,该组就会自动包含正确的用户列表。


Kon*_*rov 5

您也可以放在group_varsplaybook 目录中。更多信息

Ansible 会为所有库存挑选它们。