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

脚本自动化创建AWS EC2实例+安装ElasticSearch和Kibana+集成OpenTelemetry监控

文章目录

  • 为什么要通过脚本来部署服务器?
  • EC2实例类型+硬件选择
    • 实例类型的选择
    • 内存
    • CPU
    • 存储
    • 架构
    • 操作系统
    • 最终的选择
  • 其他配置
    • 安全组配置
    • 网络配置
    • IAM Role
    • Key Pair
    • 内部域名
  • 书写自动化脚本
    • 属性文件
    • EBS配置文件
    • 创建EC2实例命令
      • user data 文件
      • OpenTelemetry监控
    • 创建内部域名
    • 发送部署结果消息通知相关人员
  • 验证
  • 总结

由于最近参与了部分部署服务器的工作,记录并总结下第一次参与利用脚本自动化部署服务器的过程和思路。

为什么要通过脚本来部署服务器?

在实际生产中,我们规定当新创建一台服务器、上线或下线某台服务器时不允许通过在云服务厂商的控制台上用鼠标完成操作这种方式来创建,原因是

  1. 流程无法标准化,谁知道每次鼠标点点点都干了什么,如果换其他人维护,不熟悉的人不知道创建一台服务器需要哪些步骤
  2. 流程无法标准化带来的后果就是无法自动化,每部署一台服务器都要这么干,重复工作且长期这么做极容易出错
  3. 通过脚本实现,将脚本的每次改动通过git的版本控制,日后回顾时知道当时为什么要增加或减少某个步骤

EC2实例类型+硬件选择

在书写脚本之前,我们得先根据实际应用场景选择对应的类型和硬件。

实例类型的选择

我们打算在该实例上安装单机版的ElasticSearch+Kibana,所以我们选择内存优化型而不是通用型或计算优化型或其他类型

内存

由于我们对这个ElasticSearch存储的都是非核心数据且是单机,再加上以往的经验,我们认为16GB是一个合适的值

CPU

根据ElasticSearch官方文档,CPU通常不是限制ElasticSearch的因素,所以我们初期认为2个CPU足够

存储

我们使用EBS+gp3,初始容量为30GB。容量预估是根据实际测试结果确定的

架构

有x86_64和arm64两种选择,arm64相对便宜一点,而且我们开始逐渐将架构由x86_64过渡到arm64,所以选择arm64

操作系统

操作系统全平台保持一致,统一为Rocky Linux 8.10。AWS中对应的AMI为ami-06459b48b47a92d77

最终的选择

经过上述条件过滤之后,可选的实例类型为r6g.large、r7g.large、r8g.large。由于r8g.large是最新的,我们担心其稳定性,所有我们选择了中间版本r7g.large

其他配置

安全组配置

根据需求将kibana的5601,elasticsearch的9200端口开放以允许内部web server服务器访问

网络配置

和其他服务器一样,使用统一的VPC和子网

IAM Role

根据需要配置IAM Role

Key Pair

和其他服务器一样,使用统一的key pair

内部域名

我们所有的服务器都通过内部域名访问而不是IP,因为IP可能会变。所以在写脚本之前要把最终要用的内部域名确定下来,例如:elastic-stack-standalone.xxx.io

书写自动化脚本

使用aws ec2 cli的run-instances命令来创建实例和aws route53 cli的change-resource-record-sets命令来创建内部域名

属性文件

我们将上述硬件的配置和其他配置都放到一个属性文件中server.properties

SERVER_TYPE="elastic-stack-standalone"
SERVER_INSTANCE_TYPE="r7g.large"
# arm64 rocky linux 8.9 instead of x86_64
SERVER_AMI="ami-06459b48b47a92d77"# security group id
SG_ID="security group id"# key pair.
KEY_PAIR_NAME=keyPairName# networking
SUBNET_ID="subnet id"# elastic stack standalone server does not need public IP
PUBLIC_IP=""# private domain name
ROUTE53_FILE="change-resource-record-sets.json"
PRIVATE_DOMAIN="elastic-stack-standalone.xxx.io"
HOSTED_ZONE_ID=hostZoneId

EBS配置文件

device-mappings.json

[{"DeviceName": "/dev/sda1","Ebs": {"VolumeSize": 30,"VolumeType": "gp3","DeleteOnTermination": true}}
]

创建EC2实例命令

除USER_DATA 所有变量都从server.properties中读取

aws ec2 run-instances --image-id ${SERVER_AMI} \
--key-name $KEY_NAME \
--user-data "${USER_DATA}" \
--instance-type ${SERVER_INSTANCE_TYPE} \
--block-device-mappings device-mappings.json  \
--subnet-id ${SUBNET_ID} \
--security-group-ids ${SG_ID} \
--private-ip-address $PRIVATE_IP

