Назад | Перейти на главную страницу

Использование Packer для создания GCE с ошибкой «ошибка создания экземпляра», что дальше?

Я работал с использованием Packer v0.10.1 для создания образа и сталкиваюсь с этой проблемой безопасности доступа при попытке запустить через инструмент Hashicorp Atlas.

    Packer v0.10.1

    [1;32mgooglecompute output will be in this color.[0m

    [1;32m==> googlecompute: Checking image does not exist...[0m
    [1;32m==> googlecompute: Creating temporary SSH key for instance...[0m
    [1;32m==> googlecompute: Creating instance...[0m
    [0;32m    googlecompute: Loading zone: us-central1-a[0m
    [1;31m==> googlecompute: Error creating instance: Get https://www.googleapis.com/compute/v1/projects/united-course-124523/zones/us-central1-a?alt=json: oauth2/google: can't get a token from the metadata service; not running on GCE[0m
    [1;31mBuild 'googlecompute' errored: Error creating instance: Get https://www.googleapis.com/compute/v1/projects/united-course-124523/zones/us-central1-a?alt=json: oauth2/google: can't get a token from the metadata service; not running on GCE[0m

    ==> Some builds didn't complete successfully and had errors:
    --> googlecompute: Error creating instance: Get https://www.googleapis.com/compute/v1/projects/united-course-124523/zones/us-central1-a?alt=json: oauth2/google: can't get a token from the metadata service; not running on GCE

    ==> Builds finished but no artifacts were created.

Любые мысли, похоже, что это должна быть ошибка GCE, но я загрузил переменную account.json в переменную среды, как показано в файле шаблона Packer ниже.

    {
      "variables": {
        "instance_name": "hdqc-redis-{{timestamp}}",
        "image_name": "testing-hdqc-redis-{{timestamp}}"
      },
      "builders": [
        {
          "type": "googlecompute",
          "project_id": "united-course-124523",
          "source_image": "debian-8-jessie-v20160718",
          "zone": "us-central1-a",
          "instance_name": "{{user `instance_name`}}",
          "image_name": "{{user `image_name`}}",
          "image_description": "Nginx Server.",
          "communicator": "ssh",
          "ssh_username": "redisadmin"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": [
            "sleep 3",
            "echo \"slept for 3 seconds.\""
          ]
        },
        {
          "type": "file",
          "source": "install-redis.sh",
          "destination": "install-redis.sh"
        },
        {
          "type": "shell",
          "script": "install-redis.sh",
          "pause_before": "10s"
        }
      ]
    }

После осознания это просто исключение account.json, который, как показано здесь, требует определенной учетной записи службы в GCE. Поэтому я изменил и добавил переменную содержимого файла account.json.

    {
      "variables": {
        "instance_name": "hdqc-redis-{{timestamp}}",
        "image_name": "testing-hdqc-redis-{{timestamp}}",
        "account_json": "{{env `packer_account_json`}}",
      },
      "builders": [
        {
          "type": "googlecompute",
          "account_file": "{{user `account_json`}}",
          "project_id": "united-course-124523",
          "source_image": "debian-8-jessie-v20160718",
          "zone": "us-central1-a",
          "instance_name": "{{user `instance_name`}}",
          "image_name": "{{user `image_name`}}",
          "image_description": "Nginx Server.",
          "communicator": "ssh",
          "ssh_username": "redisadmin"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": [
            "sleep 3",
            "echo \"slept for 3 seconds.\""
          ]
        },
        {
          "type": "file",
          "source": "install-redis.sh",
          "destination": "install-redis.sh"
        },
        {
          "type": "shell",
          "script": "install-redis.sh",
          "pause_before": "10s"
        }
      ]
    }

Но затем добавив это изменение, где у меня есть содержимое файла account.json, хранящееся как переменная с именем «packer_account_json», в результате возникла следующая ошибка.

    Packer v0.10.1

    googlecompute output will be in this color.

    1 error(s) occurred:

    * account_file path does not exist: {

К чему я размышляю, что в мире сейчас. Он не может принимать переменную? Это похоже на то, как я сохранил содержимое account.json в качестве переменной для Terraform, и он отлично работает.

Packer необходимы учетные данные для запуска виртуальной машины GCE для создания образа. Если бы вы запускали процесс Packer на GCE, эти учетные данные были бы предоставлены службой метаданных экземпляра.

Поскольку Atlas не работает на GCE, вам необходимо создать ключ учетной записи службы, загрузить его и добавить в манифест Packer. Это было бы account_file запись в этом простом манифесте:

{ "type": "googlecompute", "account_file": "account.json", "project_id": "your-project", "source_image": "your-base-image", "zone": "us-central1-a" }

В Работа без учетной записи службы Compute Engine раздел в Документы упаковщика дает пошаговую инструкцию по созданию ключа сервисного аккаунта.