通过rpmbuild构建Elasticsearch-7.14.2-search-guard的RPM包

系列文章目录

rpmbuild从入门到放弃
search-guard插件使用入门手册


文章目录

  • 系列文章目录
  • 前言
  • 一、资源准备
  • 二、spec文件
    • 1.基础信息
    • 2.%prep
    • 3.%Install
    • 4.%file
    • 5.%post
    • 6.%postun
  • 三、成果演示
    • 1.执行构建过程图示例
    • 2.执行安装RPM包示例
    • 3.进程检查
    • 4.访问esApi
  • 总结


前言

不管是源码安装elasticsearch还是通过elastic官网的rpm包进行安装,在安装完成后都需要进行手动配置elastic的安全认证,这样不管从安装效率还是维护都比较麻烦,为了让安装和开启鉴权一起完成,本篇文章就使用rpmbuild自行构建elasticsearch-7.14.2的RPM包,安全认证插件使用的是search-guard,具体构建方式看下方文章即可。阅读下方文章前,请先阅读顶部的两章链接文件,先对整体知识有个大体上的了解。


提示:已在本地centos 7环境执行过构建测试、安装、使用流程,目前未发现异常

一、资源准备

	1、rpmbuild工具安装此处不再描述,详情查看顶部文章链接即可
	2、下载elasticsearch-7.14.2的tar包
	[root@python2 SOURCES]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.2-linux-x86_64.tar.gz
	3、下载elasticsearch版本对应的search-guard插件
	[root@python2 SOURCES]# wget https://maven.search-guard.com/search-guard-suite-release/com/floragunn/search-guard-suite-plugin/7.14.2-52.3.0/search-guard-suite-plugin-7.14.2-52.3.0.zip

	[root@python2 SOURCES]# https://docs.search-guard.com/latest/search-guard-installation

至此源码包准备完成,下面开始编写spec文件

二、spec文件

1.基础信息

文件如下(示例):

#自定义宏,相当于Linux中"Key-Value"变量形式
#--->名称
%define Name elasticsearch
#--->版本
%define Version 7.14.2
#--->本rpm包中需更换的配置文件

#--->本rpm包默认安装的路径
%define InstallPath /export/server/elasticsearch-7.14.2
#-->rpm包封装进去的脚本
%define configYaml elasticsearch.yml
%define search_guard  search-guard-suite-plugin-7.14.2-52.3.0.zip
%define search_tlstools search-guard-tlstool-1.7.tar.gz
%define __spec_install_post %{nil}
%define _build_id_links none
# 软件包的名称 
Name: %{Name}
# 软件包的版本 
Version: %{Version}
# 软件包发布序列号,1表示第几次打包 %{?dist} 会再包名中添加操作系统系统
Release: 1
# 软件包的概要信息,不要超过50个 
# 软件授权方式 
License: BSD

# 软件分类
Group: System Middleware
# 源代码软件包的官方地址或源码包的下载地址 
URL: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.2-linux-x86_64.tar.gz

Summary: The elasticsearch for centos 7.14.2 x86_64.
# 源代码软件包的名字 
Source0: %{Name}-%{Version}-linux-x86_64.tar.gz
Source3: %{configYaml}
Source4: %{search_guard}
Source5: %{search_tlstools}

# install使用的虚拟目录,安装后就在该目录下打包 
AutoReqProv: no
#制作过程中用到的软件包
Requires: bash

#软件包详细描述信息 
%description
This is %{Name}

2.%prep

解压源码包部分
如下(示例):

# 安装前的准备工作,一般用于解压源码包
%prep
#解压并cd到相关目录  tar xf SOURCES/xxx.tar.gz -C BUILD && cd BUILD
%setup -q -n elasticsearch-7.14.2  #-q 静默 不输出信息  -n 指定解压后的名称

3.%Install

