当前位置: 首页 > news >正文

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 outputexcept 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 {{  # 输出到EShosts => ["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 paramikoexcept 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 的快速自动化部署,核心优势是流程简洁、执行迅速,适合对环境和安装包预先确认的场景。各模块职责清晰,可根据需求单独修改(如调整组件路径、日志采集规则等)。部署后需通过手动验证确保各组件正常运行。

http://www.dtcms.com/a/618604.html

相关文章:

  • 做域名跳转非法网站负什么责任凡科建站快车官网
  • 开网站 怎么做网上支付企业信息系统规划的含义
  • 建设官方网站怎么登录快看点媒体平台
  • 【算法】逻辑回归算法应用
  • 引力编程时代:人类文明存续与升维
  • 网站开发发送短信建设网站 怀疑对方传销 网站制作 缓刑
  • 异步任务调度器的核心设计与实现
  • 上海市建设工程合同备案网站网站托管一般多少钱
  • 网站建设方案如何写营销培训生
  • [智能体设计模式] 第15章:智能体间通信(A2A)
  • 网页图片怎么保存为pdf文件网站优化及推广公司
  • 云脑网络科技网站建设wordpress 中文 模板
  • pycharm怎么将背景换成白色
  • 具身智能:研究现状深度解析——从技术突破到产业落地
  • 网站建设台州网站备案密码格式
  • 多路转接select(2)
  • 电子行业安规测试中常见术语及含义
  • 深度学习中的正交化:理论、应用与实现
  • 18+网站推广检察院门户网站建设情况总结
  • 柯尼卡美能达C7222色彩调整及更换硒鼓注意事项
  • 4K60矩阵:开启超高清无缝拼接新时代
  • 教务处网站建设方案软文营销案例200字
  • 如何在Linux中找到MySQL的安装目录
  • Ansible变量全解析:优化自动化流程的关键
  • Leetcode 3747. Count Distinct Integers After Removing Zeros
  • 西安网络建站公司考研培训班哪个机构比较好
  • 第二部分:感知篇——汽车的“眼睛”与“耳朵”(第3章:传感器技术深度解析)
  • 深度解析类和对象(2)
  • 青浦网络公司网站wordpress快速插图
  • 河南城乡与住房建设厅网站网站推广怎么样