Ansible 提供了两个模块来管理远程主机上的服务:ansible.builtin.service_facts 和 ansible.builtin.service。service_facts 模块用于收集目标主机上服务的状态信息,而 service 模块用于管理服务的启动、停止、重启和启用。

service_facts 模块

  • 功能:收集远程主机上服务的状态信息,并将其作为事实数据返回。
  • 用途:在管理服务之前,了解目标主机上服务的当前状态。

service 模块

  • 功能:管理远程主机上的服务,包括启动、停止、重启、重新加载配置文件以及设置服务是否在启动时自动运行。
  • 适用范围:适用于多种操作系统,但对于 Windows 系统,需要使用 ansible.windows.win_service 模块。

主要参数

  • name:字符串,指定服务的名称(必需参数)。
  • state:字符串,指定服务的状态,可选值为 started、stopped、restarted 和 reloaded。
    • started 和 stopped:分别用于启动和停止服务。
    • restarted:重启服务,可以通过 sleep 参数指定停止和启动之间的延迟时间。
    • reloaded:重新加载服务的配置文件。
  • enabled:布尔值,指定服务是否在启动时自动运行。默认为 false。
  • arguments/args:字符串,指定传递给服务的额外参数。

示例:在远程主机上启用并启动服务

以下是一个示例 Playbook,展示如何使用 service 模块在远程主机上启用并启动服务。

Playbook 文件:service_enable_on_boot.yml

---
- name: service module demo
  hosts: all
  become: true
  vars:
    services_on_boot:
      - "chronyd.service"
  tasks:
    - name: populate service facts
      ansible.builtin.service_facts:

    - name: enable services on boot
      ansible.builtin.service:
        name: "{{ item }}"
        enabled: true
        state: started
      when: "item in services"
      with_items: '{{ services_on_boot }}'

执行步骤

  1. 准备主机清单文件 确保你的 inventory 文件中包含了目标主机的列表。例如:

    ini [targets] demo.example.com

  2. 运行 Playbook 使用以下命令运行 Playbook:

    bash ansible-playbook -i inventory service_enable_on_boot.yml

执行结果

如果任务成功执行,输出将类似于以下内容:

PLAY [service module demo] *******************************************************

TASK [Gathering Facts] ******************************************************
ok: [demo.example.com]

TASK [populate service facts] ***********************************************
ok: [demo.example.com]

TASK [enable services on boot] **********************************************
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]# 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)

执行后:

$ ssh devops@demo.example.com
[devops@demo ~]$ sudo su
[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:29:53 UTC; 49s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 1727 (chronyd)
    Tasks: 1 (limit: 4943)
   Memory: 844.0K
   CGroup: /system.slice/chronyd.service
           └─1727 /usr/sbin/chronyd

注意事项

  1. 权限问题:管理服务通常需要管理员权限,因此需要使用 become: true。
  2. 服务存在性:在启用服务之前,确保服务已安装并存在。可以使用 service_facts 模块检查服务是否存在。
  3. 幂等性:如果服务已经处于所需状态,则不会重复执行操作,确保任务的幂等性。
  4. Windows 系统:对于 Windows 系统,需要使用 ansible.windows.win_service 模块。

总结

通过 service_facts 和 service 模块,你可以轻松地管理远程主机上的服务,包括启用、启动、停止和重启服务。通过灵活使用这些模块,你可以确保服务在启动时自动运行,并满足你的自动化需求。