cycloid/cycloid-toolkitCycloid Toolkit是一个包含工具和脚本的Docker镜像,专为cycloid.io部署流水线设计。其核心用途是提供标准化的工具集,简化部署流程中的关键操作,如Ansible自动化执行、AWS资源清理、Vault认证集成及配置合并等。
该镜像集成了以下关键工具,覆盖部署流水线全生命周期需求:
| 工具名称 | 功能描述 |
|---|---|
ansible-runner | 通过堡垒机(Bastion)运行Ansible Playbook,支持动态 inventory 和Vault加密 |
aws-ami-cleaner | 清理Amazon EC2旧AMI,适用于自动扩展组(ASG)的镜像迭代场景 |
aws-ecr-cleaner | 清理Amazon ECR中旧Docker镜像,优化容器镜像仓库存储 |
vault-approle-login | 通过AppRole认证获取Vault令牌,并注入Terraform变量文件 |
extract-terraform-outputs | 提取Terraform输出,供其他脚本(如merge-stack-and-config)使用 |
merge-stack-and-config | 合并cycloid.io的stack配置与用户配置,生成最终部署配置 |
docker pull cycloid/cycloid-toolkit:latest通过堡垒机(或SSH ProxyJump)执行Ansible Playbook,支持AWS EC2动态inventory、Vault加密及角色缓存。
| 参数名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
AWS_ACCESS_KEY_ID | AWS EC2动态inventory访问密钥 | - | 否 |
AWS_SECRET_ACCESS_KEY | AWS EC2动态inventory密钥 | - | 否 |
SSH_PRIVATE_KEY | 用于连接服务器的SSH私钥 | - | 是 |
SSH_PRIVATE_KEYS | 多个SSH私钥列表(YAML格式) | - | 否 |
BASTION_URL | 堡垒机SSH地址,格式:user@host | - | 否 |
SSH_JUMP_URL | SSH ProxyJump地址列表,格式:user1@host1,user2@host2 | - | 否 |
TAGS | 仅执行指定标签的Ansible任务 | - | 否 |
SKIP_TAGS | 跳过指定标签的Ansible任务 | - | 否 |
EXTRA_ANSIBLE_ARGS | ansible-playbook命令额外参数(如--limit) | - | 否 |
EXTRA_ANSIBLE_VARS | 额外Ansible变量(JSON格式) | - | 否 |
ANSIBLE_REMOTE_USER | Ansible远程执行用户 | admin | 否 |
ANSIBLE_GALAXY_EXTRA_ARGS | ansible-galaxy命令额外参数 | - | 否 |
ANSIBLE_VAULT_PASSWORD | Ansible Vault解密密码 | - | 否 |
ANSIBLE_FORCE_GALAXY | 是否强制更新Ansible Galaxy角色缓存 | false | 否 |
ANSIBLE_PLAYBOOK_NAME | 待执行的Playbook文件名 | site.yml | 否 |
ANSIBLE_PLAYBOOK_PATH | Playbook文件路径 | ansible-playbook | 否 |
EC2_VPC_DESTINATION_VARIABLE | EC2动态inventory目标IP类型(私有/公有) | private_ip_address | 否 |
YAML锚点定义
yamlshared: - &run-ansible-from-bastion config: platform: linux image_resource: type: docker-image source: repository: cycloid/cycloid-toolkit tag: latest run: path: /usr/bin/ansible-runner caches: # 缓存Ansible角色,加速执行 - path: ansible-playbook/roles inputs: - name: ansible-playbook # 挂载Playbook目录 path: ansible-playbook
任务引用示例
yaml- task: run-ansible <<: *run-ansible-from-bastion # 引用YAML锚点 params: BASTION_URL: ((bastion_url)) # 堡垒机地址(从变量注入) SSH_PRIVATE_KEY: ((bastion_ssh.ssh_key)) # 堡垒机SSH私钥 SSH_PRIVATE_KEYS: # 多私钥配置(可选) - ((user1_ssh.ssh_key)) - ((user2_ssh.ssh_key)) ANSIBLE_VAULT_PASSWORD: ((ansible_vault_pass)) # Vault解密密码 AWS_ACCESS_KEY_ID: ((aws_access_key)) # AWS访问密钥(用于动态inventory) AWS_SECRET_ACCESS_KEY: ((aws_secret_key)) EXTRA_ANSIBLE_ARGS: "--limit tag_role_front" # 限制执行目标 AWS_DEFAULT_REGION: eu-west-1 ANSIBLE_PLAYBOOK_NAME: ((customer)).yml # 动态指定Playbook文件名 EXTRA_ANSIBLE_VARS: # 额外Ansible变量 customer: ((customer)) project: ((project)) env: ((env)) TAGS: # 仅执行deploy标签任务 - deploy
清理指定名称模式的旧Amazon AMI,保留最新镜像,适用于频繁构建AMI的自动扩展场景。
| 参数名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
AWS_ACCESS_KEY_ID | AWS访问密钥(需具备AMI删除权限) | - | 是 |
AWS_SECRET_ACCESS_KEY | AWS密钥 | - | 是 |
AWS_NAME_PATTERNS | AMI名称匹配模式(JSON数组格式),如["prod-front-*", "prod-back-*"] | - | 是 |
AWS_REGION | AWS区域 | - | 是 |
YAML锚点定义
yamlshared: - &aws-ami-cleaner task: aws-ami-cleaner config: platform: linux image_resource: type: docker-image source: repository: cycloid/cycloid-toolkit tag: latest run: path: /usr/bin/aws-ami-cleaner params: AWS_ACCESS_KEY_ID: ((aws_access_key)) AWS_SECRET_ACCESS_KEY: ((aws_secret_key)) AWS_REGION: eu-west-1 AWS_NAME_PATTERNS: > [ "project1_front_prod", "project1_batch_prod" ] # 清理名称匹配这两个模式的旧AMI
任务引用示例
yaml- *aws-ami-cleaner # 直接引用锚点执行清理任务
清理Amazon ECR仓库中符合条件的旧镜像,支持按标签正则过滤、保留数量配置。
| 参数名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
AWS_ACCESS_KEY_ID | AWS访问密钥(需具备ECR管理权限) | - | 是 |
AWS_SECRET_ACCESS_KEY | AWS密钥 | - | 是 |
REGION | AWS区域 | - | 是 |
DRYRUN | 启用 dry-run 模式(仅预览不删除) | False | 否 |
IMAGES_TO_KEEP | 每个仓库保留的最新镜像数量 | 2 | 否 |
REPOSITORIES_FILTER | 仓库名称过滤(空格分隔的关键词),如"foo bar"匹配含foo或bar的仓库 | - | 否 |
IGNORE_TAGS_REGEX | 忽略的标签正则(如`"dev | staging"`不清理这些标签镜像) | - |
FILTER_TAGS_REGEX | 仅清理匹配该正则的标签(如"^dev-"仅清理dev前缀标签) | - | 否 |
YAML锚点定义
yamlshared: - &aws-ecr-cleaner task: aws-ecr-cleaner config: platform: linux image_resource: type: docker-image source: repository: cycloid/cycloid-toolkit tag: latest run: path: /usr/bin/aws-ecr-cleaner params: AWS_ACCESS_KEY_ID: ((aws_access_key)) AWS_SECRET_ACCESS_KEY: ((aws_secret_key)) REGION: ((aws_default_region)) DRYRUN: False # 生产环境设为False执行实际删除 IMAGES_TO_KEEP: 2 # 每个仓库保留最新2个镜像 REPOSITORIES_FILTER: 'foo bar' # 仅清理名称含foo或bar的仓库 IGNORE_TAGS_REGEX: 'dev|staging|prod|latest-' # 保留这些标签的镜像
任务引用示例
yaml- *aws-ecr-cleaner # 直接引用锚点执行ECR清理
通过Vault AppRole认证机制获取临时令牌,并将令牌写入文件供后续工具(如Terraform)使用。
| 参数名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
VAULT_ROLEID | AppRole角色ID | - | 是 |
VAULT_SECRETID | AppRole密钥ID | - | 是 |
VAULT_ADDR | Vault服务地址(如[***]) | - | 否 |
YAML锚点定义
yamlshared: - &vault-approle-login task: vault-approle-login config: platform: linux image_resource: type: docker-image source: repository: cycloid/cycloid-toolkit tag: latest run: path: /usr/bin/vault-approle-login outputs: # 输出令牌文件到vault-token目录 - name: vault-token path: vault-token params: VAULT_ROLEID: ((vault.role_id)) # AppRole角色ID VAULT_SECRETID: ((vault.secret_id)) # AppRole密钥ID VAULT_ADDR: ((vault.address)) # Vault服务地址
任务引用示例
yaml- *vault-approle-login # 执行认证并输出令牌
合并cycloid.io的stack模板(基础设施代码)与用户配置(环境变量、参数等),生成最终部署配置。
| 参数名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
CONFIG_PATH | 用户配置目录路径 | config | 否 |
STACK_PATH | stack模板目录路径 | stack | 否 |
YAML锚点定义
yamlshared: - &merge-stack-and-config platform: linux image_resource: type: docker-image source: repository: cycloid/cycloid-toolkit tag: latest run: path: /usr/bin/merge-stack-and-config outputs: # 合并结果输出到merged-stack目录 - name: merged-stack path: "merged-stack"
任务引用示例
yaml- task: merge-stack-and-config config: <<: *merge-stack-and-config # 引用锚点 inputs: # 挂载stack和config输入目录 - name: ((project))-config-ansible path: "config" # 用户配置目录 - name: ((project))-stack-ansible path: "stack" # stack模板目录 - name: ((project))-terraform-apply # 可选:挂载Terraform输出作为变量 path: "terraform"
镜像标签基于内置Ansible版本命名,格式为v<ansible-version>(如v2.4)。更新Ansible版本时需同步更新标签:
bash# 构建新标签镜像 sudo docker build . -t cycloid/cycloid-toolkit:v2.4 # 推送至仓库 sudo docker push cycloid/cycloid-toolkit:v2.4
注意:生产环境建议使用固定标签(如
v2.4)而非latest,避免版本变更导致兼容性问题。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务