如何为Bluemix(Cloud Foundry) Manifest配置变量区分UAT环境实例
我之前帮团队解决过几乎一模一样的IBM Cloud(原Bluemix)部署环境区分问题,不用每次手动改Manifest文件,有两种靠谱的方案能帮你实现动态配置应用名称和其他设置,下面详细说:
方案1:使用Manifest占位符+部署变量替换
这种方式适合大部分场景,只需要在主Manifest里用占位符,部署时通过命令行或环境变量传入对应的值即可。
步骤1:修改Manifest.yml,替换固定名称为占位符
把原来固定的name和host改成变量占位符(比如${APP_NAME}),其他配置保持不变:
applications: - path: . memory: 256M instances: 3 domain: bm.devfg.com buildpack: sdk-for-nodejs name: ${APP_NAME} host: ${APP_HOST} disk_quota: 1024M services: - dynatracesaasnodejs - postgresunixdb env: NODE_TLS_REJECT_UNAUTHORIZED: "0"
步骤2:部署时传递变量
你可以直接通过cf push命令的-v参数传递变量,或者用环境变量提前设置:
直接命令行部署UAT:
cf push -f manifest.yml -v APP_NAME=AppName_UAT APP_HOST=AppName_UAT
部署DEV实例:
cf push -f manifest.yml -v APP_NAME=AppName_DEV APP_HOST=AppName_DEV
部署PROD环境:
cf push -f manifest.yml -v APP_NAME=AppName APP_HOST=AppName
进阶:写个部署脚本简化操作
为了避免团队成员记复杂命令,写个简单的Shell脚本(比如deploy.sh):
#!/bin/bash # 检查参数是否合法 if [ $# -ne 1 ]; then echo "Usage: ./deploy.sh [uat|dev|prod]" exit 1 fi # 根据参数设置对应变量 case "$1" in uat) export APP_NAME=AppName_UAT export APP_HOST=AppName_UAT ;; dev) export APP_NAME=AppName_DEV export APP_HOST=AppName_DEV ;; prod) export APP_NAME=AppName export APP_HOST=AppName ;; *) echo "Invalid environment! Use uat, dev, or prod." exit 1 esac # 执行部署 cf push -f manifest.yml
使用时只需要运行:
# 部署UAT ./deploy.sh uat # 部署DEV ./deploy.sh dev # 部署PROD ./deploy.sh prod
方案2:多Manifest文件+部署脚本切换
如果不同环境的配置差异很大(比如内存、实例数、绑定的服务都不一样),这种方式更清晰——为每个环境单独写一个Manifest文件,用脚本选择部署。
步骤1:创建多环境Manifest文件
manifest-prod.yml(生产环境):
applications: - path: . memory: 256M instances: 3 domain: bm.devfg.com buildpack: sdk-for-nodejs name: AppName host: AppName disk_quota: 1024M services: - dynatracesaasnodejs - postgresunixdb env: NODE_TLS_REJECT_UNAUTHORIZED: "0"
manifest-dev.yml(DEV实例):
applications: - path: . memory: 256M instances: 3 domain: bm.devfg.com buildpack: sdk-for-nodejs name: AppName_DEV host: AppName_DEV disk_quota: 1024M services: - dynatracesaasnodejs - postgresunixdb env: NODE_TLS_REJECT_UNAUTHORIZED: "0"
manifest-uat.yml(UAT实例):
applications: - path: . memory: 256M instances: 3 domain: bm.devfg.com buildpack: sdk-for-nodejs name: AppName_UAT host: AppName_UAT disk_quota: 1024M services: - dynatracesaasnodejs - postgresunixdb env: NODE_TLS_REJECT_UNAUTHORIZED: "0"
步骤2:写部署脚本切换Manifest
创建deploy.sh脚本:
#!/bin/bash if [ $# -ne 1 ]; then echo "Usage: ./deploy.sh [uat|dev|prod]" exit 1 fi case "$1" in uat) MANIFEST="manifest-uat.yml" ;; dev) MANIFEST="manifest-dev.yml" ;; prod) MANIFEST="manifest-prod.yml" ;; *) echo "Invalid environment! Use uat, dev, or prod." exit 1 esac cf push -f $MANIFEST
使用方式和方案1一样,运行./deploy.sh uat就能部署UAT环境了。
注意事项
- 确保团队成员的CF CLI版本支持变量替换(v6及以上版本都没问题,现在v7也完全兼容)
- 如果用脚本,记得给脚本加执行权限:
chmod +x deploy.sh - 两种方案都可以扩展到其他配置项,比如不同环境的内存大小、实例数,只需要对应修改占位符或单独的Manifest即可
内容的提问来源于stack exchange,提问作者LittleOldMe
相关产品推荐
相关产品推荐

