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].state
和 ansible_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
的服务,例如 dbus
或 systemd-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) ...
我想遍历很多主机并获取所有手动启动的服务 (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].state
和 ansible_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
的服务,例如 dbus
或 systemd-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) ...