DevOps自动化二:我用模板为编排提效100倍

模板是什么?

看一个go template示例

echo "部署{{.svc}}服务"

这个模板生成的shell执行后可打印部署**任意**服务,如:

echo "部署user"
echo "部署order"

模板用于描述不变的流程,模板参数表示可变化的部分,模板参数最终由输入值替代。

模板的分类

模板一共分三种:聚合模板、编排模板、执行模板组成,本质是相同的文本在不同的阶段采用不同模板渲染规则

聚合模板

聚合本地模板文件到一个编排内,功能类似helm。

左右分隔符分别为%{}%尽量和主流分隔符区分开

下图为聚合argo workflow templates、执行模板、配置模板到一份编排示例:

模块定义模板

用来定义代码、kube、测试等模块属性(含安全规则)、执行脚本、脚本配置模板

模块的主要定义内容如下图:

以下为模块定义的一些示例

模板的左右分隔符分别为!{}!

  1. 代码code.common定义示例如下:
code:
  common:
    labels:
      role: website,iot # role:代码仓库所属角色
      package: true # 表示公共库
    config: ""    # 表示不需要构建镜像
    settings:
      repo: http://xxxxxx/common.git
      mvn:
        api: # 只上传jar包 不打包和构建镜像
          dir: ""
      sonar:  
        exclusions: 'src/main/java/xxx/protobuf/**'  # sonar扫描排除pb代码
  1. 默认属性、安全规则、执行脚本、配置文件在整个模块都是相似的,因此优先定义在独立的全局配置
code:  # 模块名
  __global__:  # 模块的全局配置
    workflow:
      templates: |
        %{readText "code/argo.templates.yaml" | indent 36}%
    security:
      pom:
        - name: "fastjson反序列化漏洞"
          env: ".*"
          action: "Info"
          content: "com\\.alibaba:fastjson:jar:1\\.2\\.(([1-7][0-9]?)|(8[0-2])):compile"
          message: "低版本fastjson存在反序列化安全漏洞,请升级到最新版本1.2.83及以上版本!"
    execTmpl: |
        %{readText "code/argo.yaml" | indent 34}%
    config:
      - |
        %{readText "code/run.Dockerfile" | indent 34}%
    default:
      type: git
      template: public/java:latest
        !{- if contains (or $.engine.metadata.annotations.codes "") "common" }!
      depends:
      - common
        !{- end }!
  1. 定义中不同环境的相同属性的值不一样
feishu-workflow: &wf
  type: feishu
  settings:
    webhooks:
#        - https://open.feishu.cn/open-apis/bot/v2/hook/aaaaaa # 测试群消息
      !{- if inStr $.sys.env "dev" "debug" "pts" }!
      - https://open.feishu.cn/open-apis/bot/v2/hook/bbbbbbb # 开发环境
      !{- end }!
      !{- if inStr $.sys.env "sit" "alpha" "beta" }!
      - https://open.feishu.cn/open-apis/bot/v2/hook/cccccc # 测试环境
      !{- end }!

执行模板

此模板的目标是生成最终的编排,主要包括编排、执行脚本配置模板,左右分隔符分别为@{}@

下面以CICD发版前后检查为例作说明。

编排示例如下:

@{- $check := or (contains .sys.env "uat-") (contains .sys.env "prod-") }@
metadata:
  annotations:
    platform: "linux/amd64"
spec:
  global:  # 全局配置,定义workflow、k8s环境等信息
    workflow:
      templates:
        %{readText "global.templates.yaml" | indent 14 }%
    kube:
      %{readText "global.kube.yaml" | indent 12 }%
  stages:
    - name: "ci"  # 阶段名
      desc: "功能包括下载代码、编译、制作镜像"
      modules:  # 定义用到的模块,由代码和参数填充内容;同时仅渲染该渲染的、解决大模板问题
        code: []

    @{- $cdDeps := "ci" }@
    @{- if $check }@
    @{- $cdDeps = concat $cdDeps ",precheck" }@
    @{- end }@

    - name: "cd"
      desc: "功能包括k8s、nacos"
      depends: [ @{- $cdDeps -}@ ] # 按条件生成依赖阶段
      modules:
        kube: []

    @{- if $check }@  # 按条件生成执行的阶段
    - name: "precheck"
      desc: "变更前巡检"
      modules:
        log: []
    - name: "check"
      desc: "变更后巡检"
      depends: ["cd"]
      modules:
        log: []
    @{- end }@

code描述CI过程,包括下载代码、编译、构建镜像等功能,所有功能有脚本和配置完成(Dockerfile)。

脚本模板示例:

@{/* 下载代码 */}@
@{- $repoName := repoName .settings.repo }@
@{- $branch := or .settings.tag .settings.branch (render $env.code.branch .) }@
- name: git
  template: git
  arguments:
    parameters:
      - name: stage
        value: @{ $.sys.stage }@
      - name: repo
        value: @{.settings.repo}@
      - name: branch
        value: @{ $branch }@
      - name: repoName
        value: @{ $repoName}@
@{/* 编译 */}@
- name: "mvn-@{$type}@"
  template: mvn
  depends: [@{ $depends }@]
  arguments:
    parameters:
      - name: cmd
        value: |
          mvn clean package -U -P @{$env.mvn.profile}@ -Dmaven.test.skip=true

@{/* 构建镜像 */}@
- name: docker
  template: docker
  depends: [mvn-@{$type}@]
  arguments:
    parameters:
      - name: stage
        value: @{$.sys.stage}@
      - name: name
        value: @{ $parent.name }@
      - name: image
        value: @{ $parent.settings._image }@
      - name: repoName
        value: @{ $repoName }@

#关键命令如下:依赖Dockerfile
#executor --cache=true --cache-dir=/cache --context=dir:///workspace --custom-platform=@{or .sys.annotations.platform "linux/amd64" }@ \
#--dockerfile=/workdir/{{inputs.parameters.name}}.Dockerfile \
#--destination={{inputs.parameters.image}} \
#--push-retry=5

执行脚本对应的**配置模板(Dockerfile)**示例:

@{- $platform := "" -}@
@{- if and .sys.annotations.platform (not (contains .sys.annotations.platform "amd64")) -}@
@{- $platform = "-arm64" -}@
@{- end -}@

FROM openjdk:8.0.4@{- $platform }@

WORKDIR /
ARG JAR_FILE=app.jar
COPY ${JAR_FILE} app.jar

ENV TZ=Asia/Shanghai
#设置变量 JAVA_OPTS
ENV JAVA_OPTS=""
CMD @{ $cmdPrefx }@ /sbin/tini -- java \
-Duser.language=zh -Duser.country=CN -Duser.timezone=Asia/Shanghai \
-Djava.security.egd=file:///dev/urandom \
-Dsun.net.client.defaultConnectTimeout=5000 -Dsun.net.client.defaultReadTimeout=60000 \
-Dspring.jmx.enabled=false -Dspring.backgroundpreinitializer.ignore=true \
-Djava.util.concurrent.ForkJoinPool.common.parallelism=10 \
-cp "/app:/app/lib/*" \
$JAVA_OPTS -jar /app.jar

模板的应用

平台与项目/部门的基本流程如下图

说明:不同颜色:表示不同项目/部门的整条链路都要差异处理,即各模板的定义、结构和实现都存在差异

结语

基于模板管理编排,使编排极易维护和扩展,相比仓库管理编排效率提高100倍不止。


请用微信扫码关注下🙏 ,持续更新云原生DevOps最佳实践。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值