如何使用 Ansible 在远程主机上启用开机启动的服务。
ansible.builtin.service_facts 返回服务状态信息作为事实数据。
ansible.builtin.service 管理服务。
让我们来谈谈 Ansible 的 service_facts 和 service 模块。 首先,你需要获取目标机器上服务的信息。这项任务由 Ansible 的 service_facts 模块完成。如果服务不存在,你当然无法启用它。 实际的操作由 Ansible 的 service 模块完成。它的全名是 ansible.builtin.service,这意味着这两个模块都是 Ansible 自带的“builtin”模块集合的一部分,并且与 Ansible 一起发布。 这个模块非常稳定,已经存在多年,其目的是管理远程主机上的服务。对于 Windows 目标,建议使用 ansible.windows.win_service 模块。
参数
- name(路径):服务的名称
- state(字符串):started/ stopped/ restarted/ reloaded
- enabled(布尔值):是/否
- arguments/args(字符串):额外参数
参数列表相当广泛,但我将总结最有用的部分。 唯一必需的参数是“name”,它指定了服务的名称。 “state”和“enabled”参数中至少需要一个。 “state”参数定义了我们要执行的操作,它有四种选择:
- “started”和“stopped”选项允许你启动或停止服务。
- “restarted”是停止和启动的组合,你还可以通过“sleep”参数自定义停止和启动之间的秒数。
- “reloaded”选项在服务需要重新加载配置文件时非常有用。 “enabled”参数允许你决定服务是否在开机时启动。 “arguments”或“args”参数允许你在命令行中指定一些额外的参数。
示例:如何在 Linux 远程主机上停止并禁用开机启动的服务
以下代码和示例使用 RedHat Enterprise Linux 8 机器上的 chronyd.service NTP 服务器。
代码文件: service_stop_disable_on_boot.yml
---
- name: service module demo
hosts: all
become: true
vars:
disable_services:
- "chronyd.service"
tasks:
- name: populate service facts
ansible.builtin.service_facts:
- name: disable services
ansible.builtin.service:
name: "{{ item }}"
enabled: false
state: stopped
when: "item in services"
with_items: '{{ disable_services }}'
执行命令:
$ ansible-playbook -i virtualmachines/demo/inventory services/service_stop_disable.yml
执行结果:
PLAY [service module demo] **************************************************
TASK [Gathering Facts] ******************************************************
ok: [demo.example.com]
TASK [populate service facts] ***********************************************
ok: [demo.example.com]
TASK [disable services] *****************************************************
changed: [demo.example.com] => (item=chronyd.service)
PLAY RECAP ******************************************************************
demo.example.com : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行前的状态
$ ssh devops@demo.example.com
[devops@demo ~]$ sudo su
[root@demo devops]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.4 (Ootpa)
[root@demo devops]# rpm -qa | grep chrony
chrony-3.5-2.el8.x86_64
[root@demo devops]# systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-11-29 11:31:32 UTC; 1 day 21h ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Process: 825 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
Process: 811 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 820 (chronyd)
Tasks: 1 (limit: 4943)
Memory: 1.3M
CGroup: /system.slice/chronyd.service
└─820 /usr/sbin/chronyd
执行后的状态
$ ssh devops@demo.example.com
Last login: Wed Dec 1 08:39:40 2021 from 192.168.0.101
[devops@demo ~]$ sudo su
[root@demo devops]# systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:chronyd(8)
man:chrony.conf(5)
重启后确认
[root@demo devops]# uptime
08:41:08 up 0 min, 1 user, load average: 0.28, 0.06, 0.02
[root@demo devops]# systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:chronyd(8)
man:chrony.conf(5)