关于你的问题
这可以仅由 Ansible 完成吗?
简短的回答是:是的,当然。这就是 Ansible 的用途。
关于你的标题
如何禁用但运行服务?
和评论
您是否尝试过 ansible.builtin.service_facts
我准备了一个简短的测试,它将显示以下结构ansible_facts.services
.
---
- hosts: localhost
become: no
gather_facts: no
tasks:
- name: Gather Service Facts
service_facts:
- name: Show Service Facts
debug:
msg: "{{ ansible_facts.services }}"
例如,其中一项服务
auditd.service:
name: auditd.service
source: systemd
state: running
status: enabled
所以你需要循环结果集并寻找ansible_facts.services[YOURSERVICE].state
and ansible_facts.services[YOURSERVICE].status
.
关于你的描述
...已禁用(systemctl禁用xxxx)但仍在运行的服务(因为尚未停止)...
你可以看看答案如何声明变量service_facts https://stackoverflow.com/a/69476972/6771046.
关于您的评论
...我如何为所有服务执行条件...
以及已经提到的结果循环,我已经为测试设置添加了
- name: Loop over all services and print name
debug:
msg: "{{ item }}"
when:
- ansible_facts.services[item].state == 'running'
- ansible_facts.services[item].status != 'enabled'
with_items: "{{ ansible_facts.services }}"
并发现它有效。
您可能需要调整条件,因为该查询将报告服务的状态static
like dbus
or systemd-journald
也。另请注意,服务也可以有unknow
地位。在例子中
splunk.service:
name: splunk.service
source: systemd
state: running
status: unknown
or
systemctl status splunk
● splunk.service - SYSV: Splunk indexer service
Loaded: loaded (/etc/rc.d/init.d/splunk; bad; vendor preset: disabled)
Active: active (running) ...