Ansible中的傀儡hiera等价物

Ansible中的傀儡hiera等价物,ansible,puppet,ansible-playbook,hiera,Ansible,Puppet,Ansible Playbook,Hiera,希拉·亚马尔 --- :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/%

希拉·亚马尔

---
: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>等。对于变量顶层层次结构,仅当该文件存在时,配置才会被覆盖

例如: 普通亚马尔

server:
  instance_type: m3.medium
站点配置/mysite.yaml

server:
  instance_type: m4.large
因此,对于所有其他站点,实例类型将为m3.medium,但仅对于mysite,实例类型将为m4.large


如何在Ansible中实现同样的效果?

我不熟悉Puppet,因此这可能不是直接映射。但我理解您的问题是“如何在一个共享位置使用值,但覆盖不同服务器的值定义?”。在Ansible中,您可以使用

你可以。你可以。你可以。你可以。见鬼,你甚至可以


在所有这些地方之间,您应该能够定义覆盖以适应您的情况。您可能想查看更多信息。

我认为@Xiong认为您应该在Ansible中使用变量的方式是正确的。
您可以设置可变优先级的灵活库存,从常规到特定

但如果有帮助,您可以尝试以下代码段:

---
- 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
这将尝试从结构与您的问题类似的文件中加载变量。
忽略不存在的文件(因为当:false时,
失败)。
文件按此列表的顺序(从上到下)加载,覆盖以前的值

Gotchas:

  • 必须定义列表中使用的所有变量(例如,本例中的
    host\u type
    不能在
    common.yml
    中定义),因为要迭代的项目列表是在整个循环执行之前模板化的(请参阅更新了解解决方法)

  • Ansible overwrite(replace)默认情况下,我想您的用例需要合并行为。这可以通过设置来实现——但这对于Ansible剧本来说并不常见

p.S.您可以通过将
与_项
更改为
与_first _found
来改变自上而下的合并行为,并反转列表(从特定到一般)。在这种情况下,Ansible将从找到的第一个文件加载变量

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

您可以将循环拆分为多个任务,因此Ansible将在模板化下一个文件的包含路径之前评估每个任务的结果。
Make
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
这看起来有点笨拙,但通过这种方式,您可以在
common.yaml
中定义
host\u类型
,并在为下一个任务创建路径模板时使用它


使用Ansible 2.2,可以在命名变量(而不是全局主机空间)中包含变量,因此您可以在hiera事实中包含变量,并使用组合过滤器合并它们,而不改变全局哈希行为。

它似乎比hiera更基本,但是有人用类似的语法创建了一个基本的ansible查找插件


不,他问的是如何在Ansible中按优先级进行动态数据查找。好的,哇:这是一个超级真实的问题。我想说这在本质上是不可能的。Puppet的动态数据优先查找方式的整个概念与Puppet作为软件的运行方式紧密相连,我认为它不适合Ansible试图实现的目标。这听起来是一个很酷的FOSS新想法。谢谢康斯坦丁。序列列表表示法实际上并不重要。但是预定义变量将是一个问题。例如,hosts_类型在hosts.yamlI中定义。我仍在学习ansible。像这样的东西行吗?这非常接近,可能可以调整为真正的类似功能。@MavWolverine我已经用变通方法更新了我的答案。@KonstantinSuvorov ansible_fqdn未定义。我猜是因为事实:不是吗?