как перезапустить группу экземпляров через облачную библиотеку python Google

#python #google-cloud-platform #virtual-machine #google-compute-engine

#python #google-облачная платформа #виртуальная машина #google-compute-engine

Вопрос:

Я не могу найти ни одного примера кода или соответствующей документации по библиотеке python для Google Cloud

Хотите перезапустить управляемые группы экземпляров всех виртуальных машин через облачную функцию.

Для перечисления экземпляров я использую что-то вроде этого

 import googleapiclient.discovery

def list_instances(compute, project, zone):
    result = compute.instances().list(project=project, zone=zone).execute()
    return result['items'] if 'items' in result else None
 

в файле требований у меня есть

 google-api-python-client==2.31.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
 

Из командной строки это возможно с помощью SDK ->
https://cloud.google.com/sdk/gcloud/reference/compute/instance-groups/managed/rolling-action/restart

 gcloud compute instance-groups managed rolling-action restart NAME [--max-unavailable=MAX_UNAVAILABLE] [--region=REGION     | --zone=ZONE] [GCLOUD_WIDE_FLAG …]
 

Но на python я не могу написать какой-либо код.

Комментарии:

1. Вы проверили здесь github.com/googleapis/google-cloud-python Клиент Google api python предназначен для доступа к API-интерфейсам обнаружения. Я не думаю, что облачный клиент является частью этого.

2. также пробовал эту библиотеку, как написать список групп экземпляров или перезапустить, документации нет

Ответ №1:

Это неполный ответ, поскольку документы Python для меня довольно нечитабельны.

Просматривая gcloud cli код (для которого я не смог найти официальное репозиторий, поэтому я посмотрел здесь), команда перезапуска запускается чем-то, называемым «минимальным действием».

 minimal_action = (client.messages.InstanceGroupManagerUpdatePolicy.
                  MinimalActionValueValuesEnum.RESTART)
 

В документах Python есть ссылки на эти поля в методе applyUpdatesToInstances .

Поэтому я думаю, что соответствующий код чем-то похож на:

 compute.instanceGroupManagers().applyUpdatesToInstances(
  project=project,
  zone=zone,
  instanceGroupManager='NAME',
  body={"allInstances": True, "minimalAction": "RESTART"},
)
 

Для тела может быть или не быть подходящего объекта Python, документы неясны.
И результат, похоже, является каким-то объектом Operation, но я не знаю, есть ли execute() метод или нет.

Комментарии:

1. Обратите внимание, что метод applyUpdatesToInstances перезапустит экземпляры в MIG, но не поочередно (он будет выполнять их все сразу), что отличается от команды gcloud, на которую ссылается OP.

Ответ №2:

Это сбивает с толку, потому gcloud compute instance-groups managed rolling-action что синтаксический сахар выполняет две вещи:

  • Он включает упреждающее средство обновления, устанавливая соответствующую политику обновления на ресурсе InstanceGroupManager
  • И он изменяет имя версии на том же ресурсе, чтобы запустить обновление.

Это описано в документах в https://cloud.google.com/compute/docs/instance-groups/rolling-out-updates-to-managed-instance-groups#performing_a_rolling_replace_or_restart

Сравните вкладки gcloud и API, чтобы получить представление.

К сожалению, я неграмотен в Python, поэтому я не могу перевести его в код Python:(.

Ответ №3:

Используя документацию, предоставленную @Grzenio, используйте patch() метод для перезапуска группы экземпляров. Смотрите Документацию по исправлению, чтобы проверить его параметры.

Это можно написать на python, используя приведенный ниже код. Я предоставил необходимые параметры project , zone , instanceGroupManager и body . Значение body взято из примера в документации.

 import googleapiclient.discovery
import json

project = 'your-project-id'
zone = 'us-central1-a' # the zone of your instance group
instanceGroupManager = 'instance-group-1' # instance group name
body = {
    "updatePolicy": {
        "minimalAction": "RESTART",
        "type": "PROACTIVE"
    },
    "versions": [{
        "instanceTemplate": "global/instanceTemplates/instance-template-1",
        "name": "v2"
    }]
}

compute = googleapiclient.discovery.build('compute', 'v1')
rolling_restart = compute.instanceGroupManagers().patch(
        project=project,
        zone=zone,
        instanceGroupManager=instanceGroupManager,
        body=body
        )
restart_operation = rolling_restart.execute() # execute the request
print(json.dumps(restart_operation,indent=2))

 

Это вернет объект operation, и группа экземпляров должна быть перезапущена в непрерывном режиме:

 {
  "id": "3206367254887659944",
  "name": "operation-1638418246759-5d221f9977443-33811aed-eed3ee88",
  "zone": "https://www.googleapis.com/compute/v1/projects/your-project-id/zones/us-central1-a",
  "operationType": "patch",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/your-project-id/zones/us-central1-a/instanceGroupManagers/instance-group-1",
  "targetId": "810482163278776898",
  "status": "RUNNING",
  "user": "serviceaccountused@your-project-id.iam.gserviceaccount.com",
  "progress": 0,
  "insertTime": "2021-12-01T20:10:47.654-08:00",
  "startTime": "2021-12-01T20:10:47.670-08:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/your-project-id/zones/us-central1-a/operations/operation-1638418246759-5d221f9977443-33811aed-eed3ee88",
  "kind": "compute#operation"
}
 

Комментарии:

1. @GauravTomar Я предлагаю вам открыть новый вопрос, касающийся таргетинга на неуправляемые группы экземпляров, поскольку исходный вопрос предназначен для управляемых групп экземпляров.

2. @GauravTomar если это ответило на ваш первоначальный вопрос, пожалуйста, подумайте о том, чтобы принять его, щелкнув значок проверки с левой стороны. Это поможет другим членам сообщества, если они столкнутся с той же проблемой.