logo
2
1
WeChat Login

CVMTools

基于 CNB 云原生构建平台的腾讯云 CVM 管理插件。通过页面按钮一键创建/管理云服务器,支持定时自动销毁。

功能

动作说明
创建 CVM自动匹配机型和可用区,支持竞价实例,定时自动销毁,支持开机初始化脚本
列出实例按标签/状态过滤,导出变量供后续流水线使用
销毁实例按实例ID销毁,支持预检模式
清理过期实例按保留分组扫描过期实例并销毁

作为插件使用

前置条件

  1. 一个 CNB 密钥仓库,包含腾讯云 API 密钥文件:
# 密钥仓库中的文件,如 ThirdParty/TencentCloud.yml
SECRET_ID: "AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
SECRET_KEY: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  1. 插件镜像地址:docker.cnb.cool/bring/tools/cvmtools:latest

方式一:在流水线中直接调用

在你的项目 .cnb.yml 中引用本插件镜像:

# 定义密钥仓库引用
.cvm_imports: &cvm_imports
  - https://cnb.cool/your-org/your-keystore/-/blob/main/TencentCloud.yml

"**":
  # 创建实例
  web_trigger_create_cvm:
    - imports: *cvm_imports
      stages:
        - name: 创建 CVM 实例
          image: docker.cnb.cool/bring/tools/cvmtools:latest
          settings:
            action: create
            secret_id: $SECRET_ID
            secret_key: $SECRET_KEY
            region: ap-guangzhou
            instance_type: SA9.MEDIUM4
            image: Ubuntu 22.04
            retain: 3h
            init_script: |
              #!/bin/bash
              apt-get update && apt-get install -y docker.io
          exports:
            instance_ids: INSTANCE_IDS
            public_ips: PUBLIC_IPS
        - name: 使用创建结果
          script:
            - echo "实例ID: $INSTANCE_IDS"
            - echo "公网IP: $PUBLIC_IPS"
            - ssh root@$PUBLIC_IPS "echo connected"

  # 列出实例
  web_trigger_list_cvm:
    - imports: *cvm_imports
      stages:
        - name: 列出实例
          image: docker.cnb.cool/bring/tools/cvmtools:latest
          settings:
            action: list
            secret_id: $SECRET_ID
            secret_key: $SECRET_KEY
            region: ap-guangzhou
            tag_key: cvmtools:managed
            tag_value: "true"
          exports:
            instance_ids: INSTANCE_IDS
            public_ips: PUBLIC_IPS

  # 销毁实例
  web_trigger_terminate_cvm:
    - imports: *cvm_imports
      stages:
        - name: 销毁实例
          image: docker.cnb.cool/bring/tools/cvmtools:latest
          settings:
            action: terminate
            secret_id: $SECRET_ID
            secret_key: $SECRET_KEY
            region: ap-guangzhou
            instance_ids: $instance_ids
            dry_run: "false"

  # 清理过期实例
  web_trigger_cleanup:
    - imports: *cvm_imports
      stages:
        - name: 清理过期实例
          image: docker.cnb.cool/bring/tools/cvmtools:latest
          settings:
            action: terminate-by-tag
            secret_id: $SECRET_ID
            secret_key: $SECRET_KEY
            region: ap-guangzhou
            tag_key: cvmtools:managed
            tag_value: "true"
            retain_group: short
            dry_run: "false"

方式二:配合 web_trigger 按钮使用

.cnb/web_trigger.yml 中配置自定义按钮,点击按钮时弹出表单填写参数:

branch:
  - buttons:
      - name: 创建 CVM
        event: web_trigger_create_cvm
        inputs:
          region:
            name: 地域
            type: select
            default: ap-guangzhou
            options:
              - name: 广州
                value: ap-guangzhou
              - name: 上海
                value: ap-shanghai
          instance_type:
            name: 机型
            type: select
            default: SA9.MEDIUM4
            options:
              - name: "SA9.MEDIUM4 (2C4G)"
                value: SA9.MEDIUM4
              - name: "SA9.LARGE8 (4C8G)"
                value: SA9.LARGE8
          retain:
            name: 保留时长
            type: select
            default: 3h
            options:
              - name: 1 小时
                value: 1h
              - name: 3 小时
                value: 3h
              - name: 1 
                value: 1d

完整的按钮配置参见本仓库 .cnb/web_trigger.yml

插件参数

公共参数

参数必选默认值说明
action-create / list / terminate / terminate-by-tag
secret_id-腾讯云 SecretId
secret_key-腾讯云 SecretKey
regionap-guangzhou地域
dry_runfalse预检模式(写操作时仅展示不执行)

create 参数

参数默认值说明
instance_type-机型(如 SA9.MEDIUM4),与 cpu/memory 二选一
cpu2CPU 核数(未指定 instance_type 时生效)
memory4内存 GB(未指定 instance_type 时生效)
imageUbuntu 22.04镜像ID(img-xxx)或关键字
disk_size50系统盘大小 GB
disk_typeCLOUD_BSSDCLOUD_BSSD(通用SSD) / CLOUD_HSSD(增强SSD)
bandwidth5公网带宽 Mbps
namecvm-{timestamp}实例名称
retain3h保留时长:1h/3h/6h/12h/1d/3d/7d/never
charge_typePOSTPAID_BY_HOURPOSTPAID_BY_HOUR(按量) / SPOTPAID(竞价)
spot_max_price-竞价上限(元/小时),仅竞价模式生效
password-登录密码
key_id-SSH 密钥ID(优先于密码)
sg_id-安全组ID(留空自动创建全放通安全组)
count1创建数量
init_script-开机初始化脚本(Shell),实例就绪后通过 TAT 执行

