ELK 自动化部署脚本解析

ELK 自动化部署

文档说明

本文档对 elk_deploy_fast.py 脚本进行模块化解析,该脚本用于在 openEuler 22.03 LTS 系统上自动化部署 ELK(Elasticsearch + Logstash + Kibana)7.17.0 版本。脚本特点是无安装包检测无组件启动验证,仅快速执行部署流程,适用于预先确认环境和安装包的场景。

核心模块总览

脚本采用模块化设计,分为以下核心模块:

  1. 配置参数模块:定义目标主机信息、ELK 组件路径及版本信息
  2. 远程命令执行模块:封装 SSH 远程命令执行逻辑
  3. 部署流程模块:按步骤执行环境准备、组件安装与配置
  4. 入口模块:脚本启动与依赖检查

模块详细解析

1. 配置参数模块(Configuration Module)

功能:集中定义部署所需的所有静态参数,便于统一修改和维护。

复制代码
# 目标主机配置(已上传安装包到/tmp目录)
HOST = "88.88.88.14"          # 目标服务器IP
USER = "root"                 # SSH登录用户名
PASSWORD = "Admin@2025"       # SSH登录密码
ELK_VERSION = "7.17.0"        # ELK版本(需与安装包匹配)

# 组件安装路径
ES_HOME = "/usr/local/elasticsearch"  # Elasticsearch安装目录
LS_HOME = "/usr/local/logstash"       # Logstash安装目录
KB_HOME = "/usr/local/kibana"         # Kibana安装目录

# 数据与日志存储路径
DATA_DIR = "/data/elk"       # ELK数据存储根目录
LOG_DIR = "/var/log/elk"     # ELK日志存储根目录

# 安装包文件名(需与/tmp目录中上传的文件一致)
ES_PACKAGE = f"elasticsearch-{ELK_VERSION}-linux-x86_64.tar.gz"
LS_PACKAGE = f"logstash-{ELK_VERSION}-linux-x86_64.tar.gz"
KB_PACKAGE = f"kibana-{ELK_VERSION}-linux-x86_64.tar.gz"

关键说明

  • 所有路径均采用绝对路径,避免相对路径导致的执行错误
  • 安装包文件名与版本强关联,需确保与 /tmp 目录中上传的文件完全一致
  • 目标主机信息需提前确认正确性(IP、用户名、密码)

2. 远程命令执行模块(Remote Command Execution Module)

功能:封装 SSH 远程执行命令的逻辑,提供基础的命令执行与输出打印能力。

复制代码
def run_remote_cmd(ssh, cmd, print_output=True):
    """
    远程执行命令(简化版,不严格校验执行结果)
    
    参数:
        ssh: paramiko.SSHClient对象,已建立的SSH连接
        cmd: 字符串,待执行的命令
        print_output: 布尔值,是否打印命令输出(默认True)
    
    返回:
        列表,命令输出的每行内容
    """
    stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
    stdin.close()  # 关闭标准输入,避免远程命令等待输入
    output = []
    try:
        # 实时读取标准输出并存储
        while True:
            line = stdout.readline()
            if not line:
                break  # 输出结束
            line = line.strip()
            output.append(line)
            if print_output:
                print(f"[OUTPUT] {line}")  # 打印输出到本地控制台
        return output
    except Exception as e:
        # 非致命错误:仅警告,继续执行后续命令
        print(f"[WARNING] 命令执行可能出错,但继续执行: {str(e)}")

