hiera.yaml
—:层次: - node /%{host_fqdn} - site_config /% {host_site_name} - site_config / perf _%{host_performance_class} - site_config /% {host_type} _v%{host_type_version} - site /%{…
它似乎比Hiera更基本,但是有人创建了一个具有类似语法的基本ansible查找插件
https://github.com/sailthru/ansible-oss/tree/master/tools/echelon
我认为@Xiong是对的,你应该在Ansible中采用变量方式。 您可以设置灵活库存,其中vars优先级从一般到特定。
但是如果它有帮助,你可以试试这个片段:
--- - hosts: loc-test tasks: - include_vars: hiera/{{ item }} with_items: - common.yml - "node/{{ ansible_fqdn }}/users.yml" - "node/{{ ansible_fqdn }}/sites.yml" - "node/{{ ansible_fqdn }}/types/{{ host_type }}_v{{ host_type_version }}.yml" failed_when: false - debug: var=server
这将尝试从结构与您的问题类似的文件中加载变量。 不存在的文件被忽略(因为 failed_when: false )。 文件按此列表的顺序加载(从上到下),覆盖以前的值。
failed_when: false
的 陷阱: 强>
必须定义您在列表中使用的所有变量(例如 host_type 在这个例子中无法定义 common.yml ),因为要在整个循环执行之前模板化要迭代的项目列表(请参阅更新以获取变通方法)。
host_type
common.yml
Ansible默认覆盖(替换)dicts,我猜你的用例需要合并行为。这可以通过实现 hash_behavior 设置 - 但这对于Ansible剧本来说是不寻常的。
的 附: 强> 您可以通过更改来改变从上到下合并的行为 with_items 至 with_first_found 并反转列表(从具体到一般)。在这种情况下,Ansible将从找到的第一个文件加载变量。
with_items
with_first_found
的 更新: 强> 使用以前包含的变量包含在文件路径中。
您可以将循环拆分为多个任务,因此Ansible将在模拟下一个文件的包含路径之前评估每个任务的结果。 使 hiera_inc.yml :
hiera_inc.yml
- include_vars: hiera/common.yml failed_when: false - include_vars: hiera/node/{{ ansible_fqdn }}/users.yml failed_when: false - include_vars: hiera/node/{{ ansible_fqdn }}/sites.yml failed_when: false - include_vars: hiera/node/{{ ansible_fqdn }}/types/{{ host_type | default('none') }}_v{{ host_type_version | default('none') }}.yml failed_when: false
在你的主要剧本中:
- include: hiera_inc.yml
这看起来有点笨拙,但这种方式可以定义 host_type 在 common.yaml 它将在模仿下一个任务的道路上受到尊重。
common.yaml
有了Ansible 2.2,就可以了 include_vars 到命名变量(不是全局主机空间),所以你可以include_vars hiera_facts 并使用 combine 过滤以合并它们而不改变全局散列行为。
include_vars
hiera_facts
combine
我对Puppet不熟悉,所以这可能不是直接映射。但我理解你的问题是“如何在一个共享位置使用值,但是覆盖不同服务器的定义?”。在Ansible,你这样做 变量 。
您可以 直接在库存中定义变量 。您可以 在主机和组特定文件中定义变量 。您可以 在playbook级别定义变量 。您可以 在角色级别定义变量 。哎呀,你甚至可以 使用命令行开关定义变量 。
在所有这些地方之间,您应该能够定义覆盖以适合您的情况。你可能想看看 关于如何确定变量定义的文档部分 了解更多信息。