如何用 Ansible 自动化收集和管理服务器日志?你需要这份 Playbook!

运维
在生产环境中,当服务器数量达到数十、数百台时,人工登录每台服务器收集日志不仅效率低下,而且容易出现遗漏或错误。那么,如何能够自动化、高效地完成这个任务,确保日志收集无遗漏且及时?

在日常运维工作中,服务器日志的收集与管理往往是最头疼的事情之一。尤其是在生产环境中,当服务器数量达到数十、数百台时,人工登录每台服务器收集日志不仅效率低下,而且容易出现遗漏或错误。那么,如何能够自动化、高效地完成这个任务,确保日志收集无遗漏且及时?想知道如何实现吗?继续往下看吧!

问题的痛点

随着公司业务的扩大,生产环境的服务器数量也在不断增加。每台服务器上都会生成大量的日志文件,这些日志对于排查故障、监控系统健康等方面至关重要。

但是,如何从成千上万的服务器中,快速且安全地收集到最新的日志,并且避免漏掉任何一台机器的日志呢?

  • 每台机器的日志文件名不同,需要确保所有日志都能准确收集。
  • 手动操作不可行,当服务器数量激增,人工收集无疑是个巨大的负担。
  • 如何集中管理,将所有日志汇总到指定的目录,便于后期分析和存档。

看似是一个难以解决的运维痛点,但其实,通过一个小小的技巧,问题就能迎刃而解。你想知道这个神奇的解决方案吗?

秘密武器:Playbook

你一定听过Ansible这个自动化运维神器,它可以帮你实现一键批量执行命令,无论是在大规模的服务器上部署应用,还是进行常规的系统维护。而对于我们今天的需求——自动化收集日志并集中管理,Ansible同样可以轻松实现!

(1) 编写日志收集脚本

首先,我们可以编写一个简单的脚本,用于每台服务器上执行日志收集操作。这个脚本会将当前主机名、日期等信息加到日志文件名中,例如:

$(hostname -s)_$(date +%Y%m%d)_collect.log

(2) 通过Playbook自动执行脚本并拷贝日志

接下来,我们利用Ansible Playbook批量执行该脚本,自动收集所有服务器的日志。任务完成后,Playbook会将日志文件拷贝到跳板机的指定目录,确保集中管理。这样做的好处显而易见:

  • 无需手动登录每台服务器,Ansible自动执行脚本和拷贝操作,节省大量时间。
  • 通过变量动态获取日志文件名,确保每个日志文件命名规范,避免覆盖。
  • 日志集中管理,所有日志文件都可以存放在跳板机的指定目录,方便后期查看和分析。

(3) 拷贝到指定目录,便于分析与存档

最终,所有的日志都会被自动拷贝到跳板机上的指定目录,避免了手动操作带来的麻烦,也减少了误操作的风险。

如何操作?

只需跟随这几个简单的步骤,利用Ansible Playbook,你就能轻松地一次性完成所有设置。这样不仅省时省力,还能让整个过程变得更加愉快顺畅哦!

  • 编写并上传收集日志的脚本。
  • 创建Ansible Playbook文件,批量执行该脚本。
  • 将脚本生成的日志拷贝到跳板机的指定目录。

是不是听起来非常简单?你只需要运行一次Playbook,系统会自动完成所有的操作——从收集日志,到拷贝到跳板机,整个过程无需手动干预。

以下内容是Playbook的内容:

---
-name:收集并下载日志文件
hosts:dev# 根据需求指定目标主机
become:yes        # 以 root 权限执行
tasks:
    -name:执行收集日志的脚本
      ansible.builtin.script:
        cmd:/root/sysinfo_v2.sh# 本地脚本路径
    -name:格式化时间
      ansible.builtin.set_fact:
        formatted_date:"{{ ansible_date_time.iso8601 | regex_replace('^(\\d{4})-(\\d{2})-(\\d{2}).*$', '\\1\\2\\3') }}"
    -name:确保收集日志的脚本已经生成日志文件
      ansible.builtin.wait_for:
        path:"/root/{{ ansible_host }}_{{ formatted_date }}_collect.log"
        state:present
        timeout:60# 等待最多 60 秒

    -name:从远程主机获取日志文件到本地
      ansible.builtin.fetch:
        src:"/root/{{ ansible_host }}_{{ formatted_date }}_collect.log"
        dest:"./logs/"# 本地存储目录
        flat:yes        # 不保留远程路径结构

该剧本包含4个task,分别是执行收集日志的脚本、格式化时间、确保收集日志的脚本已经生成日志文件、和从远程主机获取日志文件到本地。每一个task都对应一个模块。

  • script模块:执行日志收集脚本
  • set_fact模块:设置变量
  • wait_for模块:判断root目录下有没有生成日志文件
  • fetch模块:把生成的日志文件拷贝到本地指定的目录

通过ansible-playbook执行如下命令:

ansible-playbook collect_logs.yml

成功执行上述命令后,会输出如下结果:

同时会在当前目录下看到收集到的日志已经拷贝到指定的目录下:

root@ansible:~/deploy/yml/logs# ll
total 16
drwxr-xr-x 2 root root 4096 Feb 13 03:22 ./
drwxr-xr-x 3 root root 4096 Feb 13 03:50 ../
-rw-r--r-- 1 root root  429 Feb 13 03:50 192.168.31.101_20250213_collect.log
-rw-r--r-- 1 root root  432 Feb 13 03:50 192.168.31.102_20250213_collect.log

结尾

通过这一小段Playbook和脚本,你已经可以轻松实现生产环境中日志的自动化收集与管理。那么,接下来,如果你想了解如何进一步优化日志管理,确保日志不丢失并进行备份、分析,甚至实现基于日志的自动化告警,你会选择如何扩展这个方案呢?

责任编辑:赵宁宁 来源: 攻城狮成长日记
相关推荐

2018-08-31 09:55:38

Ansible网络自动化

2024-01-09 13:09:00

2021-10-14 09:55:28

AnsibleanacronLinux

2018-02-10 18:35:09

LinuxAnsible系统管理

2015-03-09 11:10:14

运维

2013-10-25 09:18:56

StarCluster服务器集群管理自动化Amazon云

2017-09-15 14:10:01

系统运维服务器

2022-10-28 10:03:47

物联网楼宇自动化

2018-09-05 14:45:10

Python自动化机器学习

2020-01-06 09:00:34

容器CRD安全

2024-01-03 10:12:41

自动化测试

2021-11-10 09:00:00

工具Chef开发

2017-11-20 08:35:32

虚拟服务器自动化

2009-01-12 12:40:42

服务器虚拟化数据中心

2017-05-10 16:09:52

2023-03-09 14:02:00

Inkscape图形创作

2019-10-30 14:47:05

工具代码开发

2021-10-14 06:52:47

自动化开发环境

2016-09-28 20:27:20

服务器虚拟化管理软件

2015-10-08 10:55:23

云服务自动化运维 ANSIBLE
点赞
收藏

51CTO技术栈公众号