当前位置:   article > 正文

spug上线服务踩坑记

spug

spug是一款优秀的自动化运维平台,  这让我们想自动化又向前迈了一步.

在过程中遇到的问题,记录在这里供各位看官参考.

目录

一、远程执行命令问题

二、软连接的问题

三、jdk 版本问题

四、ssh远程连接中传递变量

五、解决spug 上版卡一直卡主的问题

六、新建应用踩坑记

七、docker 容器重启登录报错的问题

八、spug 升级v3

启动容器

九、如何使用配置中心

十、审核发布


一、远程执行命令问题

利用spug打好包之后,如何分发到应用最终跑的那台主机上去。

这里有三个想法:

1、ssh 发布主机后 执行命令,

例如:

ssh 10.50 "ln -snf /opt/qwert-$SPUG_GIT_TAG.war /opt/eqwe_fi_-spug.war"

对于内置命令不需要写命令的绝对路径,

ssh 10.50 "setsid /usr/lcal/jdk1.8.0_121/bin/java -Xms512m -Xmx1024m ....

 对非内置命令需要写绝对路径,这是为何? 这是和 环境变量有关的

2、ssh之后去执行命令

 

在spug 常规发布中,在目标主机上ssh 发布主机,ssh IP "ls /opt"  这个可以执行出来 。但是 先ssh IP 再执行其他命令就不行

这是在非登录SHELL里执行的。

尝试使用ssh -tt 强制分配一个tty也不行

3、EOT End Of Text. 

看下面这个例子,登录到目标主机上去,执行完命令后退出,使用这种方式在需要发布的主机上把打好的包copy过去,然后开始启动流程

  1. ssh user@server /bin/bash <<'EOT'
  2. echo "These commands will be run on: $( uname -a )"
  3. echo "They are executed by: $( whoami )"
  4. EOT

这段shell 写的不是很好,硬编码严重,逻辑也有不严谨的地方。后续持续改进 

  1. echo "开始修改包名..............:"
  2. mv /opt/MPP/target/MPP.jar /opt/MPP/target/MPP_array_fi_$SPUG_GIT_TAG.jar
  3. echo "修改中..............:"
  4. sleep 1s
  5. if [ $? -eq 0 ]
  6. then
  7. echo "修改成功.............."
  8. else
  9. echo "修改失败,请确认.............."
  10. fi
  11. echo "开始移动包到指定服务器..............:"
  12. #todo 2021年7月6日10:03:21 自动免密验证
  13. # ssh 192.168.10.168 /bin/bash << 'EOT'
  14. # if [ -d /opt/servers/MPP4 ];then
  15. # echo "目录已存在"
  16. # else
  17. # mkdir -p /opt/servers/MPP4/
  18. # echo "目录创建成功"
  19. # fi
  20. # EOT
  21. scp /opt/MPP/target/MPP_array_fi_$SPUG_GIT_TAG.jar 192.168.10.168:/opt/servers/MPP4
  22. ssh 192.168.10.168 "ln -snf /opt/servers/MPP4/MPP_array_fi_$SPUG_GIT_TAG.jar /opt/servers/MPP4/MPP-spug.jar"
  23. # --------------------------------------------- ssh by sscripts start 2021年7月27日09:01:05
  24. ssh root@192.168.10.168 /bin/bash <<'EOT'
  25. cd /opt/servers/MPP4/
  26. echo "当前目录为:"
  27. pwd
  28. PID=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')
  29. PID_CNT=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|wc -l)
  30. if [ $PID_CNT -eq 1 ];then
  31. echo "进程已存在,pid: $PID..............:"
  32. echo "重启中..............:"
  33. ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|xargs kill -9
  34. sleep 10s
  35. date +%H:%M:%S
  36. PID_CNT1=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|wc -l)
  37. if [ $PID_CNT1 -eq 0 ];then
  38. echo "......启动命令$$........:"
  39. setsid /usr/local/jdk1.8.0_191/bin/java -Djava.rmi.server.hostname=192.168.10.168 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx4096m -jar -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/aplog/MPP/agc.log -Dspring.profiles.active=prod /opt/servers/MPP4/MPP-spug.jar --server.port=8066 --mq.quartzFlg=Y --etl.quartzFlg=N --mq.alarmQuartzFlg=N --mq.shopId=QQQ >/dev/null &
  40. PID1=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')
  41. echo "重启成功,pid: $PID1..............:"
  42. fi
  43. else
  44. date +%H:%M:%S
  45. echo "当前目录为:"
  46. pwd
  47. echo "启动中..............:"
  48. date +%H:%M:%S
  49. setsid /usr/local/jdk1.8.0_191/bin/java -Djava.rmi.server.hostname=192.168.10.168 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx4096m -jar -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/aplog/MPP/agc.log -Dspring.profiles.active=prod /opt/servers/MPP4/MPP-spug.jar --server.port=8066 --mq.quartzFlg=Y --etl.quartzFlg=N --mq.alarmQuartzFlg=N --mq.shopId=QQQ >/dev/null &
  50. PID2=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')
  51. date +%H:%M:%S
  52. echo "启动成功,PID为 $PID2..............:"
  53. fi
  54. EOT
  55. date +%H:%M:%S

