Definir propriedades de modelos e usar variáveis de ambiente

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

As propriedades do modelo são variáveis arbitrárias. Qualquer ficheiro de configuração ou ficheiro de modelo pode fornecer um valor para uma propriedade do modelo sem modificar o modelo. Por conseguinte, pode alterar o valor de uma propriedade para várias configurações sem alterar o próprio modelo.

Para fazer referência a um valor arbitrário, use esta sintaxe num modelo:

context.properties["property-name"]

Além das propriedades do modelo, também pode usar variáveis de ambiente específicas da sua implementação, que são pré-preenchidas com informações sobre a implementação. Pode usar variáveis de ambiente em modelos para obter informações únicas sobre a sua implementação.

Chama uma variável de ambiente através desta sintaxe:

context.env['variable-name']

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

Propriedades do modelo e variáveis de ambiente num modelo

Neste passo, vm-template.py mostra as vantagens das propriedades dos modelos e das variáveis de ambiente. Abrir 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 do modelo e variáveis de ambiente. Por exemplo, o ID do projeto é substituído por context.env[project], pelo que não tem de substituir manualmente o ID do projeto nos seus modelos.

Os comentários no ficheiro descrevem outras alterações ao 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 implementação na respetiva definição chamando context.env['name'].

Implementar a configuração

Para ver o ficheiro de configuração desta implementação, execute o seguinte comando:

nano config-with-many-templates.yaml

Guarde as alterações e volte a implementar a configuração para confirmar que as variáveis funcionam.

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

Eliminar a implementação

Recomendamos que elimine a implementação para evitar custos. Não precisa desta implementação para o passo seguinte. Execute o seguinte comando para eliminar a implementação:

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

Os nossos planos para o futuro: scripts auxiliares

Em seguida, saiba mais sobre os scripts auxiliares para realizar tarefas repetidas de forma eficiente.