如何使用 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)