关键说明

  • 采用 paramiko 库实现 SSH 远程连接,需提前安装(pip install paramiko
  • 忽略标准错误输出(stderr),不校验命令返回码,以 "快速执行" 为首要目标
  • 通过 get_pty=True 确保命令在交互式终端中执行,避免部分命令因环境变量问题失败

3. 部署流程模块(Deployment Process Module)

功能:按顺序执行 ELK 部署的全流程,包括环境准备、组件安装与配置、服务启动。

3.1 SSH 连接建立
复制代码
def deploy_elk():
    print(f"===== 连接到 {HOST} =====")
    ssh = paramiko.SSHClient()
    # 自动接受未知主机密钥(生产环境可改为手动验证)
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        # 建立SSH连接(超时时间30秒)
        ssh.connect(HOST, username=USER, password=PASSWORD, timeout=30)
    except Exception as e:
        print(f"[ERROR] SSH连接失败: {str(e)}")
        return  # SSH连接失败则终止部署

关键说明

  • 仅在 SSH 连接失败时终止部署,其他步骤出错均继续执行
  • AutoAddPolicy 简化了首次连接的密钥验证流程,适合自动化场景
3.2 环境准备(Environment Preparation)

功能:配置系统依赖、内核参数、防火墙等基础环境。

复制代码
print("\n===== 开始环境准备 =====")
# 安装JDK 11(ELK 7.x必需依赖)
run_remote_cmd(ssh, "dnf install -y java-11-openjdk java-11-openjdk-devel")
run_remote_cmd(ssh, 'echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk" >> /etc/profile')
run_remote_cmd(ssh, "source /etc/profile")

# 关闭SELinux(避免权限限制)
run_remote_cmd(ssh, "setenforce 0")  # 临时关闭
run_remote_cmd(ssh, 'sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config')  # 永久关闭

# 配置防火墙(开放ELK所需端口)
run_remote_cmd(ssh, "systemctl start firewalld && systemctl enable firewalld")
run_remote_cmd(ssh, "firewall-cmd --zone=public --add-port=9200/tcp --permanent")  # ES
run_remote_cmd(ssh, "firewall-cmd --zone=public --add-port=5601/tcp --permanent")  # Kibana
run_remote_cmd(ssh, "firewall-cmd --zone=public --add-port=5044/tcp --permanent")  # Logstash
run_remote_cmd(ssh, "firewall-cmd --reload")  # 生效规则

# 优化内核参数(ES必需)
run_remote_cmd(ssh, 'echo "vm.max_map_count=262144" >> /etc/sysctl.conf')  # 虚拟内存映射数
run_remote_cmd(ssh, 'echo "fs.file-max=655360" >> /etc/sysctl.conf')        # 最大文件描述符
run_remote_cmd(ssh, "sysctl -p")  # 生效配置

# 调整用户资源限制(避免文件句柄不足)
run_remote_cmd(ssh, 'echo "* soft nofile 65536" >> /etc/security/limits.conf')
run_remote_cmd(ssh, 'echo "* hard nofile 65536" >> /etc/security/limits.conf')
run_remote_cmd(ssh, 'echo "* soft nproc 4096" >> /etc/security/limits.conf')
run_remote_cmd(ssh, 'echo "* hard nproc 4096" >> /etc/security/limits.conf')

# 创建数据与日志目录并授权
run_remote_cmd(ssh, f"mkdir -p {DATA_DIR}/{{es_data,es_logs,ls_data,ls_logs,kb_logs}}")
run_remote_cmd(ssh, f"mkdir -p {LOG_DIR}")
run_remote_cmd(ssh, f"chmod -R 775 {DATA_DIR} {LOG_DIR}")

关键说明

  • 依赖 dnf 包管理器(openEuler 默认)安装 JDK,无需手动下载
  • 内核参数 vm.max_map_count=262144 为 Elasticsearch 必需配置,否则可能启动失败
  • 目录结构采用分层设计(es_datals_data 等),便于数据隔离与管理
3.3 Elasticsearch 安装与配置

功能:解压安装包、创建专用用户、配置核心参数并启动服务。

复制代码
print("\n===== 安装Elasticsearch =====")
# 解压安装包(假设/tmp目录已存在安装包)
run_remote_cmd(ssh, f"tar -zxvf /tmp/{ES_PACKAGE} -C /usr/local/")
run_remote_cmd(ssh, f"mv /usr/local/elasticsearch-{ELK_VERSION} {ES_HOME}")

# 创建专用用户(ES禁止root启动)
run_remote_cmd(ssh, "id -u es &>/dev/null || useradd es")  # 不存在则创建
run_remote_cmd(ssh, f"chown -R es:es {ES_HOME} {DATA_DIR} {LOG_DIR}")  # 授权目录权限

# 写入核心配置(elasticsearch.yml)
es_config = f"""cluster.name: elk-cluster
node.name: node-1
path.data: {DATA_DIR}/es_data
path.logs: {DATA_DIR}/es_logs
network.host: 0.0.0.0  # 允许外部访问
http.port: 9200
discovery.seed_hosts: ["127.0.0.1"]  # 单节点配置
cluster.initial_master_nodes: ["node-1"]
bootstrap.memory_lock: false  # 测试环境关闭
"""
cmd = f'echo "{es_config}" > {ES_HOME}/config/elasticsearch.yml'
run_remote_cmd(ssh, cmd)

# 启动ES(后台运行)
run_remote_cmd(ssh, f"su - es -c '{ES_HOME}/bin/elasticsearch -d'")
print("等待Elasticsearch启动(30秒)...")
time.sleep(30)  # 预留启动时间

关键说明

  • 必须创建 es 专用用户,因为 Elasticsearch 从安全角度禁止 root 启动
  • 配置文件中 network.host: 0.0.0.0 允许外部 IP 访问,默认仅本地可访问
  • 启动后等待 30 秒,避免后续组件(如 Kibana)因 ES 未就绪而连接失败
3.4 Logstash 安装与配置

功能:解压安装包、配置日志采集规则(系统日志)并启动服务。

复制代码
print("\n===== 安装Logstash =====")
# 解压安装包
run_remote_cmd(ssh, f"tar -zxvf /tmp/{LS_PACKAGE} -C /usr/local/")
run_remote_cmd(ssh, f"mv /usr/local/logstash-{ELK_VERSION} {LS_HOME}")
run_remote_cmd(ssh, f"chown -R root:root {LS_HOME}")  # Logstash可root运行

# 配置日志采集规则(输入→过滤→输出)
ls_config = f"""input {{
  file {{
    path => "/var/log/messages"  # 采集系统日志
    start_position => "beginning"  # 从文件开头读取
    sincedb_path => "{DATA_DIR}/ls_data/sincedb"  # 记录读取位置
  }}
}}
filter {{
  grok {{  # 提取结构化字段(时间、主机、内容)
    match => {{ "message" => "%{{TIMESTAMP_ISO8601:log_time}} %{{HOSTNAME:host}} %{{GREEDYDATA:log_message}}" }}
  }}
}}
output {{
  elasticsearch {{  # 输出到ES
    hosts => ["localhost:9200"]
    index => "system-logs-%{{+YYYY.MM.dd}}"  # 按日期分索引
  }}
  stdout {{ codec => rubydebug }}  # 控制台输出(调试用)
}}
"""
cmd = f'echo "{ls_config}" > {LS_HOME}/config/logstash.conf'
run_remote_cmd(ssh, cmd)

# 启动Logstash(后台运行)
run_remote_cmd(ssh, f"nohup {LS_HOME}/bin/logstash -f {LS_HOME}/config/logstash.conf > {LOG_DIR}/logstash.log 2>&1 &")
print("等待Logstash启动(10秒)...")
time.sleep(10)

关键说明

  • 配置文件采用 "输入 - 过滤 - 输出" 三段式结构,是 Logstash 的核心工作模式
  • grok 过滤器用于将非结构化日志(如 /var/log/messages)转换为结构化数据(便于后续分析)
  • 输出到 Elasticsearch 时按日期创建索引(system-logs-YYYY.MM.dd),避免单索引过大
3.5 Kibana 安装与配置

功能:解压安装包、配置连接信息(对接 ES)并启动服务。

复制代码
print("\n===== 安装Kibana =====")
# 解压安装包
run_remote_cmd(ssh, f"tar -zxvf /tmp/{KB_PACKAGE} -C /usr/local/")
run_remote_cmd(ssh, f"mv /usr/local/kibana-{ELK_VERSION} {KB_HOME}")
run_remote_cmd(ssh, f"chown -R es:es {KB_HOME}")  # 与ES同用户,避免权限问题

# 配置Kibana(连接ES及基础设置)
kb_config = f"""server.host: "0.0.0.0"  # 允许外部访问
server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]  # 对接本地ES
kibana.index: ".kibana"  # 自身数据存储索引
logging.dest: {DATA_DIR}/kb_logs/kibana.log
i18n.locale: "zh-CN"  # 中文界面
"""
cmd = f'echo "{kb_config}" > {KB_HOME}/config/kibana.yml'
run_remote_cmd(ssh, cmd)

# 启动Kibana(后台运行)
run_remote_cmd(ssh, f"su - es -c 'nohup {KB_HOME}/bin/kibana > {LOG_DIR}/kibana.log 2>&1 &'")
print("等待Kibana启动(30秒)...")
time.sleep(30)

关键说明

  • i18n.locale: "zh-CN" 配置默认中文界面,无需手动切换
  • 需与 Elasticsearch 同用户(es)启动,否则可能因权限问题无法访问 ES 数据
  • 启动后等待 30 秒,Kibana 首次启动需加载插件和初始化数据,耗时较长
3.6 部署完成提示
复制代码
print("\n===== 部署流程执行完毕 =====")
print(f"Elasticsearch路径: {ES_HOME}")
print(f"Kibana访问地址: http://{HOST}:5601")
print("请手动验证各组件是否正常运行")

关键说明

  • 由于脚本不验证启动结果,需用户手动检查组件状态(参考 "手动验证命令")

4. 入口模块(Entry Module)

功能:脚本启动入口,检查依赖并触发部署流程。

复制代码
if __name__ == "__main__":
    # 检查paramiko库是否安装(必需依赖)
    try:
        import paramiko
    except ImportError:
        print("请先安装paramiko库:pip install paramiko")
        exit(1)
    # 启动部署流程
    deploy_elk()

关键说明

  • 脚本依赖 paramiko 库实现 SSH 功能,需提前安装
  • __name__ == "__main__" 确保脚本仅在直接执行时启动部署,被导入时不执行

手动验证命令(部署后)

由于脚本无自动验证,部署完成后需执行以下命令确认组件状态:

  1. 验证 Elasticsearch

    复制代码
    curl http://localhost:9200  # 应返回ES版本及集群信息
  2. 验证 Logstash

    复制代码
    ps -ef | grep logstash | grep -v grep  # 应显示Logstash进程
    tail -f /var/log/elk/logstash.log      # 查看日志是否有报错
  3. 验证 Kibana

    复制代码
    curl -s http://localhost:5601 | grep Kibana  # 应返回含"Kibana"的HTML内容
    tail -f /var/log/elk/kibana.log              # 查看日志是否有报错

总结

本脚本通过模块化设计实现了 ELK 的快速自动化部署,核心优势是流程简洁、执行迅速,适合对环境和安装包预先确认的场景。各模块职责清晰,可根据需求单独修改(如调整组件路径、日志采集规则等)。部署后需通过手动验证确保各组件正常运行。

相关推荐
小白博文2 小时前
MobaXterm调用远程服务器(Linux)图形化界面应用
linux·运维·服务器
不会写代码的里奇2 小时前
VMware Ubuntu 22.04 NAT模式下配置GitHub SSH完整教程(含踩坑实录+报错_成功信息对照)
linux·经验分享·笔记·git·ubuntu·ssh·github
百***67032 小时前
Nodemailer使用教程:在Node.js中发送电子邮件
linux·运维·node.js
ddacrp2 小时前
RHEL_NFS服务器
linux·服务器·网络
TG:@yunlaoda360 云老大3 小时前
谷歌云发布 Document AI Workbench 最新功能:自定义文档拆分器实现复杂文档处理自动化
运维·人工智能·自动化·googlecloud
凄戚3 小时前
docker 镜像失效问题
运维·docker·容器
码界奇点3 小时前
Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
linux·c语言·网络·c++·ux·risc-v
ZHANG13HAO3 小时前
RV1106 通过 4G 网络基于 libdatachannel 实现 WebRTC 实时视频传输”
linux
..过云雨4 小时前
13.【Linux系统编程】从ELF格式深入理解动静态库
linux·c语言·c++·后端