Ansible:如何禁用但 运行 服务?

Ansible: How to get disabled but running services?

我想遍历很多主机并获取所有手动启动的服务 (systemctl start xxxx) 而不是首先启用 (systemctl enable xxxx),反之亦然所有被禁用的服务 (systemctl disable xxxx) ) 但仍然 运行 (因为还没有停止)。

而不是自动 'fixing' 所有上述发现的问题,我只是想让它们输出到我的 shell。

通过 systemctl list-unit-files --state=disabled 和 运行 的每一行通过 systemctl is-active 的 for each 循环之类的东西可能会起作用,但我需要将一个小的 SH 脚本传输到每个主机.. .

Ansible一个人能搞定吗? (将 RHEL7 Update 7 与内核 3 结合使用。10.x)

编辑:到目前为止,这是我的剧本,但我无法使循环正常工作:

---
- hosts: all
  gather_facts: no
  tasks:
     - name: get service facts
       service_facts:
     - name: show report
       when:
        - ansible_facts.services[item + '.service'].state == 'running'
        - ansible_facts.services[item + '.service'].status == 'disabled'
       debug:
         msg: "{{ ansible_facts.services[item + '.service'].status == 'disabled' }}"
       loop:
         ansible_facts.services

关于你的问题

Can this be done by Ansible alone?

简短的回答是:当然可以。这就是 Ansible 的用途。

关于你的标题

How to get disabled but running services?

和评论

Have you tried 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].stateansible_facts.services[YOURSERVICE].status.

关于你的描述

... services which are disabled (systemctl disable xxxx) but still running (because have not been stopped) ...

您可以查看 how to declare a variable for service_facts 的答案。

关于您的评论

... how I can do the when condition for all services ...

我已经为测试设置添加了已经提到的结果循环

- 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 的服务,例如 dbussystemd-journald。另请注意,服务也可以具有 unknow 状态。例如

splunk.service:
  name: splunk.service
  source: systemd
  state: running
  status: unknown

systemctl status splunk
● splunk.service - SYSV: Splunk indexer service
   Loaded: loaded (/etc/rc.d/init.d/splunk; bad; vendor preset: disabled)
   Active: active (running) ...