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将在模板化下一个文件的包含路径之前评估每个任务的结果。
Makehiera_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未定义。我猜是因为事实:不是吗?