Рубрики
Uncategorized

Создание Inspec с SSH Работа с Packer на платформе Google Cloud

Эта запись была первоначально опубликована в моем блоге в blog.baens.net фон Этот блог пост … Помечено DevOps, Packer, Inspec, GCP.

Эта запись была первоначально опубликована в моем блоге в blog.baens.net

Этот блог пост стремится помочь кому-либо, пытаясь сделать Упаковщик Изображение, проверено с Inspec , на Google Cloud Platform . Я недавно использовал эти инструменты для моего повседневного И я хотел сделать эти три инструмента работать вместе, что было удивительно сложно. Этот пост блогов, надеюсь, поможет кому-нибудь, что может пытаться одинаково.

То, что я хочу от этих инструментов, у Packer раскрутит новый VM, запустите все шаги построения, затем проверьте, что VM с Inspec. Кроме того, я не хотел загрошить виртуальную машину с чем-нибудь более установленным, то это действительно нужно, поэтому я не хотел, чтобы Inspec работал со всеми своими инструментами, установленными на новой виртуальной машине. Это означает, что я хотел, чтобы Inspec бежать с моей коробки, а затем подключиться через SSH в новую коробку. Звучит просто правильно? Ну, там было достаточно чтов и отсутствие поисковых ресурсов, которые я чувствовал, что мне нужно было написать это.

Настолько достаточно Yap, давайте посмотрим, как выглядит код. Если вы хотите увидеть, все вместе, код репозитория здесь Отказ

Итак, позвольте мне пройтись по проблемам, с которыми я столкнулся вдоль этого путешествия, постараюсь продемонстрировать ответы.

Проблема № 1: Первая проблема, которую я попал, заключался в том, что мне нужна инспекта, чтобы поговорить с новым виртуалом, но Packer не обеспечивает эти переменные очень легко. То, что мне нужно было хозяин IP VM, бегущего в облаке. Поскольку Packer не предоставил это из коробки, мне пришлось понять способ обойти это.

Проблема № 2: Как только я установил соединение, я должен был подтвердить подлинность Inspec с VM. Inspec может врасно подключиться через SSH, поэтому создание и создание ключа SSH для входа в систему был очевиденным выбором. Тем не менее, Packer снова не предоставил вам удобный способ сделать это, поэтому мне нужно установить этот ключ и установить несколько ручных вещей, чтобы сделать эту работу.

Это звучит достаточно легко, но удивительно затруднено: как получить IP-адрес в настоящее время VM VM, с которым общается Packer? Один из подходов может пинговать какой-то удаленный веб-сайт, который говорит вам ваш публичный IP, но это кажется смешным, чтобы ввести еще один слой за пределами вашего контроля. Мой поиск наткнулся на ряд примеров того, как это сделать на AWS, но очень мало на GCP. Тем не менее, люди, использующие AWS, дали мне представление о том, что таятно, или по крайней мере, что искать.

То, что люди используют на AWS часто называют сервером метаданных. Сервер метаданных — это услуга для каждого VM, работающего на AWSGCP ), которые могут рассказать вам о том, что вы работаете. Это было то, что мне нужно, я нашел Документация для GCP И наверняка достаточно, у него была информация обо всех открытых IP-адресах. Особый адрес, который мне нужен, был расположен на этом URL: http:///metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip. . А что еще лучше было то, что это было общее по всему случаю, поэтому мне не пришлось делать какую-то необычную логику в зависимости от коробки.

Теперь, когда у меня есть HTTP-адрес, где я могу получить внешний IP-адрес, как бы я точно извлекил эту информацию из командной строки. К счастью, Curl уже установлен, поэтому я создал эту команду:

curl  -H \"Metadata-Flavor: Google\" metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip

И выполнил это и альт, IP-адрес, который мне нужен.

Теперь что-то нужно указать. Этот заголовок HTTP добавил ( метаданные-аромат: Google ) требуется. Это безопасная защитная защита, чтобы защитить, вы случайно укажите что-то не так в этом месте.

Теперь, когда у меня есть мой IP-адрес, как мне это использовать? Опять же, длинные поиски не показали пути к переменным трубопровода от одного пакера шага к другому, так что я собирался? Я не на 100% уверен, как я наткнулся на Но я нашел очень аккуратный трюк для загрузки файла после его создания. Вот что это будет выглядеть в шагах обеспечения упаковщика:

"provisioners": [
    {
        "type": "shell",
        "inline": ["curl -H \"Metadata-Flavor: Google\" metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip > /tmp/ip"]
    },
    {
        "type": "file",
        "direction": "download",
        "source": "/tmp/ip",
        "destination": "./host"
    }
]

И это решило проблему. Просто нужно создать файл с данными со специальной внутренней конечной точки, затем загрузите этот файл для использования в следующих шагах. Легкий! Или, по крайней мере, просто, как только вы вы будете работать. Иди рисунок!

