MeterSphere 安装脚本 install.sh 文件说明和常见问题

目录

命令说明

常见问题

MeterSphere已经卸载,为什么再次安装时,还会提示已安装

MeterSphere 修改安装目录不生效 

docker-compose 版本与配置文件不兼容或配置文件存在问题,请重新安装最新版本的 docker-compose 或检查配置文件

docker-compose 未正常安装,请先安装 docker-compose 后再次执行本脚本 

        

MeterSphere是一款开源持续测试平台,官方提供了交流群,群里经常会有同学询问安装部署相关的问题,在我看来,一部分部署中的问题都可以自己解决,前提是需要对MeterSphere的安装脚本足够熟悉,这样遇到一些报错时,就可以查看安装脚本中,这个报错是怎么来的,从而自己解决,提升自己解决问题的排查能力。下面介绍下MeterSphere v2.2.0版本的install.sh文件的命令内容和常见的部署问题。

命令说明

获取当前安装脚本所在目录

__current_dir=$(
   cd "$(dirname "$0")"
   pwd
)

定义args为输入的所有参数,获取当前系统类型

args=$@

获取当前系统

__os=`uname -a`

定义日志输出函数,log函数会输出安装日志,并输入到当前目录的install.log文件中

function log() {
   message="[MeterSphere Log]: $1 "
   echo -e "${message}" 2>&1 | tee -a ${__current_dir}/install.log
}

将以下变量输出为环境变量,判断是否已安装MeterSphere,设置kafka host为具体ip

set -a
 
#获取当前IP地址
__local_ip=$(hostname -I|cut -d" " -f 1)
 
#执行install.conf文件内容,即加载变量
source ${__current_dir}/install.conf
 
#如果存在~/.msrc文件,判断已安装MeterSphere,并重载MS_BASE变量,msrc文件中存放的是安装目录变量
if [ -f ~/.msrc ];then
  source ~/.msrc > /dev/null
  echo "存在已安装的 MeterSphere, 安装目录为 ${MS_BASE}/metersphere, 执行升级流程"
 
#如果不存在msrc文件,而存在/usr/local/bin/msctl,则从msctl文件中获取安装目录
elif [ -f /usr/local/bin/msctl ];then
  MS_BASE=$(cat /usr/local/bin/msctl | grep MS_BASE= | awk -F= '{print $2}' 2>/dev/null)
  echo "存在已安装的 MeterSphere, 安装目录为 ${MS_BASE}/metersphere, 执行升级流程"
 
#上两个文件都不存在,则判断未安装,从当前目录的install.conf文件中获取MS_BASE安装目录
else
  MS_BASE=$(cat ${__current_dir}/install.conf | grep MS_BASE= | awk -F= '{print $2}' 2>/dev/null)
  echo "安装目录为 ${MS_BASE}/metersphere, 开始进行安装"
fi
 
#如果MS_EXTERNAL_KAFKA=false,则获取当前服务器IP,Mac系统IP地址获取方式不同,需要判断一下
if [ ${MS_EXTERNAL_KAFKA} = 'false' ];then
   if [[ ${__os} =~ 'Darwin' ]];then
      MS_BASE=${MS_BASE:-~}
      __local_ip=$(ipconfig getifaddr en0)
      sed -i -e "s#MS_KAFKA_HOST=.*#MS_KAFKA_HOST=${__local_ip}#g" ${__current_dir}/install.conf
   fi
   sed -i -e "s#MS_KAFKA_HOST=.*#MS_KAFKA_HOST=${__local_ip}#g" ${__current_dir}/install.conf
fi
set +a

获取当前MeterSphere版本

__current_version=$(cat ${MS_BASE}/metersphere/version 2>/dev/null || echo "")

判断是否lts版本,以及输出提示和是否继续安装的选项

if [[ ${__current_version} =~ "lts" ]];then
 
  #如果当前为lts版本,将要升级的版本为非lts版本,则输出相关的友好提示和是否安装的选项
   if [[ ! $(cat ${__current_dir}/metersphere/version) =~ "lts" ]];then
      log "从LTS版本升级到非LTS版本,此版本包含实验性功能请做好数据备份工作"
      log "从2.0开始,我们去掉了zookeeper,升级了kafka和mysql,升级前请执行 msctl stop && docker rm zookeeper && docker rm kafka; 如果已经升级至2.0请忽略这条信息"
      read -p "是否确认升级? [n/y]" __choice 

创建安装目录,复制安装包文件,设置文件备份命名格式

log "拷贝安装文件到目标目录"
 
#创建安装目录,将版本文件复制到安装目录下,将当前metersphere目录复制到安装目录下,设置备份文件命名格式
mkdir -p ${MS_BASE}/metersphere
cp -f ./metersphere/version ${MS_BASE}/metersphere/version
cp -rv --suffix=.$(date +%Y%m%d-%H%M) ./metersphere ${MS_BASE}/

记录MeterSphere安装路径

