Ansible 如何根据某些属性选择主机并使用它们的 IP 地址在运行时创建列表

2024-01-01

我有一个关于 ansible 中数据操作的具体问题。

在我的清单文件中,我有一个名为 postgresql 的组,如下所示:

[postgresql]
host1 ansible_host=1.1.1.1 postgresql_cluster_port=5432 postgresql_harole=master
host2 ansible_host=2.2.2.2 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1
host3 ansible_host=3.3.3.3 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1
host4 ansible_host=4.4.4.4 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1

在我的剧本中的某个地方,我需要操作和使用过滤器来创建 postgresql_harole=slave 的所有主机的 IP 地址列表,如下所示:

- hosts: postgresql
  gather_facts: True
  remote_user: root
  tasks:
    - set_facts:
        slave_ip_list: "{{ expressions }}"

我正在拉扯我的头发以获得正确的表达......非常感谢任何帮助!!!!


最简单的解决方案可能是使用 Ansible 的group_by模块,它允许您根据主机变量的值动态创建组。例如,给定以下库存:

[postgresql]
host1 ansible_host=1.1.1.1 postgresql_cluster_port=5432 postgresql_harole=master
host2 ansible_host=2.2.2.2 postgresql_cluster_port=5432 postgresql_harole=worker postgresql_master_ip=1.1.1.1
host3 ansible_host=3.3.3.3 postgresql_cluster_port=5432 postgresql_harole=worker postgresql_master_ip=1.1.1.1
host4 ansible_host=4.4.4.4 postgresql_cluster_port=5432 postgresql_harole=worker postgresql_master_ip=1.1.1.1

我们可以使用以下方法对主机进行分组postgresql_harole像这样的变量:

- hosts: all
  gather_facts: false
  tasks:
    - name: create group of postgresql workers
      group_by:
        key: "pg_role_{{ postgresql_harole|default('none') }}"

- hosts: pg_role_worker
  gather_facts: false
  tasks:
    - run_once: true
      debug:
        var: groups.pg_role_worker

    - debug:
        msg: "Hello world"

运行上述剧本将生成类似于以下内容的输出:

PLAY [all] ***********************************************************************************

TASK [create group of postgresql workers] ****************************************************
changed: [host1]
changed: [host2]
changed: [host3]
changed: [host4]

PLAY [pg_role_worker] ************************************************************************

TASK [debug] *********************************************************************************
ok: [host2] => {
    "groups.pg_role_worker": [
        "host2",
        "host3",
        "host4"
    ]
}

TASK [debug] *********************************************************************************
ok: [host2] => {
    "msg": "Hello world"
}
ok: [host3] => {
    "msg": "Hello world"
}
ok: [host4] => {
    "msg": "Hello world"
}

PLAY RECAP ***********************************************************************************
host1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host4                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

您可以看到 (a) 现在存在一个组pg_role_worker包含主机host2, host3, and host4(b) 最终debug任务仅在这些主机上运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ansible 如何根据某些属性选择主机并使用它们的 IP 地址在运行时创建列表 的相关文章

随机推荐