二、软连接的问题

进入一个软连接目录,如果该目录被重新指向新的链接。

此时在当前目录看到的文件仍旧是旧文件.

cd出去,重新进入该目录文件才更新.

  

参考:

linux - Pseudo-terminal will not be allocated because stdin is not a terminal - Stack Overflow

三、jdk 版本问题

启动java程序时报如下错误

  1. Exception in thread "main" java.lang.UnsupportedClassVersionError: com/navi/RtmApplication : Unsupported major.minor version 52.0
  2. at java.lang.ClassLoader.defineClass1(Native Method)
  3. at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
  4. at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  5. at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
  6. at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
  7. at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
  8. at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  9. at java.security.AccessController.doPrivileged(Native Method)
  10. at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  11. at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  12. at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94)
  13. at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
  14. at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
  15. at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
  16. at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
  17. at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

打包机器的的JDK版本和AP服务器的JDK版本不一致导致的

打包环境: /usr/local/jdk1.8.0_144/bin/java

运行环境: /usr/local/jdk1.8.0_191/bin/java

打包环境jdk版本是向下兼容,如果运行环境的版本比打包的新则会报如上错误.

解决: 使用同一个jdk版本打包

--update 2022年8月10日09:57:40

今天在执行脚本模板的时候也同样报这个错误, 这仅仅是远程执行脚本 为何会对jdk版本有要求呢?  

其实是因为启动脚本中没有使用java的绝对路径导致的。

 参考: JAVA版本号的问题 Java版本号与JDK版本_renhq-CSDN博客_jdk与java版本

四、ssh远程连接中传递变量

问题: 

 解决:

 注意双引号才会有变量替换,再复习下shell的解析

五、解决spug 上版卡一直卡主的问题

上版的时候一直卡在检出后发布

这是在检出前打印配置信息

 解决: 

仔细观察发现打印配置文件卡主的地方是第一次出现中文注释的地方。

可以在cat 的时候直接转码

  1. echo "当前配置列表 ......"
  2. # iconv -f GBK -t UTF-8 用于转换中文乱码问题
  3. cat ./chot-configs/src/main/resources/application-production.properties | iconv -f GBK -t UTF-8
  4. echo "done"
  1. iconv命令 是用来转换文件的编码方式的,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。
  2. -f encoding :把字符从encoding编码开始转换。
  3. -t encoding :把字符转换到encoding编码。
  4. 列出当前支持的字符编码:
  5. iconv -l
  6. 将文件file1转码,转后文件输出到fil2中:
  7. iconv file1 -f EUC-JP-MS -t UTF-8 -o file2
  8. 这里,没-o那么会输出到标准输出。

六、新建应用踩坑记

模板已经算很完善了,为啥还会报错呢?发现是新建的应用中有一个空格,导致后面的命令执行失败。linux中对于名称这类的建议不要使用空格。如果非要用,那引用的时候需要加上引号。这个win是完全不同的

七、docker 容器重启登录报错的问题

docker 容器重启之后提示mysql报错。很明显chot这个账户访问mysql的权限被拿掉了,不知谁何时拿掉了chot的访问权限。

解决:

