目录
命令说明
常见问题
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 </dev/tty
case "$__choice" in
y|Y) echo "继续安装...";;
n|N) echo "退出安装..."&exit;;
*) echo "退出安装..."&exit;;
esac
fi
else
#如果当前为非lts版本,将要升级的版本为lts版本,则输出相关的友好提示和是否安装的选项
if [[ $(cat ${__current_dir}/metersphere/version) =~ "lts" ]];then
log "\e[31m从非LTS版本升级到LTS版本后,后续只能自动升级LTS版本,如升级非LTS版本,需手动升级!\e[0m"
read -p "是否确认升级? [n/y]" __choice </dev/tty
case "$__choice" in
y|Y) echo "继续安装...";;
n|N) echo "退出安装..."&exit;;
*) echo "退出安装..."&exit;;
esac
fi
fi
创建安装目录,复制安装包文件,设置文件备份命名格式
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