Skip to content
/ xp Public

xp is my name,but this project is look's like ansible-playbook and pipeline together

License

Notifications You must be signed in to change notification settings

devopsxp/xp

Repository files navigation

xp

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
      • 管理执行的生命周期
        • prepare
        • before
        • runtime
        • after
    • 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
        • 顺序执行
      • 自动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
    • k8s support
      • yaml新增k8s字段
      • k8s agent/operator
      • pod all in one
    • ssh + docker support
    • 中间产物缓存

Useage

go build ./xp test --config devopsxp.yaml

Test

make

测试执行流程

cli -> main.go -> root.go -> test.go -> pipeline -> init -> start -> check(ssh) -> input(localyaml) -> filter(shell) -> output(console) -> stop

Module

Remove Check Plugin

Input Plugin

  • localyaml

Filter Plugin

  • shell
  • ssh

Output Plugin

  • console

配置信息

本工具采用ssh免密登录进行远程主机命令的执行,需要ssh私钥进行连接,默对认获取文件地址为:~/.ssh/id_rsa

Like Ansible Playbook YAML

目标主机配置

配置目标执行主机,支持ip端扫描执行。

host: # 目标主机
  - 127.0.0.1
  - 192.168.0.1-20

远程执行用户

remote_user: root

pipeline管理与stage管理

  • 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

Hooks 钩子函数参数配置

消息发送钩子函数参数,支持同时发送多端配置发送,支持类型:

  • console
  • email
  • wechat
  • 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

详细stage config配置

这里是主要的逻辑编写单元,实现各种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

Template 模板示例,采用go template,value来自上面YAML template模块的vars选项

{{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}}

CI

docker run --rm -v $(pwd):/usr/src sonarsource/sonar-scanner-cli

TODO

  1. cli+module+shell
  • inputPlugin
  • 匹配数据
  • pipeline
  1. systemd 服务管理模块
  • 匹配目标主机os系统
  • 根据目标主机服务管理方式进行service管理服务启停

About

xp is my name,but this project is look's like ansible-playbook and pipeline together

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages