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
相关产品推荐
相关产品推荐

