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合并?
这里的简单选项(以及我们所做的)只是符号链接通用组变量文件。
例如,我们可能有一个像 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)
现在我们的清单文件可以让主机使用这些共享组变量,只需将主机放在正确的组中即可。
我放弃了遵循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。只需选择清单,该组就会自动包含正确的用户列表。
| 归档时间: |
|
| 查看次数: |
5433 次 |
| 最近记录: |