echo "MS_BASE=${MS_BASE}" > ~/.msrc

安装msctl 命令

cp msctl /usr/local/bin && chmod +x /usr/local/bin/msctl
ln -s /usr/local/bin/msctl /usr/bin/msctl 2>/dev/null

安装docker

#如果已安装docker,则启动docker
if which docker >/dev/null; then
   log "检测到 Docker 已安装,跳过安装步骤"
   log "启动 Docker "
   service docker start 2>&1 | tee -a ${__current_dir}/install.log
else
 
  #如果未安装docker,判断当前目录下是否有docker目录,如果有,处理docker目录,安装docker,启动docker
   if [[ -d docker ]]; then
      log "... 离线安装 docker"
      cp docker/bin/* /usr/bin/
      cp docker/service/docker.service /etc/systemd/system/
      chmod +x /usr/bin/docker*
      chmod 754 /etc/systemd/system/docker.service
      log "... 启动 docker"
      service docker start 2>&1 | tee -a ${__current_dir}/install.log
 
  #如果未安装docker,判断当前目录下是否有docker目录,如果没有,在线安装并启动docker
   else
      log "... 在线安装 docker"
      curl -fsSL https://get.docker.com -o get-docker.sh 2>&1 | tee -a ${__current_dir}/install.log
      sudo sh get-docker.sh --mirror Aliyun 2>&1 | tee -a ${__current_dir}/install.log
      log "... 启动 docker"
      service docker start 2>&1 | tee -a ${__current_dir}/install.log
   fi
fi

检查docker服务是否正常运行

docker ps 1>/dev/null 2>/dev/null
if [ $? != 0 ];then
   log "Docker 未正常启动,请先安装并启动 Docker 服务后再次执行本脚本"
   exit
fi

安装docker-compose

if which docker-compose >/dev/null; then
   log "检测到 Docker Compose 已安装,跳过安装步骤"
else
 
  #如果没有安装docker-compose,判断当前目录下是否有docker目录,如果有,处理docker-compose目录,安装docker-compose
   if [[ -d docker ]]; then
      log "... 离线安装 docker-compose"
      cp docker/bin/docker-compose /usr/bin/
      chmod +x /usr/bin/docker-compose
   else
 
  #如果没有安装docker-compose,判断当前目录下是否有docker目录,如果没有,则在线安装docker-compose
      log "... 在线安装 docker-compose"
      curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2>&1 | tee -a ${__current_dir}/install.log
      chmod +x /usr/local/bin/docker-compose
      ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
   fi
fi

检查docker-compose是否正常安装

docker-compose version 1>/dev/null 2>/dev/null
 
#根据docker-compose version执行的结果判断是否正常安装docker-compose
if [ $? != 0 ];then
   log "docker-compose 未正常安装,请先安装 docker-compose 后再次执行本脚本"
   exit
fi

将配置信息存储到安装目录的环境变量配置文件中

echo '' >> ${MS_BASE}/metersphere/.env
cp -f ${__current_dir}/install.conf ${MS_BASE}/metersphere/install.conf.example

通过加载环境变量的方式保留已修改的配置项,仅添加新增的配置项

source ${__current_dir}/install.conf
source ~/.msrc >/dev/null 2>&1
__ms_image_tag=${MS_IMAGE_TAG}
__ms_jmeter_image=${MS_JMETER_IMAGE}
source ${MS_BASE}/metersphere/.env

把原来的kafka配置修改为IP

if [ ${MS_KAFKA_HOST} = 'kafka' ];then
  MS_KAFKA_HOST=${__local_ip}
fi

将当前安装包中ms-server和jmeter镜像版本环境变量输入到.env

export MS_IMAGE_TAG=${__ms_image_tag}
export MS_JMETER_IMAGE=${__ms_jmeter_image}
env | grep MS_ > ${MS_BASE}/metersphere/.env

创建.env跟install.conf的软链接

ln -s ${MS_BASE}/metersphere/.env ${MS_BASE}/metersphere/install.conf 2>/dev/null

将127.0.0.1 ${hostname}添加到hosts文件

grep "127.0.0.1 $(hostname)" /etc/hosts >/dev/null || echo "127.0.0.1 $(hostname)" >> /etc/hosts

根据安装模式加载compose_files变量值,该函数在msctl文件中定义

msctl generate_compose_files

根据msctl config结果判断docker-compose版本与配置文件是否存在问题

msctl config 1>/dev/null 2>/dev/null
if [ $? != 0 ];then
   msctl config
   log "docker-compose 版本与配置文件不兼容或配置文件存在问题,请重新安装最新版本的 docker-compose 或检查配置文件"
   exit
fi

设置COMPOSE_HTTP_TIMEOUT变量

export COMPOSE_HTTP_TIMEOUT=180

加载目标版本镜像文件

cd ${__current_dir}
 
# 进入当前安装包目录,加载镜像文件,如果没有镜像文件,则在线拉取镜像
if [[ -d images ]]; then
   log "加载镜像"
   for i in $(ls images); do
      docker load -i images/$i 2>&1 | tee -a ${__current_dir}/install.log
   done
else
   log "拉取镜像"
   msctl pull 2>&1 | tee -a ${__current_dir}/install.log
   docker pull ${MS_JMETER_IMAGE} 2>&1 | tee -a ${__current_dir}/install.log
   cd -
fi

先删除原有的相关容器和网络等,然后再重新创建新的容器

msctl down -v 2>&1 | tee -a ${__current_dir}/install.log
msctl up -d 2>&1 | tee -a ${__current_dir}/install.log

查看相关服务状态

msctl status 2>&1 | tee -a ${__current_dir}/install.log

输出安装完成,初始账号密码等提示信息

echo -e "======================= 安装完成 =======================\n" 2>&1 | tee -a ${__current_dir}/install.log
 
echo -e "请通过以下方式访问:\n URL: http://\$LOCAL_IP:${MS_SERVER_PORT}\n 用户名: admin\n 初始密码: metersphere" 2>&1 | tee -a ${__current_dir}/install.log
echo -e "您可以使用命令 'msctl status' 检查服务运行情况.\n" 2>&1 | tee -a ${__current_dir}/install.log-a ${__current_dir}/install.log

常见问题

MeterSphere已经卸载,为什么再次安装时,还会提示已安装

MeterSphere安装脚本通过两种方式判断是否已安装,~/.msrc或/usr/local/bin/msctl文件存在,则判断已存在。如果需要重新安装,可以通过rm -rf 命令直接把这两个文件删除,然后再次安装。

if [ -f ~/.msrc ];then
  source ~/.msrc > /dev/null
  echo "存在已安装的 MeterSphere, 安装目录为 ${MS_BASE}/metersphere, 执行升级流程"
#如果不存在msrc文件,而存在/usr/local/bin/msctl,则从msctl文件中获取安装目录
elif [ -f /usr/local/bin/msctl ];then
  MS_BASE=$(cat /usr/local/bin/msctl | grep MS_BASE= | awk -F= '{print $2}' 2>/dev/null)
  echo "存在已安装的 MeterSphere, 安装目录为 ${MS_BASE}/metersphere, 执行升级流程"
#上两个文件都不存在,则判断未安装,从当前目录的install.conf文件中获取MS_BASE安装目录
else
  MS_BASE=$(cat ${__current_dir}/install.conf | grep MS_BASE= | awk -F= '{print $2}' 2>/dev/null)
  echo "安装目录为 ${MS_BASE}/metersphere, 开始进行安装"
fi

MeterSphere 修改安装目录不生效 

跟上面的问题是同一个原因,因为判断这两个文件存在后,会从这两个文件中获取MS_BASE变量。所以解决方法也是将上述两个文件删除。

docker-compose 版本与配置文件不兼容或配置文件存在问题,请重新安装最新版本的 docker-compose 或检查配置文件

msctl config命令用于验证并查看compose文件配置,当docker-compose与compose file文件版本不兼容,或配置文件内容存在问题,比如docker-compose-server.yml文件中某个配置格式不对都会造成该错误提示

遇到这个问题,首先检查各个docker-compose-xxx.yml文件内容是否格式正确,建议下载安装包,使用刚下载的compose file,避免文件内容错误。

其次,如果的确docker-compose版本跟compose file文件版本不兼容,可以卸载当前的docker-compose,安装MeterSphere离线包中提供的docker-compose,安装步骤可以参考install.sh脚本内容。

if which docker-compose >/dev/null; then
   log "检测到 Docker Compose 已安装,跳过安装步骤"
else
  #如果没有安装docker-compose,判断当前目录下是否有docker目录,如果有,处理docker-compose目录,安装docker-compose
   if [[ -d docker ]]; then
      log "... 离线安装 docker-compose"
      cp docker/bin/docker-compose /usr/bin/
      chmod +x /usr/bin/docker-compose
   else
  #如果没有安装docker-compose,判断当前目录下是否有docker目录,如果没有,则在线安装docker-compose
      log "... 在线安装 docker-compose"
      curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2>&1 | tee -a ${__current_dir}/install.log
      chmod +x /usr/local/bin/docker-compose
      ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
   fi
fi

docker-compose 未正常安装,请先安装 docker-compose 后再次执行本脚本 

该错误提示是由于docker-compose version未正常输出结果,说明docker-compose未正常安装。可以卸载docker-compose,然后参考install.sh脚本重装docker-compose。

docker-compose version 1>/dev/null 2>/dev/null
#根据docker-compose version执行的结果判断是否正常安装docker-compose
if [ $? != 0 ];then
   log "docker-compose 未正常安装,请先安装 docker-compose 后再次执行本脚本"
   exit
fi

你可能感兴趣的:(MeterSphere功能,metersphere,测试工具,linux,运维)