此部分主要用于解压后的源码安装及目录创建等工作
在该文件中主要实现目录创建、search-guard插件的安装及密钥文件的创建工作,并将准备好的文件和目录拷贝到BUILDROOT目录下

# 源码安装
#目前还是在/export/rpmbuild/BUILD/目录中,执行以下操作
#rm -rf /export/rpmbuild/BUILDROOT
%install
%{_rm} -rf %{buildroot} # 清理之前的安装
mkdir -p /tmp/search-guard-tlstool
tar -zxvf %{SOURCE5} -C /tmp/search-guard-tlstool
cd /tmp/search-guard-tlstool/config/ && cp example.yml tlsconfig.yml
sed -i '/^#/d; /^$/d' tlsconfig.yml
sed -i '/root\.ca\.example\.com/c\      dn: CN=root.ca.com.local,OU=CA,O=com,DC=com,DC=local' tlsconfig.yml
sed -i '/signing\.ca\.example\.com/c\      dn: CN=root.ca.com.local,OU=CA,O=com,DC=com,DC=local' tlsconfig.yml
sed -i 's/#nodesDn/nodesDn/' tlsconfig.yml
sed -i 's/#- "CN=\*.example.com,OU=Ops,O=Example Com\\\\, Inc.,DC=example,DC=com"/- "CN=\*.com.local,OU=Ops,O=com,DC=com,DC=local"/' tlsconfig.yml
sed -i 's/# nodeOid: "1.2.3.4.5.5"/nodeOid: "1.2.3.4.5.5"/' tlsconfig.yml
sed -i '88,99d' tlsconfig.yml
sed -i 's/- name: node1/- name: esnode/' tlsconfig.yml
sed -i '/dn: CN=node1\.example\.com*/c\    dn: CN=esnode.com.local,OU=Ops,O=com,DC=com,DC=local' tlsconfig.yml
sed -i 's/dns: node1.example.com/dns: esnode/' tlsconfig.yml
sed -i '/dn: CN=spock\.example\.com/c\    dn: CN=spock.com.local,OU=Ops,O=com,DC=com,DC=local' tlsconfig.yml
sed -i '/dn: CN=kirk\.example\.com/c\    dn: CN=kirk.com.local,OU=Ops,O=com,DC=com,DC=local' tlsconfig.yml
sed -i 's/pkPassword: auto/pkPassword: none/' tlsconfig.yml
cd /tmp/search-guard-tlstool/tools/
./sgtlstool.sh -c ../config/tlsconfig.yml -ca
./sgtlstool.sh -c ../config/tlsconfig.yml -crt
cd out/ && chmod 644 root-ca.* signing-ca.* esnode* kirk.*
mkdir -p %{buildroot}%{InstallPath}/plugins/search-guard-7
mkdir -p %{buildroot}%{InstallPath}/{modules,logs,data,lib,config,bin}
cp -rp /tmp/search-guard-tlstool/tools/out/{root-ca.pem,kirk.pem,kirk.key,esnode.pem,esnode.key} %{buildroot}%{InstallPath}/config

# 复制自定义的或额外的配置文件和脚本
unzip %{SOURCE4} -d %{buildroot}%{InstallPath}/plugins/search-guard-7/
cp -rp %{_builddir}/%{Name}-%{Version}/* %{buildroot}%{InstallPath}/
rm -rf %{buildroot}%{InstallPath}/jdk

4.%file

主要用于安装后目录下都包含哪些文件或子目录

%files
%defattr(-,elasticsearch,elasticsearch,-)
%dir %{InstallPath}
%dir %{InstallPath}/bin
%dir %{InstallPath}/config
%dir %{InstallPath}/lib
%dir %{InstallPath}/logs
%dir %{InstallPath}/data
%dir %{InstallPath}/modules
%dir %{InstallPath}/plugins
%{InstallPath}/bin/*
%{InstallPath}/config/*
%{InstallPath}/lib/*
%{InstallPath}/modules/*
%{InstallPath}/plugins/*
%{InstallPath}/NOTICE.txt
%{InstallPath}/LICENSE.txt
%{InstallPath}/README.asciidoc

5.%post

主要用于安装rpm后做的相关操作,比如启动进程、创建用户等工作。在此文件中,该部分主要用于替换elasticsearch.yml文件、授权、设置所需要的内核参数、初始化search-guard插件并重置es密码

%post
#!/bin/sh
cat >%{InstallPath}/config/elasticsearch.yml<<EOF
cluster.name: cityos

node.name: wangyingkai-test-01

path.data: %{InstallPath}/data
path.logs: %{InstallPath}/logs
# Lock the memory on startup:
#bootstrap.memory_lock: true
network.host: $local_ip
http.port: 9200

discovery.seed_hosts: ["$local_ip"]
cluster.initial_master_nodes: ["$local_ip"]
#discovery.zen.minimum_master_nodes:

#gateway.recover_after_nodes: 3

# Search Duard Configure
action.auto_create_index: true
node.master: true
node.data: true
searchguard.ssl.transport.pemcert_filepath: esnode.pem
searchguard.ssl.transport.pemkey_filepath: esnode.key
searchguard.ssl.transport.pemtrustedcas_filepath: root-ca.pem
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
searchguard.authcz.admin_dn:
- CN=kirk.com.local,OU=Ops,O=com,DC=com,DC=local
searchguard.cert.oid: 1.2.3.4.5.5
EOF

# edit config file 修改yml文件
sed -i "s/node.name:.*/node.name: $local_ip/g" %{InstallPath}/config/elasticsearch.yml

# useradd elasticsearch 创建用户
id elasticsearch > /dev/null 2>&1
if [ $? == 0 ];then
        echo 'elasticsearch user exist.'
else
        useradd -s /sbin/nologin elasticsearch
fi

#chown 设置目录权限
chown -R elasticsearch:elasticsearch %{InstallPath}

#设置kernel参数
if ! grep -w "fs.file-max" /etc/sysctl.conf |grep -v ^# >/dev/null
then
   sed -i '$a\\nfs.file-max = 65536' /etc/sysctl.conf
fi

if ! grep -w "vm.max_map_count" /etc/sysctl.conf |grep -v ^#  >/dev/null
then
   sed -i '$a\\nvm.max_map_count = 262144' /etc/sysctl.conf
fi
sysctl -p > /dev/null
# 启动 Elasticsearch 服务
su elasticsearch -c "%{InstallPath}/bin/elasticsearch -d -p %{InstallPath}/%{Name}.pid"
# 等待 Elasticsearch 启动,修改密码
until curl -s http://$local_ip:9200 > /dev/null; do
    echo "Waiting for Elasticsearch to start..."
    sleep 10
done

# 生成哈希密码并更新配置文件
HASHED_PASSWORD=$(%{InstallPath}/plugins/search-guard-7/tools/hash.sh -p "0gvzJr66iNs5")
# 转义特殊字符
ESCAPED_HASHED_PASSWORD=$(echo "$HASHED_PASSWORD" | sed 's/[\/&]/\\&/g')
# 更新 sg_internal_users.yml 文件
if [ -n "$ESCAPED_HASHED_PASSWORD" ]; then
   sed -i 's/^  hash: ".*"/  hash: "'"$ESCAPED_HASHED_PASSWORD"'"/' %{InstallPath}/plugins/search-guard-7/sgconfig/sg_internal_users.yml
   sed -i 's/\r//g' %{InstallPath}/plugins/search-guard-7/sgconfig/sg_internal_users.yml
fi

#修改完配置文件并执行初始化
cd %{InstallPath}/plugins/search-guard-7/tools && sh sgadmin.sh -h $local_ip -cd ../sgconfig -key ../../../config/kirk.key -cert ../../../config/kirk.pem -cacert ../../../config/root-ca.pem -nhnv -icl