list 参数

参数默认值说明
tag_key-按标签键过滤
tag_value-按标签值过滤
instance_ids-实例ID列表(逗号分隔)
state-按状态过滤(RUNNING/STOPPED 等)

terminate 参数

参数说明
instance_ids要销毁的实例ID(逗号分隔),必填

terminate-by-tag 参数

参数默认值说明
tag_keycvmtools:managed标签键
tag_valuetrue标签值
retain_group-按分组过滤:short / long / permanent
only_expiredtrue仅销毁已过期实例

导出变量

插件通过 ##[set-output key=value] 输出变量,配合 exports 映射为环境变量:

变量动作说明
instance_idscreate / list实例ID(逗号分隔)
public_ipscreate / list公网IP(逗号分隔)
private_ipscreate / list内网IP(逗号分隔)
expire_atcreate过期时间 UTC
instance_typecreate实际使用的机型
instance_countcreate / list实例数量
init_invocation_idcreateTAT 初始化脚本执行活动ID
init_script_statuscreate初始化脚本执行结果(逗号分隔)
instances_jsonlist实例详情 JSON(base64 编码)
terminated_idsterminate / terminate-by-tag已销毁的实例ID
terminated_countterminate / terminate-by-tag已销毁数量

使用示例:

stages:
  - name: 创建实例
    image: docker.cnb.cool/bring/tools/cvmtools:latest
    settings:
      action: create
      # ...
    exports:
      instance_ids: INSTANCE_IDS
      public_ips: PUBLIC_IPS
  - name: 部署应用
    script: ssh root@$PUBLIC_IPS "docker pull myapp && docker run -d myapp"

创建流程与 API 调用

创建实例时按顺序执行以下步骤(有初始化脚本时为 8 步,无则 6 步):

步骤说明调用 API
[1] 解析机型和可用区匹配机型,查询可用区库存cvm:DescribeInstanceTypeConfigs + cvm:DescribeZoneInstanceConfigInfos
[2] 解析镜像按关键字或 ID 查找镜像cvm:DescribeImages
[3] 解析安全组查找或自动创建全放通安全组vpc:DescribeSecurityGroups + vpc:CreateSecurityGroupWithPolicies(按需)
[4] 构建请求参数本地计算,无网络调用
[5] 创建实例发起创建请求cvm:RunInstances
[6] 等待实例就绪轮询直到所有实例 RUNNINGcvm:DescribeInstancesStatus(轮询)
[7] 等待 TAT Agent 上线轮询直到 Agent 状态 Onlinetat:DescribeAutomationAgentStatus(轮询)
[8] 执行初始化脚本下发脚本并等待执行完成tat:RunCommand + tat:DescribeInvocationTasks(轮询)

最后调用 cvm:DescribeInstances 获取实例详情(IP 等)用于结果输出。

步骤 [7] 和 [8] 仅在设置了 init_script 时执行。

生命周期管理

保留时长分组用途
1h / 3h / 6hshort临时调试
12h / 1d / 3d / 7dlong开发测试
neverpermanent长期运行

实例创建时会打上标签:

  • cvmtools:managed=true — 标识由本插件创建
  • cvmtools:retain=3h — 保留时长
  • cvmtools:retain-group=short — 保留分组
  • cvmtools:expire-at=2026-05-02T18:00:00Z — 过期时间

到期后通过腾讯云 ActionTimer 自动销毁。也可通过「清理过期实例」按钮按分组扫描兜底。

默认行为

  • VPC: 使用地域默认 VPC/子网
  • 安全组: 未指定时自动查找/创建 cvmtools-allow-all(入出全放通)
  • 机型匹配优先级: SA9 > SA5 > S5 > SA3 > S6
  • 可用区: 自动选择首个有该机型库存的可用区
  • 写操作安全: 销毁类按钮默认开启预检模式,需手动关闭才执行

本地开发

pip install -r requirements.txt

# 预检模式测试创建
export PLUGIN_ACTION=create
export PLUGIN_SECRET_ID=AKIDxxx
export PLUGIN_SECRET_KEY=xxx
export PLUGIN_REGION=ap-guangzhou
export PLUGIN_INSTANCE_TYPE=SA9.MEDIUM4
export PLUGIN_IMAGE="Ubuntu 22.04"
export PLUGIN_RETAIN=1h
export PLUGIN_DRY_RUN=true
python -m src.main

# Docker 构建测试
docker build -t cvmtools .
docker run --rm -e PLUGIN_ACTION=list -e PLUGIN_SECRET_ID=xxx -e PLUGIN_SECRET_KEY=xxx cvmtools

About

No description, topics, or website provided.
CVMToolsrepo-named
Language
Python99.5%
Dockerfile0.5%