gpt4 book ai didi

ansible - 如何将数组分配给 Ansible-Playbook 中的变量

转载 作者:行者123 更新时间:2023-12-02 06:35:22 26 4
gpt4 key购买 nike

在剧本中我得到了以下代码:

---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts: ['10.129.181.241/32']
...

我想将 postgresql_pg_hba_passwd_hosts 的值替换为我所有的网络服务器私有(private) IP。我知道我可以获得类似 this 的值在模板中:

{% for host in groups['web'] %}
{{ hostvars[host]['ansible_eth1']['ipv4']['address'] }}
{% endfor %}

将此循环的结果分配给剧本中的变量的最简单/最容易的方法是什么?或者有没有更好的方法来首先收集这些信息?我应该将此循环放入模板中吗?

额外的挑战:我必须向每个条目添加 /32

最佳答案

您可以通过 set_fact 将列表分配给变量和 ansible filter plugin .

将自定义过滤器插件放入 filter_plugins 目录,如下所示:

(ansible top directory)
site.yml
hosts
filter_plugins/
to_group_vars.py

to_group_vars.py将主机变量转换为按组选择的列表。

from ansible import errors, runner
import json

def to_group_vars(host_vars, groups, target = 'all'):
if type(host_vars) != runner.HostVars:
raise errors.AnsibleFilterError("|failed expects a HostVars")

if type(groups) != dict:
raise errors.AnsibleFilterError("|failed expects a Dictionary")

data = []
for host in groups[target]:
data.append(host_vars[host])
return data

class FilterModule (object):
def filters(self):
return {"to_group_vars": to_group_vars}

像这样使用:

---
- hosts: all
tasks:
- set_fact:
web_ips: "{{hostvars|to_group_vars(groups, 'web')|map(attribute='ansible_eth0.ipv4.address')|list }}"
- debug:
msg: "web ip is {{item}}/32"
with_items: web_ips

关于ansible - 如何将数组分配给 Ansible-Playbook 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24798382/

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