为提高灵活性,可以在 Cloud Assembly 中向云模板代码添加表达式。
表达式的工作原理
Cloud Assembly 表达式使用 ${expression} 构造,如以下示例中所示。
以下代码示例已经过修剪,仅显示重要行。未经编辑的整个云模板显示在最后。
示例
在部署时,允许用户粘贴在远程访问所需的加密密钥中:
inputs: sshKey: type: string maxLength: 500 resources: frontend: type: Cloud.Machine properties: remoteAccess: authentication: publicPrivateKey sshKey: '${input.sshKey}'
要部署到 VMware Cloud on AWS,请将文件夹名称设置为所需的 Workload 名称:
inputs: environment: type: string enum: - AWS - vSphere - Azure - VMC - GCP default: vSphere resources: frontend: type: Cloud.Machine properties: folderName: '${input.environment == "VMC" ? "Workload" : ""}'
部署时,使用与所选环境匹配的全小写 env 标记对计算机进行标记:
inputs: environment: type: string enum: - AWS - vSphere - Azure - VMC - GCP default: vSphere resources: frontend: type: Cloud.Machine properties: constraints: - tag: '${"env:" + to_lower(input.environment)}'
将前端集群中的计算机数设置为 1(小型)或 2(大型)。请注意,大型集群是通过清除过程设置的:
inputs: envsize: type: string enum: - Small - Large resources: frontend: type: Cloud.Machine properties: count: '${input.envsize == "Small" ? 1 : 2}'
通过绑定到在网络资源中找到的属性,将计算机连接到同一 Default 网络:
resources: frontend: type: Cloud.Machine properties: networks: - network: '${resource.Cloud_Network_1.name}' apitier: type: Cloud.Machine properties: networks: - network: '${resource.Cloud_Network_1.name}' Cloud_Network_1: type: Cloud.Network properties: name: Default networkType: existing
对提交到 API 的访问凭据进行加密:
resources: apitier: type: Cloud.Machine properties: cloudConfig: | #cloud-config runcmd: - export apikey=${base64_encode(input.username:input.password)} - curl -i -H 'Accept:application/json' -H 'Authorization:Basic :$apikey' http://example.com
发现 API 计算机的地址:
resources: frontend: type: Cloud.Machine properties: cloudConfig: | runcmd: - echo ${resource.apitier.networks[0].address} apitier: type: Cloud.Machine properties: networks: - network: '${resource.Cloud_Network_1.name}'
完整云模板
inputs: environment: type: string enum: - AWS - vSphere - Azure - VMC - GCP default: vSphere sshKey: type: string maxLength: 500 envsize: type: string enum: - Small - Large resources: frontend: type: Cloud.Machine properties: folderName: '${input.environment == "VMC" ? "Workload" : ""}' image: ubuntu flavor: medium count: '${input.envsize == "Small" ? 1 : 2}' remoteAccess: authentication: publicPrivateKey sshKey: '${input.sshKey}' cloudConfig: | packages: - nginx runcmd: - echo ${resource.apitier.networks[0].address} constraints: - tag: '${"env:" + to_lower(input.environment)}' networks: - network: '${resource.Cloud_Network_1.name}' apitier: type: Cloud.Machine properties: folderName: '${input.environment == "VMC" ? "Workload" : ""}' image: ubuntu flavor: small cloudConfig: | #cloud-config runcmd: - export apikey=${base64_encode(input.username:input.password)} - curl -i -H 'Accept:application/json' -H 'Authorization:Basic :$apikey' http://example.com remoteAccess: authentication: publicPrivateKey sshKey: '${input.sshKey}' constraints: - tag: '${"env:" + to_lower(input.environment)}' networks: - network: '${resource.Cloud_Network_1.name}' Cloud_Network_1: type: Cloud.Network properties: name: Default networkType: existing constraints: - tag: '${"env:" + to_lower(input.environment)}'