6.%postun

这部分主要用于卸载后需要做的任务,比如:删除目录等任务工作,在该spec文件中,这部分主要用于根据pid是否存在停止程序、删除目录,完成相应的卸载工作

%postun -p /bin/sh
#!/bin/bash
PID_FILE="%{InstallPath}/%{Name}.pid"
DIR_TO_REMOVE="%{InstallPath}"

# Check if the PID file exists and read the PID from it
if [ -f "$PID_FILE" ]; then
    PID=$(cat "$PID_FILE")
    # Check if a process with the given PID exists
    if ps -p $PID > /dev/null 2>&1; then
        # Kill the process with the PID found in the PID file
        kill $PID
        # Wait a moment to allow the process to terminate
        sleep 1
    fi
    # Remove the PID file
    rm -f "$PID_FILE"
fi

# Remove the directory
rm -rf "$DIR_TO_REMOVE"

三、成果演示

1.执行构建过程图示例

在这里插入图片描述
在这里插入图片描述

2.执行安装RPM包示例

在这里插入图片描述
在这里插入图片描述

3.进程检查

在这里插入图片描述

4.访问esApi

在这里插入图片描述在这里插入图片描述


总结

通过完成本篇文章,已经对rombuild有了60%的理解和使用,熟能生巧,希望也对大家的实际工作能起到帮助作用。加油!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/787957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux--深入理与解linux文件系统与日志文件分析

一、文件与存储系统的 inode 与 block 1.1 硬盘存储 最小存储单位:扇区( sector )每个扇区存储大小:512 字节1.2 文件存取--block block(块),每个 block 块大小为:4k由连续的八个扇区组成一个 block 块是文件索引最小的单位每个 block 块中包括:文件数据文件数据:就…

LeetCode(2)-反转链表、删除链表中等于val的节点、返回链表中的中间节点

一、反转链表 . - 力扣&#xff08;LeetCode&#xff09; 解法1&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListN…

ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call

在另外一个数据库建立dblink的时候&#xff0c;发现执行命令报错&#xff1a; 被连接的数据库我也上去过&#xff0c;用工具尝试登陆也报错&#xff1a; IO Error: Got minus one from a read call, connect lapse 1 ms., Authentication lapse 0 ms. Got minus one from a …

Redis过期策略

过期的key集合 Redis会将每个设置了过期时间的key放入到一个独立的字典中&#xff0c;以后会定时遍历这个字典来删除到期的key。除了定时遍历之外&#xff0c;他还会使用惰性策略来删除过期的key&#xff0c;所谓惰性策略就是在客户端访问这个key的时候&#xff0c;redis对key…

生成随机密码

生成8位无重复的密码&#xff08;可以包含数字、大小写字母&#xff09; import random import string character string.digits string.ascii_letters password .join(random.sample(character, 8)) print(f"生成的随机密码为:{password}")

品牌策划秘籍:掌握这些技巧,让你的品牌一炮而红!

作为一名文案策划老司机&#xff0c;这么多年了&#xff0c;总会有一些经验的&#xff0c;这里分享出来&#xff0c;希望能够帮助后来人少走弯路吧。 想要做好品牌和文案策划&#xff0c;首先得做好“侦查”工作。 深入市场&#xff0c;了解行业动态&#xff0c;研究竞争对手…

智能遥测终端机RTU-精确监控 智能运维

智能遥测终端机RTU是物联网领域中一种重要的设备&#xff0c;它的出现无疑为远程监控和数据采集提供了强大的支持。计讯物联智能遥测终端机RTU具备数据采集、处理、通信和控制功能的设备&#xff0c;可以实现对远程设备的监控与控制。它在物联网系统中扮演着桥梁的角色&#xf…

【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速度、电流控制】