1、进入容器查看自定义mysql配置

  1. more /data/spug/spug_api/spug/overrides.py
  2. DEBUG = True
  3. ALLOWED_HOSTS = ['127.0.0.1']
  4. DATABASES = {
  5. 'default': {
  6. 'ATOMIC_REQUESTS': True,
  7. 'ENGINE': 'django.db.backends.mysql',
  8. 'NAME': 'spug',
  9. 'USER': 'chot',
  10. 'PASSWORD': '',
  11. 'HOST': '10.50.10.180',
  12. 'OPTIONS': {
  13. 'charset': 'utf8mb4',
  14. 'sql_mode': 'STRICT_TRANS_TABLES',
  15. }
  16. }
  17. }

 2、查看mysql数据库的user表权限分配。

  1. SELECT Host, `User`, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, Create_tablespace_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections, plugin, authentication_string, password_expired
  2. FROM mysql.`user`;
  3. delete from mysql.user where host='10.50.10.185' AND `User` = 'root' ;
  4. # 该语句用于为 root 用户授予所有权限,其中 *.* 表示所有数据库及表,'%' 表示任意主机,123456 是该用户的密码,grant with grant option 允许 root 用户给其它用户授权。
  5. grant all privileges on *.* to chot@'10.50.10.185' identified by 'chot123' with grant option;
  6. flush privileges;

 刚开始再想是给容器ip的权限还是宿主机,后来发现给宿主机的ip访问权限即可。

八、spug 升级v3

注意三点

1、从私服镜像

2、需要docker compose环境

3、绑定挂载卷先创建,不要覆盖旧版本的目录。(切记)

mkdir -p /data/spugv3/{mysql,service,repos}

安装步骤

准备docker compose文件

vi docker-compose.yml

  1. version: "3.3"
  2. services:
  3. db:
  4. image: chot-harbor.prod.com/mariadb:10.8.2
  5. container_name: spug-db
  6. restart: always
  7. command: --port 3306 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  8. volumes:
  9. - /data/spugv3/mysql:/var/lib/mysql
  10. environment:
  11. - MYSQL_DATABASE=spug
  12. - MYSQL_USER=spug
  13. - MYSQL_PASSWORD=spug.cc
  14. - MYSQL_ROOT_PASSWORD=spug.cc
  15. spug:
  16. image: chot-harbor.prod.com/openspug/spug-service
  17. container_name: spug
  18. privileged: true
  19. restart: always
  20. volumes:
  21. - /data/spugv3/service:/data/spug
  22. - /data/spugv3/repos:/data/repos
  23. ports:
  24. # 如果80端口被占用可替换为其他端口,例如: - "8000:80"
  25. - "80:80"
  26. environment:
  27. - MYSQL_DATABASE=spug
  28. - MYSQL_USER=spug
  29. - MYSQL_PASSWORD=spug.cc
  30. - MYSQL_HOST=db
  31. - MYSQL_PORT=3306
  32. depends_on:
  33. - db

启动容器

 docker-compose up -d 

  1. [root@p1edaspk02 /data/spugv3]#ll
  2. total 16
  3. -rw-r--r-- 1 root root 903 Feb 15 14:42 docker-compose.yml
  4. drwxr-xr-x 6 ods ssh_keys 4096 Feb 15 14:42 mysql
  5. drwxr-xr-x 2 root root 4096 Feb 15 14:38 repos
  6. drwxr-xr-x 7 root root 4096 Nov 22 22:40 service
  7. [root@p1edaspk02 /data/spugv3]#docker-compose up -d
  8. Pulling spug (10.50.10.185/spug/openspug/spug-service:)...
  9. latest: Pulling from spug/openspug/spug-service
  10. 2d473b07cdd5: Pull complete
  11. bdb0935e8d37: Pull complete
  12. 1d6205a807d3: Pull complete
  13. 59f34e576c77: Pull complete
  14. 02c1c97d4b1b: Pull complete
  15. 0c036ff8db69: Pull complete
  16. d29ea661ea93: Pull complete
  17. a771e1af3d9c: Pull complete
  18. 4c5ea51c617e: Pull complete
  19. 50f24e73c5d1: Pull complete
  20. 7a6fe3f468e0: Pull complete
  21. 5925d2f1942b: Pull complete
  22. 1725bcbd6235: Pull complete
  23. 6d9da4e99b24: Pull complete
  24. Digest: sha256:56917efe2ab423698ab83d03abd3fc57ec33988003cba7e5634b28c04ab8bb5b
  25. Status: Downloaded newer image for 10.50.10.185/spug/openspug/spug-service:latest
  26. Creating spug-db ... done
  27. Creating spug ... done

以下操作会创建一个用户名为 admin 密码为 Admin123 的管理员账户,可自行替换管理员账户/密码。

