分享

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

 攻城狮成长日志 2025-02-13 发布于广东

大家好!我是一个热衷于分享IT技术的up主。在这个公众号里,我将为大家带来最新、最实用的技术干货,从编程语言到前沿科技,从软件开发到网络安全。希望通过我的分享,能够帮助更多的小伙伴提升技术水平,共同成长!欢迎关注,一起探索科技的魅力吧!

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

⚓问题的痛点

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

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

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

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

⚓秘密武器:Playbook

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

✍️编写日志收集脚本

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

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

✍️通过Playbook自动执行脚本并拷贝日志

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

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

✍️拷贝到指定目录,便于分析与存档

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

⚓如何操作?

只需跟随这几个简单的步骤,利用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和脚本,你已经可以轻松实现生产环境中日志的自动化收集与管理。那么,接下来,如果你想了解如何进一步优化日志管理,确保日志不丢失并进行备份、分析,甚至实现基于日志的自动化告警,你会选择如何扩展这个方案呢?

想了解更多?关注我们,下一篇文章将揭示如何将这个方案与监控系统对接,自动化处理异常日志,让你在运维工作中轻松应对各种挑战!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多