前言
需求背景:
目前3台服务器实现负载均衡和水平扩展的有相同的Python环境(已部署Jenkins),并维护几乎相同的pip环境(目前未采用虚拟Python去管理执行),若需要维护或更新换环境操作相对繁琐。
比如:需要新增一个python依赖包,需要登陆服务器堡垒机并依次执行pip相关命令,并重复上述步骤3次,耗时且有时容易搞混,那么是否有简化方案呢?
解决方案:
低成本
1、低成本,Jenkins 参数化执行cmd命令,手动进入Jenkins分别执行3次,减少登陆堡垒机这一步,执行命令回调在Jenkins日志查看。
中成本(不介绍)
2、中成本,Jenkins 参数化执行cmd命令,在低成本方案上,开发支持API接口调度3台Jenkins机器分别去执行任务,执行命令任务结果回调通过Jenkins日志查看。
高成本(不介绍)
3、高成本,在中成本的方案上继续新增,包管理(CRUD)操作的回调并把关键性入口存储,并保留平台操作日志。
低成本落地方案
虽然采用低成本方案解决目前的需求,在项目落地时不仅需要考虑功能实现,同时也需要兼具命令安全性。
Python pip包管理
1、 Jenkins 任务执行 cmd命令实现pip命令操作
2、 shell命令限制仅pip可执行
3、 项目安全,匿名用户不可见
1、Jenkins 任务执行 cmd命令实现pip命令操作
1.1 Jenkins 参数配置 示例图
1.2 Jenkins参数通过Shell执行 示例图
1.3 Jenkins任务执行结果 示例图
2、 shell命令限制仅pip可执行
2.1 shell命令限制仅pip可执行 示例代码
strA=${python_pip_operation:0:3}
strB="pip"
if [[ $strA == $strB ]]
then
echo $(date +%F%n%T) "命令为pip操作可正常执行,执行结果如下:"
${python_pip_operation}
else
echo $(date +%F%n%T) "命令不包含pip,请勿尝试非法操作"
fi
问:为什么要限制仅限pip命令执行?
答:通过Jenkins支持操作cmd命令操作是及其危险的,通过前置校验进行pip相关的操作可以过滤掉大部分安全威胁,避免安全风险问题暴露。
3、项目安全,匿名用户不可见
3.1 启动项目安全,且设置为 不要从其他ACL继承权限授予
限制匿名未登录用户直接操作pip命令,通过前置登陆鉴权限制任意用户恶意修改
4、水平扩展配置项目落地并调试
重试上述步骤1、2、3,并在需要配置的服务器环境配置好Jenkins任务,并检查配置完整性
4.1 Jenkins任务配置自测简易指南
测试用例
1、登陆用户,执行pip list命令,执行通过
2、登陆用户,执行pip3 list命令,执行通过
3、登陆用户,执行pip3 xxx命令,执行通过
4、登陆用户,执行 ls 或 rm -rf xx 命令,执行不通过
5、未登录用户,无法查看到该项目
小结
至此已完成低成本的对3台服务器的Python pip包管理操作,通过Jenkins配置任务实现管理,可以减少登陆堡垒机的操作。
但是从解决实际问题的脚本看并未完全解决,1次操作重试3次完成对3台服务器的同步操作,只是使用了一种较低成本的方法简化了部分操作。
至于中成本或高成本
API层:
1、API接口 需要维护一个接口传入命名行参数
2、Jenkins 任务需同时依次调度3个服务器3、最终执行结果通过API接口返回还是在Jenkins控制台输出查看日志
最终需要考虑实现成本和该项目的落地后具体的使用方是谁?这里不在深究