Ansible如何筛选redis服务不存在的主机 存入变量供后续任务调用
Ansible筛选Redis服务异常主机实现方案
核心思路是先忽略服务检查命令的非0返回错误,再通过返回状态筛选目标主机,用动态主机组的方式归集目标,供后续任务直接调用。
具体实现步骤
- 给原有服务检查任务添加错误忽略配置:
service redis-server status命令在服务不存在、未安装、停止时会返回非0状态码,不加配置会直接导致对应主机的任务中断。 - 用
add_host模块把符合筛选条件的主机加入内存动态分组,这个分组在当前playbook运行全程可直接调用,不会修改本地静态主机清单文件。 - 后续任务直接指定目标主机为该动态分组即可。
完整Playbook示例
- hosts: 192.168.0.1, 192.168.0.2, 192.168.0.3 gather_facts: no tasks: - name: 检查redis服务状态 command: cmd: service redis-server status register: result ignore_errors: yes changed_when: false - name: 归集redis服务不存在/异常的主机到动态组 add_host: name: "{{ inventory_hostname }}" groups: redis_missing_hosts when: result.rc != 0 - name: 验证筛选结果(可选) debug: msg: "检测到Redis服务异常的主机列表:{{ groups['redis_missing_hosts'] }}" run_once: yes # 后续针对异常主机执行操作,直接指定hosts为动态组即可 - hosts: redis_missing_hosts gather_facts: no tasks: - name: 此处编写针对异常主机的操作,例如安装、启动Redis debug: msg: "主机{{ inventory_hostname }}未检测到正常运行的Redis服务,开始执行修复逻辑"
配置说明
ignore_errors: yes:服务检查命令返回非0状态码时不中断任务执行changed_when: false:服务检查是只读操作,不会修改主机配置,固定不会标记为变更状态result.rc != 0:默认判断逻辑为命令返回码非0即判定服务异常,如果需要精准区分「服务未安装不存在」和「服务已安装但停止」,可以根据系统输出调整判断规则,例如CentOS/Ubuntu下服务不存在时标准错误会包含对应提示关键字,可调整条件为when: result.rc !=0 and 'unrecognized service' in result.stderr- 动态组
redis_missing_hosts仅在当前playbook运行期间生效,不会产生持久化修改
内容的提问来源于stack exchange,提问作者Disbalance
相关产品推荐
相关产品推荐

