Чтобы повысить гибкость кода облачных шаблонов в 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 — малый (small), 2 — большой (large). Обратите внимание, что большой кластер задается путем исключения:
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)}'