Como definir propriedades de modelo e usar variáveis de ambiente

Uma vantagem de usar modelos para sua implantação é a capacidade de criar e definir propriedades personalizadas, que permitem reutilizar modelos em zonas, regiões e projetos.

Propriedades de modelo são variáveis arbitrárias. Qualquer arquivo de configuração ou modelo pode fornecer um valor para uma propriedade de modelo sem modificar o modelo. Portanto, é possível alterar o valor de uma propriedade para várias configurações sem alterar o próprio modelo.

Para se referir a um valor arbitrário, use esta sintaxe em um modelo:

context.properties["property-name"]

Além das propriedades de modelo, também é possível usar variáveis de ambiente específicas para sua implantação, que são pré-preenchidas com informações sobre a implantação. É possível usar variáveis de ambiente em modelos para receber informações exclusivas sobre sua implantação.

Chame uma variável de ambiente usando esta sintaxe:

context.env['variable-name']

As variáveis de ambiente válidas incluem o nome da implantação, o ID do projeto, a propriedade de nome do recurso e o tipo de configuração. Saiba mais sobre variáveis de ambiente.

Propriedades de modelo e variáveis de ambiente em um modelo

Nesta etapa, vm-template.py mostra os benefícios das propriedades do modelo e das variáveis de ambiente. Abra vm-template.py:

cd deploymentmanager-samples/examples/v2/step_by_step_guide/step7_use_environment_variables/python

nano vm-template.py  # use your preferred text editor

Várias partes do modelo foram substituídas por propriedades de modelo e variáveis de ambiente. Por exemplo, o ID do projeto é substituído por context.env[project]. Portanto, não é necessário substituir manualmente o ID do projeto nos modelos.

Os comentários no arquivo descrevem outras alterações no modelo.

# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'


def GenerateConfig(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      # `the-first-vm` is replaced with `context.env[`name`]`
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          # All occurrences of `us-central1-f` are replaced with
          # `context.properties[`zone`]. 
          # All occurrences of the project ID are replaced with 
          # `context.env[`project`]`.
          # `f1-micro` is replaced with `context.properties["machineType"].  
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-11'])
              }
          }],
          # `$(ref.a-new-network.selfLink)` is replaced with 
          # `$(ref.` + context.properties[`network`] + `selfLink)`.
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Da mesma forma, network-template.py e firewall-template.py usam o nome da implantação na definição, chamando context.env['name'].

Como implantar a configuração

Para visualizar o arquivo de configuração dessa implantação, execute o seguinte comando:

nano config-with-many-templates.yaml

Salve suas alterações e reimplante sua configuração para confirmar se as variáveis funcionam.

gcloud deployment-manager deployments create deployment-with-template-properties --config config-with-many-templates.yaml

Como excluir a implantação

Recomendamos que você exclua a implantação para evitar cobranças. Você não precisa desta implantação para a próxima etapa. Execute o seguinte comando para excluir a implantação:

gcloud deployment-manager deployments delete deployment-with-template-properties

Pensando no futuro: scripts auxiliares

Em seguida, saiba mais sobre os scripts auxiliares para realizar tarefas repetidas com eficiência.