xp is my name,but this project is look like ansible-playbook and pipeline together
该项目主要想实现流水线+自动化实现工作和devops都能适应,两者互补。采用技术栈借鉴:
- Ansbile Playbook
- Gitlab CI
插件接口流程:
- pipeline
- User 用户管理
- Host 主机清单
- Playbook
- YAML
- module
- Plugin
- start
- stop
- status
- init
- input
- host conn check
- host env
- yaml module 分析
- filter
- 执行各个module
- Role Module
- copy
- shell
- template
- ssh
- docker
- k8s
- 网络设备
- snmp等
- 测试
- k6 run test.js
- 执行
- RPC
- RESTFULL
- CLI
- Role Module
- 管理执行的生命周期
- prepare
- before
- runtime
- after
- 执行各个module
- output
- 输出结果
- 返回状态
- yaml解析(cobra viper支持)
- 获取环境变量,包括自定义、目标主机基本信息、本地ENV信息等
- 识别shell_role中shell、copy、template等三级模块
- go template support
- docker support
- systemd support(服务管理)
- k8s support
- client-go
- init containerd
- git clone
- WorkingDir
- Shell+Command+Args
- Env
- Volume
- HostPath
- Empty
- PV/PVC
- StorageClass
- containerd
- lifecycle
- postStart
- type: Sidecar
- 顺序执行
- lifecycle
- 自动Delete Complete Pod
- pipeline hooks+output plugin调用k8s api进行删除
- ssh + docker support
- Hooks钩子函数支撑output plugin输出,目前支持console、email、wechat,todo: phone、sms、elasticsearch、log
- tags 指定主机执行
- when 判断条件,不满足则不执行
- register 注册执行结果,供下一步stage作为条件判断
- 动态环境变量(cobra支持)
- with_items迭代器
- 缓存中间产物
- include命令,允许导入复杂yaml文件夹的大量引用,类似ansible-playbook roles
- fetch模块
- user模块
- git模块
- group模块
- copy模块
- yum模块
- file模块
- setup模块
- Debug日志
- CLI命令行工具(cobra)
- 功能文件夹,提供:files、hosts、env等特殊目录模块
- roles ansible模块
- yaml目录通过include模块引入
- module man模块说明文档
- module plugin插件机制
- ssh 连接功能
- 各个步骤的计时器和总执行计时
- Retry重试机制
- 超时重试
- 错误重试
- 消息发送
- 邮件
- 企业微信/叮叮
- 短信
- 中间件对接
- sonarque
- jmeter
- jenkins
- 安全扫描
- ArgoCD
- 改造计划
- 微服务改造
- RPC AGENT
- RPC Server
- CRD改造
- 声明式任务流水线执行
- 日志Call Back机制
- back to server
- back to es
- back to kafka
- back to logstash
- back to Fluentd/Filebeat
- 微服务改造
- 前端页面
- 多租户
- pipeline yaml管理
- pipeline执行历史管理
- 权限管理
- CMDB
- CI/CD管理
- pipeline 可视化
- git源代码管理
- devops工具链对接
- 容器化
- docker support
- yaml新增images字段
- Remote API
- k8s support
- yaml新增k8s字段
- k8s agent/operator
- pod all in one
- ssh + docker support
- 中间产物缓存
- docker support
go build ./xp test --config devopsxp.yaml
make
cli -> main.go -> root.go -> test.go -> pipeline -> init -> start -> check(ssh) -> input(localyaml) -> filter(shell) -> output(console) -> stop
Remove Check Plugin
- localyaml
- shell
- ssh
- console
本工具采用ssh免密登录进行远程主机命令的执行,需要ssh私钥进行连接,默对认获取文件地址为:~/.ssh/id_rsa
配置目标执行主机,支持ip端扫描执行。
host: # 目标主机
- 127.0.0.1
- 192.168.0.1-20
remote_user: root
- roles用于限制stage是否执行,后期可用根据roles来实现流程动态选取
- stage用于限制config中执行的顺序和stage,没有列入stage的一律不执行
roles: # 执行具体stage
- build
- test
stage: # 流程步骤
- build
- test
用于动态嵌入output输出内容,配合go template实现数据插入。
todo
:后期考虑加入本机环境变量
和远程主机环境变量
,供流程提取数据进行执行操作。
格式
: 支持任意格式的数据(符合yaml语法),解析采用go template进行,注意
:变量使用{{.Status}}
vars: # 环境变量
Status: true
title: "模板测试"
serviceName: "xp"
pipelineName: template test
pipelineId: no1
pipelineUrl: http://www.baidu.com
branch: master
stage: build
tags: test
info: test only
alerts:
- status: firing
generatorURL: http://www.google.com
startsAt: 2020-08-01
endsAt: 2020-09-01
annotations:
current_value: 85
labels:
severity: warning
node: 127.0.0.1
threshold_value: 80
- status: ok
generatorURL: http://www.google2.com
startsAt: 2020-18-01
endsAt: 2020-29-01
annotations:
current_value: 99
labels:
severity: ok
node: 127.0.0.1
threshold_value: 88
消息发送钩子函数参数,支持同时发送多端配置发送,支持类型:
- console
- phone
- sms
- log
hooks: # 消息发送 全局一个 可以一次发送所有结果到多个渠道
- type: console # 类型,支持:console|email|wechat|phone|sms
- type: email # email邮箱类型
alias: xp战队 # 邮箱昵称
email_user: "xp@xp.com" # 发送邮箱帐号
email_pwd: "xppwdxp" # 发送邮箱密码
email_smtp: "smtp.exmail.qq.com" # 邮箱发送smtp服务器
email_smtp_port: "465" # smtp服务器端口
email_to: # 接收邮件人员
- xptest@xp.com
template: # 告警模板
title: "告警title" # 标题
text: "{{.Status}} {{.title}}
{{range $key,$value := .logs}}
{{range $k,$v := $value}}
------ {{$k}} {{$v}}<br/>
{{end}}
{{end}}" # 文本模板
path: template.service.j2 # 模板文件路径(与文本模板二选一,同时存在优先选择文本模板)
vars: # 内置固定参数
Status: true
title: "模板测试"
serviceName: "xp"
- type: wechat # wechat类型
address: # 企业微信机器人地址 支持多机器人批量发送
- https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a-b-c-d-e
template: # 告警模板
text: '
# 告警模板
{{if .Status}} <font color=\"info\">[成功] </font>{{ .title}} {{- else}}<font color=\"warning\">[失败] </font> {{ .title}} {{- end}}
> 服务名称:<font color="comment">{{.serviceName}}</font>
> 流水线名称:<font color="comment">{{.pipelineName}}</font>
> 流水线ID:<font color="comment">{{.pipelineId}}</font>
> 流水线地址:<font color="comment">{{.pipelineUrl}}</font>
> 构建分支:<font color="comment">{{.branch}}</font>
> 阶段:<font color="comment">{{.stage}}</font>
> 构建人:<font color="comment">{{.user}}</font>
> COMMIT: <font color="comment">{{.info}}</font>
> COMMITID:<font color="comment">{{.tags}}</font>
# {{.title}}
{{range $key,$value := .logs}}
{{range $k,$v := $value}}
> {{$k}} {{$v}}
{{end}}
{{end}}' # 文本模板
path: template.service.j2 # 模板文件路径(与文本模板二选一,同时存在优先选择文本模板)
vars: # 内置固定参数(与全局vars共享数据,这里设置相同参数会覆盖全局key)
title: "模板测试"
serviceName: "xp"
- type: phone
- type: sms
这里是主要的逻辑编写单元,实现各种pipeline的编写和stage的区分,目前支持的模块有:
- shell 模块,执行shell命令
- template 模块,执行基于go template的模板渲染和远程上传
- copy 模块,执行本地文件上传到目标主机指定地址
config: # 详细配置信息
- stage: build
name: template 模板测试
template:
src: template.service.j2
dest: /tmp/docker.service
- stage: test
name: 上传文件
copy:
src: "{{ .item }}"
dest: /tmp/{{ .item }}
with_items:
- LICENSE
- 2
- 3
- stage: what
name: 非stage测试
shell: whoami
- stage: build
name: 获取go version
shell: lsb_release -a
- stage: test
name: 获取主机名
shell: "{{.item}}"
with_items:
- hostname
- ip a|grep eth0
- pwd
- uname -a
- docker ps &&
docker images
- stage: test
name: 查看docker信息
shell: systemctl status sshd
{{if .Status}} <font color="info">[成功] </font>{{ .title}} {{- else}}<font color="warning">[失败] </font> {{ .title}} {{- end}}
> 服务名称:<font color="comment">{{.serviceName}}</font>
流水线名称:<font color="comment">{{.pipelineName}}</font>
流水线ID:<font color="comment">{{.pipelineId}}</font>
流水线地址:<font color="comment">{{.pipelineUrl}}</font>
构建分支:<font color="comment">{{.branch}}</font>
阶段:<font color="comment">{{.stage}}</font>
构建人:<font color="comment">{{.user}}</font>
COMMITID:<font color="comment">{{.tags}}</font>
COMMITINFO: <font color="comment">{{.info}}</font>
{{range $e := .alerts}}
## {{if eq $e.status "firing"}} [<font color="warning">{{$e.labels.severity}}</font>] {{ $e.labels.node}} [监控详情]({{$e.generatorURL}})
>> 告警阈值: <font color="warning">{{$e.labels.threshold_value}}</font>
当前数值: <font color="warning">{{$e.annotations.current_value}}</font>
开始时间: <font color="comment">{{$e.startsAt}}</font>
结束时间: <font color="comment">{{$e.endsAt}}</font>
{{- else}}# [<font color="info">{{$e.labels.severity}}</font>] {{ $e.labels.node}} [监控详情]({{$e.generatorURL}})
>> 告警阈值: <font color="info">{{$e.labels.threshold_value}}</font>
当前数值: <font color="info">{{$e.annotations.current_value}}</font>
开始时间: <font color="comment">{{$e.startsAt}}</font>
结束时间: <font color="comment">{{$e.endsAt}}</font>
{{- end}}
{{end}}
docker run --rm -v $(pwd):/usr/src sonarsource/sonar-scanner-cli
- cli+module+shell
- inputPlugin
- 匹配数据
- pipeline
- systemd 服务管理模块
- 匹配目标主机os系统
- 根据目标主机服务管理方式进行service管理服务启停