目录 PID控制滤波单独位置控制单独速度控制单独电流控制位置-速度-电流串级控制 上一节&#xff0c;通过对SVPWM的推导&#xff0c;我们获得了控制电机转子任意受力的能力。本节&#xff0c;我们选用上节得到的转子dq轴解耦的SVPWM形式&#xff0c;对转子受力进行合理控制&…

AE-关键帧

目录 关键帧操作步骤&#xff08;以位置变化为例&#xff09; 1.确定动画起点 2.设置起点的位置属性 3.为起点打上关键帧 4.确定动画终点 5.设置终点的位置属性 改变动画速度 1.选中所有关键帧 2.拖拽 时间反向关键帧 1.选中要反向的关键帧 2.使用时间反向关键帧 …

Websocket 替代方案:如何使用 Firestore 监听实时事件

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 ​在现代 Web 开发中,实时更新功能对于许多应用程序(如聊天应用、协作工具和在线游戏)都是必不可少的。虽然 WebSocket 是一种常用的实时通信技术,但 Google 的 Firestore 也提供了一种强大的替代方案,使得实时监听变得…

数字信号处理教程(3)——z变换

在连续时间域中的每一种分析方法&#xff0c;在离散时间域中想必也能得到对应一种分析方法。连续傅里叶变换对应着离散傅里叶变换&#xff08;DFT&#xff09;&#xff0c;而在拉普拉斯变换则是对应着z变换。z变换能够将信号表示成离散复指数函数的线性组合。连续傅里叶变换可以…

运维系列.Nginx配置文件结构功能总结

运维系列 Nginx配置文件结构功能总结 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_285…

泛微E-Cology getFileViewUrl SSRF漏洞复现

0x01 产品简介 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 0x02 漏洞概述 泛微E-Cology getFileViewUrl 接口处存在…

Java如何自定义注解及在SpringBoot中的应用

注解 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

灵活多变的对象创建——工厂方法模式(Python实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;在上一篇文章中&#xff0c;我们聊了聊简单工厂模式&#xff0c;今天&#xff0c;我们要进一步探讨一种更加灵活的工厂设计模式——工厂方法模式。如果说简单工厂模式是“万能钥匙”&#xff0c;那工厂方法模式就是“变形金刚”…

Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

干货:高水平论文写作思路与方法

前言:Hello大家好,我是小哥谈。高水平论文的写作需要扎实的研究基础和严谨的思维方式。同时,良好的写作技巧和时间管理也是成功的关键。本篇文章转载自行业领域专家所写的一篇文章,希望大家阅读后可以能够有所收获。🌈 目录 🚀1.依托事实/证据,通过合理的逻辑,…

【MindSpore学习打卡】应用实践-热门LLM及其他AI应用-使用MindSpore实现K近邻算法对红酒数据集进行聚类分析

在机器学习领域&#xff0c;K近邻算法&#xff08;K-Nearest Neighbor, KNN&#xff09;是最基础且常用的算法之一。无论是分类任务还是回归任务&#xff0c;KNN都能通过简单直观的方式实现高效的预测。在这篇博客中&#xff0c;我们将基于MindSpore框架&#xff0c;使用KNN算法…

for nested data item, row-key is required.报错解决

今天差点被一个不起眼的bug搞到吐&#xff0c;就是在给表格设置row-key的时候&#xff0c;一直设置不成功&#xff0c;一直报错缺少row-key&#xff0c;一共就那两行代码 实在是找不到还存在什么问题... 先看下报错截图... 看下代码 我在展开行里面用到了一个表格 并且存放表格…

【算法】代码随想录之数组(更新中)

文章目录 前言 一、二分查找法&#xff08;LeetCode--704&#xff09; 二、移除元素&#xff08;LeetCode--27&#xff09; 前言 跟随代码随想录&#xff0c;学习数组相关的算法题目&#xff0c;记录学习过程中的tips。 一、二分查找法&#xff08;LeetCode--704&#xff0…