gpt4 book ai didi

ansible - 根据其他主机的变量构建模板

转载 作者:行者123 更新时间:2023-12-03 07:53:31 25 4
gpt4 key购买 nike

我想构建一个针对每个主机都不同的模板。
假设这四个主机具有以下变量:

# host_1 host_vars
my:
info:
- name: one
- name: two

# host_2 host_vars
my:
info:
- name: two
- name: three

# host_3 host_vars
my:
info:
- name: one
- name: three

# host_4 host_vars
my:
info:
- name: whatever

模板的结果应该是:

# for host_1
one host_1 host_3
two host_1 host_2

# for host_2
two host_2 host_1
three host_2 host_3

# for host_3
one host_3 host_1
three host_3 host_2

# for host_4
whatever host_4

我的问题是:我想保持配置简单。
我应该在哪里构建这个逻辑?
我应该在 Ansible 运行时在主机之间共享事实,然后对其进行模板化吗?或者是否有解决方案可以在模板化过程中轻松构建此解决方案?

最佳答案

因为您可以借助特殊变量 hostvars 来访问其他主机的变量,您绝对可以模板化一些变量也存在于另一个主机变量中的事实。

这样做的模板示例是:

{% for info in my.info %}
{{- info.name -}}
{% for host in hostvars
| dict2items
| selectattr('value.my.info', 'defined')
if host.value.my.info
| selectattr('name', '==', info.name)
%} {{ host.key }}{% endfor %}

{% endfor %}

在此示例中,我们使用:

  • 过滤器dict2items ,从主机字典中创建主机字典列表,即 hostvars
  • 过滤器selectattr ,两次,过滤掉任何未定义 my.info 的主机,然后过滤掉与以下主机不共享相同 info.name 的其他主机当前主机
  • 一个for ... if ...构造以拒绝任何与当前主机不具有相同 info[].name 的主机

例如,对于库存:

all:
children:
demo:
hosts:
host_1:
ansible_host: ansible-node-1
my:
info:
- name: one
- name: two
host_2:
ansible_host: ansible-node-2
my:
info:
- name: two
- name: three
host_3:
ansible_host: ansible-node-3
my:
info:
- name: one
- name: three
host_4:
ansible_host: ansible-node-4
my:
info:
- name: whatever

以及调试任务:

- debug:
msg: >-
{% for info in my.info %}
{{- info.name -}}
{% for host in hostvars
| dict2items
| selectattr('value.my.info', 'defined')
if host.value.my.info
| selectattr('name', '==', info.name)
%} {{ host.key }}{% endfor %}

{% endfor %}

我们得到的结果是:

ok: [host_4] => 
msg: |-
whatever host_4
ok: [host_1] =>
msg: |-
one host_1 host_3
two host_1 host_2
ok: [host_2] =>
msg: |-
two host_1 host_2
three host_2 host_3
ok: [host_3] =>
msg: |-
one host_1 host_3
three host_2 host_3

关于ansible - 根据其他主机的变量构建模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76579942/

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