如何在Ansible角色中适配systemd/sysvinit判断进程运行状态?
异构Linux环境下的Ansible进程状态检查实现
需求
我要编写一个Ansible角色,用于检查同时采用sysvinit和systemd的异构Linux虚拟机上指定包是否已安装,并确认对应进程的运行状态:
- 优先通过systemd模块检查已安装包的进程是否处于运行状态
- 若systemd检查失败,再使用sysvinit的service模块在非systemd机器上检查进程状态
- 最终生成一个名为
process_status的fact,结果仅为started或stopped
修正后的Playbook代码
--- - name: 获取已安装包列表 package_facts: manager: "auto" - name: 用systemd检查进程状态 systemd: name: "{{ process_name }}" state: started register: systemd_status ignore_errors: true when: "'{{ process_name }}' in ansible_facts.packages" - name: 用sysvinit检查进程状态 service: name: "{{ process_name }}" state: started register: sysvinit_status ignore_errors: true when: systemd_status.failed and "'{{ process_name }}' in ansible_facts.packages" - name: 设置进程状态结果fact set_fact: process_status: | {% if systemd_status.state == 'started' or sysvinit_status.state == 'started' %} started {% else %} stopped {% endif %}
关键调整说明
- 修复了原代码中
when条件的语法错误(缺失闭合单引号) - 简化了
set_fact的Jinja2判断逻辑:只要任一检查模块返回进程为started状态,就标记结果为started,否则统一为stopped,去除冗余判断 - 将任务名称改为中文,提升可读性
内容的提问来源于stack exchange,提问作者tafazzi87
相关产品推荐
相关产品推荐