user data 文件

user data可以理解为AWS 创建Instance之后,你希望执行的后续操作。
例如

  1. 升级操作系统
  2. 安装软件,如git, ldap client
  3. 创建及配置用户

user-data.txt内容为

install_software() {echo "install required software"yum install expect git openldap-clients sssd sssd-ldap net-tools compat-openssl10 bc -y
}
init_os() {# upgrade rocky linux to 8.10 from 8.9yum -y updateconfig_securityconfig_network_and_firewallconfig_system_settings_for_elastic_stackinstall_software
}config_ldap_client() {echo "config ldap client"CONF="/git/repositories/deployment/server-setup/ldap-client"yes | cp -fp $CONF/etc/openldap/ldap-pro.conf /etc/openldap/ldap.confyes | cp -fp $CONF/etc/sssd/sssd-pro.conf /etc/sssd/sssd.conf# reload sssd servicechmod 600 /etc/sssd/sssd.confsystemctl restart sssd oddjobdsystemctl enable sssd oddjobd# create home directory for ldap loginauthselect select sssd with-mkhomedirsystemctl restart sshd#Add LDAP users to proper user groupsfor U in userList; dousermod -aG wheel $Udone
}install_elastic_stack_with_rpm() {rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchcat <<EOF | tee /etc/yum.repos.d/elasticsearch.repo >/dev/null
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=0
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
EOFinstall_elasticsearch_then_startinstall_kibana_then_start
}install_monitor() {cp -rp  /root/repositories/deployment/server-setup/monitored_host /opt/chmod u+x /opt/monitored_host/elastic-stack/standalone/monitor.sh/opt/monitored_host/elastic-stack/standalone/monitor.sh
}main() {init_ospull_git_repoconfig_ldap_clientinstall_elastic_stack_with_rpminstall_otel_monitor
}
main

主要流程见main函数,我没有把所有函数都写出来,只列举了几个函数:例如将Rocky Linux 8.9 升级到8.10,因为AWS 提供的AMI最新为8.9,我们使用的是8.10; 关于服务器用户我们使用LDAP进行管理

OpenTelemetry监控

不了解opentelemetry的同学,建议查看官方文档去了解它到底是干什么的。

我们对于OS级别的监控使用node_exporter,对于ElasticSearch的监控使用elasticsearch_exporter,然后统一使用otel_collector进行收集metrics并暴露出去供Prometheus服务器收集。

monitor.sh

