You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible中如何按角色过滤主机列表?新手求助

Ansible 根据角色过滤主机列表的方法

核心过滤逻辑

利用Ansible内置过滤器组合,可快速从你的hosts字典中筛选对应角色的主机名列表,核心过滤器链如下:

{{ hosts | dict2items | selectattr('value.roles', 'contains', '目标角色') | map(attribute='key') | list }}

各过滤器作用:

  • dict2items:将主机字典转换为键值对列表,每个元素格式为{key: "主机名", value: {roles: [...], ...}}
  • selectattr('value.roles', 'contains', '目标角色'):筛选出roles列表包含指定角色的主机项
  • map(attribute='key'):从筛选后的项中提取主机名字段
  • list:将结果转换为标准列表格式

具体实现示例

1. 定义筛选后的主机列表变量

在Playbook的vars部分预定义各角色对应的主机列表,方便后续复用:

vars:
  hosts:
    host-1:
      roles: [ 'master' ]
      index_ip: 2
      outline: false
    host-2:
      roles: [ 'backend' ]
      index_ip: 3
      outline: false
    host-3:
      roles: [ 'frontend' ]
      index_ip: 4
      outline: false
    host-4:
      roles: [ 'frontend' ]
      index_ip: 5
      outline: false
  # 筛选master角色主机
  master_hosts: "{{ hosts | dict2items | selectattr('value.roles', 'contains', 'master') | map(attribute='key') | list }}"
  # 筛选frontend角色主机
  frontend_hosts: "{{ hosts | dict2items | selectattr('value.roles', 'contains', 'frontend') | map(attribute='key') | list }}"
  # 筛选backend角色主机
  backend_hosts: "{{ hosts | dict2items | selectattr('value.roles', 'contains', 'backend') | map(attribute='key') | list }}"

2. 生成启动配置文件

将预定义的主机列表直接代入启动配置模板,生成目标文件:

tasks:
  - name: 生成启动配置文件
    copy:
      content: |
        central_supervisor:
          - hostlist: {{ master_hosts }}
            corelist: [ 0 ]

        subsystem:
          - hostlist: {{ backend_hosts }}
            sa_corelist: [0]
            app_corelist: [[1,2,3,4,5,6,7,8,9,10,17,18,19,20,21,22,23,24,25,26], [1,2,3,4,5,6,7,8,9,10,17,18,19,20,21,22,23,24,25,26]]

        data_router:
          - hostlist: {{ frontend_hosts }}
            corelist_e: [16]
            corelist_c: [15,31]

        data_processor:
          - hostlist: {{ frontend_hosts }}
            capabilities: all
            corelist_e: [16]
            corelist_c: [15,31]
      dest: ./startup_config.yml

额外说明

  • 如果主机的roles字段包含多个角色(如roles: ['frontend', 'monitor']),contains过滤器仍能正确匹配到包含目标角色的主机
  • 若需要更复杂的筛选逻辑(比如同时满足多个角色),可以组合使用selectattr,例如:
    multi_role_hosts: "{{ hosts | dict2items | selectattr('value.roles', 'contains', 'frontend') | selectattr('value.roles', 'contains', 'monitor') | map(attribute='key') | list }}"
    

内容的提问来源于stack exchange,提问作者nicklas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:50:34