如何在 Cloud Deployment Manager 中指定阻止项目范围的 SSH 密钥?

How can I specify to block project-wide SSH keys in Cloud Deployment Manager?

我想创建一个 WURFL Microservice Basic from the GCP Marketplace 的实例,但是我想以编程方式执行此操作,以便在需要时可以重现它。

我从上面的链接页面下载了部署 zip 文件:

并将其解压缩到我的机器上,所以这里我有创建 WURFL 解决方案的代码:

文件 test_config.yaml 包含有关我的部署的相关信息,我将 serviceAccount、zone、network、subnetwork 和 externalIP 属性更改为我需要它们的值有:

imports:
- path: wurfl-microservice-basic.jinja

resources:
- name: wurfl-microservice-basic
  type: wurfl-microservice-basic.jinja
  properties:
    zone: europe-west2-a
    network:
      - sharedresources
    subnetwork:
      - eu-west2
    externalIP:
      - NONE
    serviceAccount: wurflrunner@XXXXX.iam.gserviceaccount.com

我通过发布部署:

gcloud deployment-manager deployments create \
  wurfl \
  --project xxxxxxx \
  --config test_config.yaml

为了允许指定 serviceAccount,我不得不对部署包进行一些更改。

我在 wurfl-microservice-basic.jinja.schema

中的属性中添加了一个 serviceAccount 属性
properties:
  serviceAccount:
    type: string
    default: stop@gocreateaservieaccount.com
  zone:
    type: string
    x-googleProperty:
      type: GCE_ZONE
  machineType:
    type: string
    default: e2-small
    x-googleProperty:
      type: GCE_MACHINE_TYPE
      zoneProperty: zone
      gceMachineType:
        minCpu: 2
        minRamGb: 1.9990234375
  network:
    type: array
    default: [default]
    minItems: 1
    maxItems: 1
    x-googleProperty:
      type: GCE_NETWORK
      gceNetwork:
        allowSharedVpcs: True
        machineTypeProperty: machineType
  subnetwork:
    type: array
    minItems: 1
    maxItems: 1
    x-googleProperty:
      type: GCE_SUBNETWORK
      zoneProperty: zone
      gceSubnetwork:
        networkProperty: network
  externalIP:
    type: array
    default: [EPHEMERAL]
    minItems: 1
    maxItems: 1
    x-googleProperty:
      type: GCE_EXTERNAL_IP
      gceExternalIp:
        networkProperty: network
        notConfigurable: False
        allowStaticIps: True
  bootDiskType:
    type: string
    default: pd-ssd
    x-googleProperty:
      type: GCE_DISK_TYPE
      zoneProperty: zone
  bootDiskSizeGb:
    type: integer
    default: 20
    minimum: 20
    maximum: 10000
    x-googleProperty:
      type: GCE_DISK_SIZE
      gceDiskSize:
        diskTypeProperty: bootDiskType

wurfl-microservice-basic.jinja 我添加了:

{% set serviceAccount = properties["serviceAccount"] %}

并更改:

      serviceAccounts:
        - email: default
          scopes:
            - 'https://www.googleapis.com/auth/cloud.useraccounts.readonly'
            - 'https://www.googleapis.com/auth/devstorage.read_only'
            - 'https://www.googleapis.com/auth/logging.write'
            - 'https://www.googleapis.com/auth/monitoring.write'

      serviceAccounts:
        - email: {{ serviceAccount }}
          scopes:
            - 'https://www.googleapis.com/auth/cloud.useraccounts.readonly'
            - 'https://www.googleapis.com/auth/devstorage.read_only'
            - 'https://www.googleapis.com/auth/logging.write'
            - 'https://www.googleapis.com/auth/monitoring.write'

这导致包创建成功。创建的 VM 允许项目范围的 SSH 密钥:

我被告知这违反公司政策,需要启用“阻止项目范围的 SSH 密钥”(即选中)。

当我进行更改以允许指定 serviceAccount 时,这样做相对容易,因为 serviceAccount 已经存在于 wurfl-microservice-basic.jinja 中,但是相同不适用于“阻止项目范围的 SSH 密钥”设置。

有人能告诉我需要对下载的部署包进行哪些更改才能启用“阻止项目范围的 SSH 密钥”吗?

想通了。它是实例元数据的一部分。我在 vm_instance.py 的 Cloud Deployment Manager 包中更改了它,方法是更改​​

def SetMetadataDefaults(metadata):
  """Set default metadata items."""
  # Disable stackdriver monitoring by default.
  items = metadata.setdefault('items', list())
  if not [True for x in items
          if x.get('key', None) == 'google-monitoring-enable']:
    items.append({'key': 'google-monitoring-enable',
                  'value': '0'})
  if not [True for x in items
          if x.get('key', None) == 'google-logging-enable']:
    items.append({'key': 'google-logging-enable',
                  'value': '0'})

def SetMetadataDefaults(metadata):
  """Set default metadata items."""
  # Disable stackdriver monitoring by default.
  items = metadata.setdefault('items', list())
  if not [True for x in items
          if x.get('key', None) == 'google-monitoring-enable']:
    items.append({'key': 'google-monitoring-enable',
                  'value': '0'})
  if not [True for x in items
          if x.get('key', None) == 'google-logging-enable']:
    items.append({'key': 'google-logging-enable',
                  'value': '0'})
  if not [True for x in items
          if x.get('key', None) == 'block-project-ssh-keys']:
    items.append({'key': 'block-project-ssh-keys',
                  'value': 'TRUE'})

这是结果