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 }}'
执行步骤
-
准备主机清单文件 确保你的
inventory文件中包含了目标主机的列表。例如:ini [targets] demo.example.com -
运行 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
注意事项
- 权限问题:管理服务通常需要管理员权限,因此需要使用
become: true。 - 服务存在性:在启用服务之前,确保服务已安装并存在。可以使用
service_facts模块检查服务是否存在。 - 幂等性:如果服务已经处于所需状态,则不会重复执行操作,确保任务的幂等性。
- Windows 系统:对于 Windows 系统,需要使用
ansible.windows.win_service模块。
总结
通过 service_facts 和 service 模块,你可以轻松地管理远程主机上的服务,包括启用、启动、停止和重启服务。通过灵活使用这些模块,你可以确保服务在启动时自动运行,并满足你的自动化需求。