#!/bin/bash
# this scirpt will install node_exporter, elasticsearch_exporter opentelemetry collector
workspace=/opt/monitored_hostarchitecture=$(arch)
hardware_architecture=$( [ "$architecture" = "aarch64" ] && echo "arm64" || ( [ "$architecture" = "x86_64" ] && echo "amd64" || echo "unknown-architecture" ) )echo "The architecture is: $hardware_architecture"install_node_exporter() {cd /optURL=$(curl -s https://api.github.com/repos/prometheus/node_exporter/releases | grep browser_download_url | grep "linux-$hardware_architecture" | head -n 1 | cut -d '"' -f 4)FILE=$(echo $URL|awk -F"/" '{print $NF}')DIR=$(echo $URL|awk -F"/" '{print $NF}'|sed 's/\.tar\.gz//g')curl -LO $URLtar -zxf $FILErm -rf /opt/node_exporterln -s /opt/$DIR /opt/node_exporterrm -f $FILE# add node_exporter servicecd $workspace\cp systemd_service/node_exporter.service /etc/systemd/systemsystemctl daemon-reloadsystemctl enable node_exporter.servicesystemctl start node_exporter.service
}install_elasticsearch_exporter() {cd /optURL=$(curl -s https://api.github.com/repos/prometheus-community/elasticsearch_exporter/releases | grep browser_download_url | grep "linux-$hardware_architecture" | head -n 1 | cut -d '"' -f 4)FILE=$(echo $URL|awk -F"/" '{print $NF}')DIR=$(echo $URL|awk -F"/" '{print $NF}'|sed 's/\.tar\.gz//g')curl -LO $URLtar -zxf $FILEln -s /opt/$DIR /opt/elasticsearch_exporterrm -f $FILE# add servicecd $workspace\cp systemd_service/elastic_stack_sre_exporter.service /etc/systemd/systemsystemctl daemon-reloadsystemctl enable elastic_stack_sre_exporter.servicesystemctl start elastic_stack_sre_exporter.service
}install_otelcol() {cd /optURL=$(curl -s https://api.github.com/repos/open-telemetry/opentelemetry-collector-releases/releases|grep "browser_download_url"|grep -v "otelcol-contrib"|grep rpm|grep "linux_$hardware_architecture"|head -n 1|cut -d '"' -f 4)FILE=$(echo $URL|awk -F"/" '{print $NF}')curl -LO $URLrpm -iUh $FILErm -f $FILE# add otel useruseradd otel -s /sbin/nologin -M# add otel config pathmkdir /etc/otelcolcd "$workspace"\cp elastic-stack/standalone/otelcol.yml /etc/otelcol/config.yamlsed -ri 's#( *host_name: ).*#\1"'$(hostname)'"#' /etc/otelcol/config.yaml\cp systemd_service/otelcol.service /etc/systemd/systemsystemctl daemon-reloadsystemctl enable otelcol.servicesystemctl restart otelcol.service
}
main() {install_node_exporterinstall_elasticsearch_exporterinstall_otelcol
}
main

otel_collector配置文件

extensions:health_check:receivers:prometheus/os:config:scrape_configs:- job_name: 'node_exporter'scrape_interval: 5sstatic_configs:- targets:- "127.0.0.1:9100"prometheus/elasticsearch:config:scrape_configs:- job_name: 'elasticsearch_exporter'scrape_interval: 5sstatic_configs:- targets:- "127.0.0.1:9114"exporters:prometheus/main:endpoint: "0.0.0.0:8090"const_labels:host_locale: "product"host_name: "replace_me"service:pipelines:metrics/00:receivers: [prometheus/os, prometheus/elasticsearch]exporters: [prometheus/main]

创建内部域名

change-resource-record-sets.json

{"Changes": [{"Action": "UPSERT","ResourceRecordSet": {"Name": "host.xxxx.io","Type": "A","TTL": 300,"ResourceRecords": [{"Value": "IP0"}]}}]
}

route53 cli 请求命令

# 替换json文件中的值
ROUTE53_REQUEST=$(cat ${ROUTE53_FILE});
ROUTE53_REQUEST=${ROUTE53_REQUEST/host.${PRIVATE_DOMAIN}/${HN}.${PRIVATE_DOMAIN}}
ROUTE53_REQUEST=${ROUTE53_REQUEST/IP0/${PRIVATE_IP}}aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch "${ROUTE53_REQUEST}" --output json

发送部署结果消息通知相关人员

部署流程为只需要执行一个脚本,然后即可干别的事情去了。等到主要脚本执行完毕,发送部署结果通知相关人员或更新上线服务器列表。这一部分是集成哪家IM,看你们公司实际用哪家,按需接入即可

验证

验证的流程,按照道理来说也要集成到脚本中,我这里没有集成。采取了手动验证的方式,主要验证:

  1. OS是否已升级
  2. 配置的用户是否可以登录服务器
  3. elasticsearch和kibana是否可以正常访问
  4. 其他web server是否可以通过内部域名访问elasticsearch
  5. 是否可以通过Prometheus收集指标

总结

整体思路如下:

  1. 所有服务器部署流程使用同一个部署脚本来保证部署流程标准化
  2. 每个服务器的server.properties和user-data.txt不一样,每次部署只需要提供这两个文件即可
  3. 对于部署之后的验证也可写成脚本集成到部署流程中来

相关文章:

脚本自动化创建AWS EC2实例+安装ElasticSearch和Kibana+集成OpenTelemetry监控

文章目录 为什么要通过脚本来部署服务器&#xff1f;EC2实例类型硬件选择实例类型的选择内存CPU存储架构操作系统最终的选择 其他配置安全组配置网络配置IAM RoleKey Pair内部域名 书写自动化脚本属性文件EBS配置文件创建EC2实例命令user data 文件OpenTelemetry监控 创建内部域…...

【设计模式-命令】

定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使您能够使用不同的请求、排队请求或记录请求&#xff0c;并支持可撤销的操作。该模式通过将请求与其执行分离&#xff0c;使得请求者和接收者之间…...

【API安全】crAPI靶场全解

目录 BOLA Vulnerabilities Challenge 1 - Access details of another user’s vehicle Challenge 2 - Access mechanic reports of other users Broken User Authentication Challenge 3 - Reset the password of a different user Excessive Data Exposure Challenge …...

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案&#xff1a;A 分析&#xff1a;文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够…...

【Python报错已解决】TypeError: ‘int‘ object is not subscriptable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

《OpenCV》—— 指纹验证

用两张指纹图片中的其中一张对其验证 完整代码 import cv2def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)def verification(src, model):sift cv2.SIFT_create()kp1, des1 sift.detectAndCompute(src, None)kp2, des2 sift.detectAndCompute(model, None)fl…...

HBase 性能优化的高频面试题及答案

目录 高频面试题及答案1. 如何通过数据建模优化 HBase 性能?2. 如何优化 HBase 的写入性能?3. 如何通过压缩优化 HBase 的存储性能?4. 如何通过调整 RegionServer 配置优化性能?5. 如何优化 HBase 的读取性能?6. 如何通过使用 HBase 的版本控制优化性能?7. 如何通过使用合…...

excel不经过后台实现解析和预览(vue)

数据流读取和数据解析方面通过xlsx组件 安装命令 npm install xlsx -S 它先将上传的excel变成流&#xff0c;然后再根据流进行下一步处理。这个流可以交给其他组件处理比如我用的预览组件是用了其他组件&#xff08;vue-office/excel&#xff09;就是把这个流交给其它组件就…...

html5 + css3(上)

目录 HTML认知web标准vscode的简介和使用注释标题和段落换行和水平线标签文本格式化标签图片图片-基本使用图片-属性 绝对路径相对路径音频标签视频标签超链接 HTML基础列表列表-无序和有序列表-自定义 表格表格-使用表格-表格标题和表头单元格表格-结构标签&#xff08;了解&a…...

Flask+微信小程序实现Login+Profile

Python代码 首先flask的session用不了&#xff0c;只能用全局变量来实现。 import pymysql from flask import Flask, request, jsonify, session from flask_cors import CORS from flask import make_responseapp Flask(__name__) CORS(app, supports_credentialsTrue) #…...

后缀表达式中缀表达式转后缀表达式

后缀表达式的计算机求值 计算规则 从左至右扫描表达式&#xff0c;遇到数字时&#xff0c;将数字压入堆栈&#xff0c;遇到运算符时&#xff0c;弹出栈顶的两个数&#xff0c;用运算符对它们做相应的计算&#xff08;次顶元素 和 栈顶元素&#xff09;&#xff0c;并将结果入…...

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中&#xff0c;我们制作了AB分区系统镜像&#xff0c;并成功通过uboot加载kernel以及d…...

两数相加leetcode

第一个是测试用例代码&#xff0c;测试的是两个带头的逆序链表相加&#xff0c;并且有反转操作 但是题目要求的是不带头链表直接相加&#xff0c;不需要逆转&#xff0c;输出结果也是逆序的&#xff0c; 题解放在第二个代码中 #include<stdio.h> #include<stdlib.h…...

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后&#xff0c;在运行程序启动界面时&#xff0c;发现设置的样式无效&#xff0c;效果如下&#xff1a; /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* …...

AI 对话工具汇总

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: 前言: 在科技飞速发展的时代&#xff0c;AI 对话正逐渐成为我们获取信息、交流思想的新方式。它以强…...

面试题05.08绘制直线问题详解(考察点为位运算符)

目录 一题目&#xff1a; 二详细思路汇总&#xff1a; 三代码解答&#xff08;带注释版&#xff09;&#xff1a; 一题目&#xff1a; leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二详细思路汇总&#xff1a; 这里先剧透一下简单版思路哦&…...

埃及 Explained

古埃及&#xff0c;位于尼罗河畔的神秘文明&#xff0c;曾在北非的荒漠中繁荣昌盛。这个充满谜团的王国凭借其宏伟的成就和神秘的文化&#xff0c;数百年来吸引了无数人的好奇心。 埃及人创造了复杂的象形文字&#xff0c;建造了像吉萨大金字塔这样宏伟的建筑&#xff0c;并通…...

【Linux】第一个小程序——进度条实现

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

如何确定光纤用几芯 用光纤与网线区别在哪里

光纤用几芯&#xff1f; 光纤芯数&#xff0c;主要和光纤连接的设备接口和设备的通信方式有关。一般来说&#xff0c;光纤中光芯的数量&#xff0c;为设备接口总数乘以2后&#xff0c;再加上10%&#xff5e;20&#xff05;的备用数量&#xff0c;而如果设备的通信方式有设备多…...

使用Chrome浏览器时打开网页如何禁用缓存

缓存是浏览器用于临时存储网页资源的一种机制&#xff0c;可以提高网页加载速度和减轻服务器负载。 然而&#xff0c;有时候我们需要阻止缓存中的Chrome浏览器&#xff0c;以便获取最新的网页内容。以下是一些方法可以实现这个目标&#xff1a; 1、强制刷新页面&#xff1a;在C…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...