xp

command module
v0.7.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2022 License: Apache-2.0 Imports: 1 Imported by: 0

README

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管理服务启停

Documentation

Overview

Copyright © 2020 NAME lixueping <382023823@qq.com>

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Directories

Path Synopsis
TODO: 实现gitlab ci images功能,实现容器化运行pipeline 1.
TODO: 实现gitlab ci images功能,实现容器化运行pipeline 1.
pkg
k8s
setup
主机磁盘配置获取数据结构
主机磁盘配置获取数据结构
工厂模式生产具体的类
工厂模式生产具体的类
http://dockone.io/article/109 https://docs.docker.com/engine/api/v1.24/#2-errors https://godoc.org/github.com/docker/docker/client#FromEnv
http://dockone.io/article/109 https://docs.docker.com/engine/api/v1.24/#2-errors https://godoc.org/github.com/docker/docker/client#FromEnv

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL