我对Ansible还是陌生的,所以到目前为止,一切都是非常丰富的学习经验。.请放轻松!
我希望以最佳实践的方式实现以下目标,但是我似乎不太愿意为此而做,或者,我希望有一种更有效的方法来实现相同的目标。 / p>
具体来说,我正在尝试应用一个设置了多个默认参数的角色。例如,一些特定于是否需要xinet的东西。通常,答案是否定的,所以它是默认值。在我们的环境中某些系统确实依赖于此,因此当它属于指定组的一部分时,我想将默认值设置为true。
我已经想到了一些实现基本目标的方法,但是我不确定在Ansible文化的核心中,什么是最佳实践?
选项:
A-创建并复制整个角色,仅将复制的角色应用于xinetd服务器 -对此并不忠实,因为这需要维护基本相同角色的多个副本。
B-修改基础任务以在定义特定组变量时排除运行作业 -级别太低了,我担心这些更改会随着时间的推移而被忽略。
C-也许使用组变量是正确的方法吗?我一直在做一些研究,并提供了一些例子,但我还没有到那里...寻找任何好的建议/建议,谢谢!
答案 0 :(得分:2)
常见的模式将出现在您的角色默认文件中:
some_feature_enabled: false
然后,将该变量重新定义为组变量,设置为true。有两种方法:
1)在库存托管文件中:
[somegroup]
somehost
[somegroup:vars]
some_feature_enabled: true
2)在该组的专用group_vars文件中。在包含您的剧本的目录或包含清单文件的目录中创建一个名为group_vars
的目录,并在其中创建与您的组somegroup
相同的文件。在此文件中:
some_feature_enabled: true
最后为您的任务添加一个条件:
- debug:
msg: "Only print this message when somefeature is enabled
when: some_feature_enabled
如果您有一堆相关任务可以组合在一起并基于一个值进行切换,则可以将它们包装在一个块中:
- block:
- debug:
msg: "First task"
- debug:
msg: "Second task"
when: some_feature_enabled
如果整个角色都是有条件的,则可以将测试放在角色级别:
roles:
- { role: somerole, when: some_feature_enabled }
This doc为您提供了有关Ansible变量的所有详细信息,至关重要的是包括有关重复变量优先级的信息。要让Ansible团队了解最佳做法,请check out this doc(如果您还没有这样做的话)。