Mav*_*ine 6 puppet ansible hiera ansible-playbook
hiera.yaml
---
: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
Run Code Online (Sandbox Code Playgroud)
我们目前有这个hiera配置.因此,配置按以下顺序合并:common.yaml> users.yaml> sites.yaml> hosts.yaml> types/xxx_vxxx.yaml>等.对于变量顶层次结构,仅当该文件存在时才会被覆盖.
例如:common.yaml
server:
instance_type: m3.medium
Run Code Online (Sandbox Code Playgroud)
site_config/mysite.yaml
server:
instance_type: m4.large
Run Code Online (Sandbox Code Playgroud)
因此对于所有其他站点,实例类型将是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
Run Code Online (Sandbox Code Playgroud)
这将尝试从结构类似于您的问题的文件中加载变量。
不存在的文件将被忽略(因为failed_when: false)。
文件按此列表的顺序(从上到下)加载,覆盖以前的值。
陷阱:
您在列表中使用的所有变量都必须定义(例如,host_type在此示例中不能在 中定义common.yml),因为要迭代的项目列表在执行整个循环之前已模板化(请参阅更新以获取解决方法)。
Ansible 覆盖(替换)字典默认情况下,我猜你的用例期望合并行为。这可以通过hash_behavior设置来实现——但这对于 Ansible 剧本来说是不寻常的。
PS您可以通过改变改变顶部到底部的合并行为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
Run Code Online (Sandbox Code Playgroud)
在你的主要剧本中:
- include: hiera_inc.yml
Run Code Online (Sandbox Code Playgroud)
这看起来有点笨拙,但这样一来,你可以定义host_type在common.yaml并且它将在下一个任务的路径模板中得到尊重。
使用 Ansible 2.2,可以include_vars进入命名变量(不是全局主机空间),因此您可以将_vars 包含到hiera_facts并使用combine过滤器合并它们,而不会改变全局哈希行为。