ELK 自动化部署脚本解析
ELK 自动化部署
文档说明
本文档对 elk_deploy_fast.py 脚本进行模块化解析,该脚本用于在 openEuler 22.03 LTS 系统上自动化部署 ELK(Elasticsearch + Logstash + Kibana)7.17.0 版本。脚本特点是无安装包检测、无组件启动验证,仅快速执行部署流程,适用于预先确认环境和安装包的场景。
核心模块总览
脚本采用模块化设计,分为以下核心模块:
- 配置参数模块:定义目标主机信息、ELK 组件路径及版本信息
- 远程命令执行模块:封装 SSH 远程命令执行逻辑
- 部署流程模块:按步骤执行环境准备、组件安装与配置
- 入口模块:脚本启动与依赖检查
模块详细解析
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_data、ls_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__"确保脚本仅在直接执行时启动部署,被导入时不执行
手动验证命令(部署后)
由于脚本无自动验证,部署完成后需执行以下命令确认组件状态:
验证 Elasticsearch:
curl http://localhost:9200 # 应返回ES版本及集群信息验证 Logstash:
ps -ef | grep logstash | grep -v grep # 应显示Logstash进程 tail -f /var/log/elk/logstash.log # 查看日志是否有报错验证 Kibana:
curl -s http://localhost:5601 | grep Kibana # 应返回含"Kibana"的HTML内容 tail -f /var/log/elk/kibana.log # 查看日志是否有报错
总结
本脚本通过模块化设计实现了 ELK 的快速自动化部署,核心优势是流程简洁、执行迅速,适合对环境和安装包预先确认的场景。各模块职责清晰,可根据需求单独修改(如调整组件路径、日志采集规则等)。部署后需通过手动验证确保各组件正常运行。