docker exec spug init_spug admin Admin123456
  1. #docker exec spug init_spug admin Admin123 
  2. Migrations for 'account':
  3. data/spug/spug_api/apps/account/migrations/0001_initial.py
  4. - Create model History
  5. - Create model Role
  6. - Create model User
  7. - Add field created_by to role
  8. Migrations for 'alarm':
  9. data/spug/spug_api/apps/alarm/migrations/0001_initial.py
  10. - Create model Alarm
  11. - Create model Group
  12. - Create model Contact
  13. Migrations for 'config':
  14. data/spug/spug_api/apps/config/migrations/0001_initial.py
  15. - Create model Service
  16. - Create model Environment
  17. - Create model ConfigHistory
  18. - Create model Config
  19. Migrations for 'exec':
  20. data/spug/spug_api/apps/exec/migrations/0001_initial.py
  21. - Create model Transfer
  22. - Create model ExecTemplate
  23. - Create model ExecHistory
  24. Migrations for 'home':
  25. data/spug/spug_api/apps/home/migrations/0001_initial.py
  26. - Create model Navigation
  27. - Create model Notice
  28. Migrations for 'host':
  29. data/spug/spug_api/apps/host/migrations/0001_initial.py
  30. - Create model Host
  31. - Create model HostExtend
  32. - Create model Group
  33. Migrations for 'monitor':
  34. data/spug/spug_api/apps/monitor/migrations/0001_initial.py
  35. - Create model Detection
  36. Migrations for 'notify':
  37. data/spug/spug_api/apps/notify/migrations/0001_initial.py
  38. - Create model Notify
  39. Migrations for 'schedule':
  40. data/spug/spug_api/apps/schedule/migrations/0001_initial.py
  41. - Create model History
  42. - Create model Task
  43. Migrations for 'setting':
  44. data/spug/spug_api/apps/setting/migrations/0001_initial.py
  45. - Create model Setting
  46. - Create model UserSetting
  47. Migrations for 'app':
  48. data/spug/spug_api/apps/app/migrations/0001_initial.py
  49. - Create model App
  50. - Create model Deploy
  51. - Create model DeployExtend1
  52. - Create model DeployExtend2
  53. Migrations for 'repository':
  54. data/spug/spug_api/apps/repository/migrations/0001_initial.py
  55. - Create model Repository
  56. Migrations for 'deploy':
  57. data/spug/spug_api/apps/deploy/migrations/0001_initial.py
  58. - Create model DeployRequest
  59. Operations to perform:
  60. Apply all migrations: account, alarm, app, config, deploy, exec, home, host, monitor, notify, repository, schedule, setting
  61. Running migrations:
  62. Applying account.0001_initial... OK
  63. Applying alarm.0001_initial... OK
  64. Applying config.0001_initial... OK
  65. Applying app.0001_initial... OK
  66. Applying repository.0001_initial... OK
  67. Applying deploy.0001_initial... OK
  68. Applying exec.0001_initial... OK
  69. Applying home.0001_initial... OK
  70. Applying host.0001_initial... OK
  71. Applying monitor.0001_initial... OK
  72. Applying notify.0001_initial... OK
  73. Applying schedule.0001_initial... OK
  74. Applying setting.0001_initial... OK
  75. 初始化/更新成功
  76. 创建用户成功

 登录

九、如何使用配置中心

配置中心的时候可以少创建很多应用,如果一个应用有很多环境,可以使用配置中心这个功能,在应用配置中动态获取配置。

目前项目中环境分类并不是很多,没有使用该功能。后续持续关注,必要时可以引入配置中心这个功能。

  1. 获取配置中心的数据 并写入环境变量
  2. # 应用发布前
  3. 请求地址:/api/apis/config/
  4. 请求方法: GET
  5. curl -so .env http://spug.prod:8099/api/apis/config/?apiToken=$SPUG_API_TOKEN
  6. curl "http://spug.prod:8099/config/?apiKey=JLV8IGO0DhoxcM7I&app=order&env=test"
  7. 如何获取?
  8. /api/apis/config/
  9. curl "http://spug.prod:8099/api/apis/config/?apiKey=JLV8IGO0DhoxcM7I&app=rptetl&env=container"

十、审核发布

这个问题是在面试中面试官问我的一个问题,对于版本发布,如何避免随意发布,发布之前应该先经过team leader 审核,本次发布的版本内容至少要看看?配置是否正确?版本是否正确?.....

没有人审核,发布人员自己审核出了问题谁来承担? 每个人都应该把好自己的那一关,测试人员把好测试关、发布人员做好发布、最终审核应该由teamleader 做。然后由发布人员发布。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/487387
推荐阅读
相关标签
  

闽ICP备14008679号