如何在Ansible中统计is_master为1的Play Host数量并判断是否超1
问题解决:检查Ansible Play中Master主机数量是否超过1
原代码的问题点
set_fact赋值语法错误:正确写法是变量名=值,不能加空格;初始计数器应该用数字类型(0)而非字符串("0"),否则无法直接执行加法运算- 第二个
set_fact未指定目标变量名,不符合Ansible的语法规范 when条件中存在嵌套的Jinja2模板引用错误,hostvars[item].is_master无需用{{ }}嵌套包裹- 字符串类型的计数器无法直接与数字做比较,会触发类型不匹配错误
修正后的循环计数写法
- name: 初始化master计数器 set_fact: master_counter: 0 delegate_to: localhost run_once: true - name: 统计master主机数量 set_fact: master_counter: "{{ master_counter | int + 1 }}" when: hostvars[item].is_master == "1" loop: "{{ ansible_play_hosts_all }}" delegate_to: localhost run_once: true - name: 输出警告信息(当master数量>1时) debug: msg: "There is more than one master!" when: master_counter | int > 1 delegate_to: localhost run_once: true
更简洁的实现方式(推荐)
无需手动循环计数,直接用Ansible过滤器统计符合条件的主机数量:
- name: 检查并输出master数量过多的警告 debug: msg: "There is more than one master!" when: > (ansible_play_hosts_all | map('extract', hostvars, 'is_master') | select('equalto', '1') | length) > 1 delegate_to: localhost run_once: true
过滤器说明
map('extract', hostvars, 'is_master'):从所有主机的hostvars中提取is_master变量值select('equalto', '1'):筛选出值为"1"的项length:统计筛选后的结果数量,判断是否大于1
内容的提问来源于stack exchange,提问作者Bl Jay
相关产品推荐
相关产品推荐

