首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据特定属性选择主机并在运行时使用其ip地址创建列表

如何根据特定属性选择主机并在运行时使用其ip地址创建列表
EN

Stack Overflow用户
提问于 2021-04-09 23:54:38
回答 2查看 322关注 0票数 1

关于ansible中的数据操作,我有一个特别的问题。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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地址列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- hosts: postgresql
  gather_facts: True
  remote_user: root
  tasks:
    - set_facts:
        slave_ip_list: "{{ expressions }}"

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

EN

回答 2

Stack Overflow用户

发布于 2021-04-10 00:23:24

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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变量对主机进行分组,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 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"

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)现在存在一个包含主机host2host3host4的组pg_role_worker,并且(b)最终的debug任务仅在这些主机上运行。

票数 1
EN

Stack Overflow用户

发布于 2021-04-10 01:39:54

问:“其postgresql_harole=slave”的所有主机的ip地址的列表

A:从hostvars中选择属性,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - set_fact:
        slave_ip_list: "{{ hostvars|dict2items|
                           selectattr('value.postgresql_harole', 'eq', 'slave')|
                           map(attribute='value.ansible_host')|
                           list }}"
      run_once: true

给出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  slave_ip_list:
  - 2.2.2.2
  - 3.3.3.3
  - 4.4.4.4

如果可能有其他主机的主机变量,例如,由于- hosts: all,请首先选择postgresql组的主机变量。下面的任务给出了相同的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - set_fact:
        slave_ip_list: "{{ groups.postgresql|
                           map('extract', hostvars)|
                           selectattr('postgresql_harole', 'eq', 'slave')|
                           map(attribute='ansible_host')|
                           list }}"
      run_once: true
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67029581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文