gpt4 book ai didi

ansible - Ansible 中的 Puppet hiera 等价物

转载 作者:行者123 更新时间:2023-12-04 15:31:47 26 4
gpt4 key购买 nike

层级文件

---
:hierarchy:
- node/%{host_fqdn}
- site_config/%{host_site_name}
- site_config/perf_%{host_performance_class}
- site_config/%{host_type}_v%{host_type_version}
- site/%{host_site_name}
- environments/%{site_environment}
- types/%{host_type}_v%{host_type_version}
- hosts
- sites
- users
- common
# options are native, deep, deeper
:merge_behavior: deeper

我们目前有这个 hiera 配置。因此,配置按以下顺序合并: common.yaml > users.yaml > sites.yaml > hosts.yaml > types/xxx_vxxx.yaml > etc. 对于变量顶级层次结构,仅当该文件存在时才会被覆盖。

例如:
常见的.yaml
server:
instance_type: m3.medium

site_config/mysite.yaml
server:
instance_type: m4.large

因此,对于所有其他站点,实例类型将是 m3.medium,但仅对于 mysite 它将是 m4.large。

如何在 Ansible 中实现相同的目标?

最佳答案

我认为@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)。
文件按此列表的顺序(从上到下)加载,覆盖以前的值。

陷阱:
  • 您在列表中使用的所有变量都必须定义(例如 host_type 在本例中不能在 common.yml 中定义),因为要迭代的项目列表在执行整个循环之前已模板化(请参阅更新以获取解决方法) .
  • Ansible 覆盖(替换)字典默认情况下,我猜你的用例期望合并行为。这可以通过 hash_behavior 实现设置——但这对于 Ansible 剧本来说是不寻常的。

  • 附言您可以通过更改 with_items 来改变从上到下的合并行为至 with_first_found并反转列表(从特定到一般)。在这种情况下,Ansible 将从找到的第一个文件加载变量。

    更新:使用先前包含在文件路径中的变量。

    您可以将循环拆分为多个任务,因此 Ansible 将在模板化下一个文件的包含路径之前评估每个任务的结果。
    制作 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_typecommon.yaml它将在下一个任务的路径模板中得到尊重。

    使用 Ansible 2.2 将有可能 include_vars到命名变量(不是全局主机空间),因此您可以将_vars 包含到 hiera_facts 中并使用 combine过滤以合并它们而不改变全局散列行为。

    关于ansible - Ansible 中的 Puppet hiera 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39473719/

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