Теперь, когда у меня был IP-адрес, мне нужно общаться от INPSEC к этому IP. Inspec имеет несколько способов общения с машиной. Это может сделать это локально или даже выполнять на удаленном компьютере. Я хотел выполнить локально, но общаться на удаленной машине, чтобы мне не приходилось устанавливать ничего в удаленном поле. Это приводит меня к пути, который мне нужно было использовать SSH, чтобы общаться с этим удаленным ящиком. По умолчанию SSH требуется имя пользователя и пароль, и поскольку я собирался использовать это в автоматической среде сборки. Наличие чем-то подсказки для имени пользователя и пароля не собирались летать, не говоря уже о том, что тоже не очень безопасно. Поэтому мне нужно как-то настроить SSH-ключ в автоматическом процессе, чтобы войти в удаленную коробку.

Google Cloud предоставляет вам возможность предоставить ключ SSH Это будет установлено на коробке для вас. Итак, сначала давайте создадим ключ. Путь Google разбирается в ключевой информации, это ищет комментарии внутри ключа, для которого пользователь связан с этим. Вот команда, которую я использую для генерации ключа:

ssh-keygen -f inspec-key -C packer -N '' -m PEM

Команда выводится набор файлов клавиш SSH, называемых Inspec-Key с комментарием упаковщик и Флаг — это пароль, который будет использоваться (пустым в этом случае). Вам необходимо указать формат PEM, потому что некоторые из модулей Ruby, которые будут загружены, не могут разбирать новые форматы клавиш OpenSSH.

Хорошо, у меня теперь есть мой ключ SSH, теперь мне нужно разместить клавишу SSH для Packer для использования, когда он создает экземпляр VM. Для этого вам нужно изменить строитель с несколькими параметрами. Вот что застройщик превращается в:

"builders": [
        {
            "type": "googlecompute",
            ...
            "metadata": {
                "ssh-keys": "packer:{{user `inspec-key`}}"
            }
        }
    ],

И вот что будет выглядеть команда для запуска пакера:

packer build -var inspec-key=$(cat inspec-key.pub) image.json

метаданные/ssh-ключи это важная часть. Вы добавляете метаданные с именем пользователя, затем содержимое ключа. Это сначала позвонило мне, потому что я думал, что ключ уже установлен со всей соответствующей информацией, но проб и ошибка нашли правильный формат. И просто чтобы быть понятным, формат это <Имя пользователя>: Отказ

Хорошо, теперь, когда у нас есть новый экземпляр и работает, как мы подключаемся к Inspec? Ну, опять же, я не очень хотел установить другой инструмент, поэтому давайте использовать Docker для запуска фактического инструмента. Команда Docker будет выглядеть так:

docker run --rm -v $(pwd):/workspace -w /workspace chef/inspec:3.2.7 detect -t ssh://packer@$( cat host ) -i inspec-key

Несколько вещей, которые можно объяснить в этом:

  • -V $ (PWD):/Workspace -w/Workspace — Возьмите свой текущий каталог и установите его на /Рабочее пространство И сделайте текущий каталог, когда контейнер Docker работает внутри этого каталога.
  • Шеф/инспект: 3.2.7 Обнаружение — Docker Image и команда для запуска. Для демо того, как я использовал обнаруживать Просто чтобы показать вам, что это соединяет. Когда вы действительно хотите запустить тесты, которые вы запускаете предпринять .
  • -t ssh://packer @ $ (cat host) --i Inspec-Key — Вот несколько волшебных битов. Скажите проверять, чтобы подключиться через SSH с данными из хозяин Файл мы скачали на предыдущем шаге. Далее используйте Inspec-Key Файл, который мы создали ранее.

Хорошо, все вместе это будет выглядеть так:

{
    "builders": [
        {
            "type": "googlecompute",
            "project_id": "{{user `gcp-project`}}",
            "source_image_family": "ubuntu-1804-lts",
            "zone": "us-central1-a",
            "image_description": "Image demo for SSH keys",
            "ssh_username": "packer",
            "tags": "packer",
            "image_name": "test-image-{{isotime | clean_image_name}}",
            "metadata": {
                "enable-oslogin": "false",
                "ssh-keys": "packer:{{user `inspec-key`}}"
            }
        }
    ],
    "provisioners": [
        {
            "type": "shell",
            "inline": ["curl metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip -H \"Metadata-Flavor: Google\" > /tmp/ip"]
        },
        {
            "type": "file",
            "direction": "download",
            "source": "/tmp/ip",
            "destination": "./host"
        },
        {
            "type": "shell-local",
            "command": "docker run --rm -v $(pwd):/workspace -w /workspace chef/inspec:3.2.7 detect -t ssh://packer@$( cat host ) -i inspec-key"
        }
    ]
}

Строитель установлен с нашими ключами для нас для подключения. Затем инструмент загружает IP сервера, и мы используем это с Inspec для подключения к хосту. Это должно выглядеть что-то подобное, когда он работает:

Ссылка на GIF из сборки, что-то запуталось на Dev.to

Все исходный код можно найти на GitHub, если вы хотите запустить это самостоятельно.

Оригинал: «https://dev.to/baens/making-inspec-with-ssh-work-with-packer-on-the-google-cloud-platform-16gm»