Чтобы повысить гибкость кода облачных шаблонов в 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)}'