04/05/2019
При работе в облаке или в системе виртуализации очень часто необходимо создание определенных «золотых» образов операционных систем. Данные образы позволяют запускать виртуальные машины с нужными готовыми настройками и установленным программным обеспечением. Чем больше виртуальных машин в инфраструктуре Вы используете, тем актуальнее такие золотые образы для Вас. Экономия времени в работе выходит колоссальная. Также, например, для меня при тестировании той или иной технологии часто нужно бывает оперативно поднять одну или несколько виртуалок. Желательно это сделать быстро. В связке с Vagrant, Ansible, программный продукт Packer от HashiCorp великолепно справляется с этой задачей. Он позволяет из исходного образа виртуальной машины подготовить необходимый для наших целей «золотой» образ.
Эта статья является логическим продолжением темы IaaC, которую я поднял в «Автоматизируем облако с Terraform». Здесь, как и в той статье, мы также рассмотрим продукт компании HashiCorp. Сама компания, возглавляемая Mitchell Hashimoto, продвигает в последние годы несколько интересных идей, которые реализуются в рамках парадигмы Infrastructure-as-a-Code. В этой статье мы разберем относительно небольшой программный продукт Packer. По сути у него только одна задача — создание загрузочного образа виртуальной машины под конкретную среду облака или виртуализации. С этой задачей Packer справляется блестяще. Он позволяет работать с облаками Amazon, Azure, GCP, виртуальными машинами VMware, контейнерами Docker.
Создание AMI EC2 с помощью Packer
В данной статье мы разберем как создавать образ ОС в облаке Amazon AWS. Мы возьмем стандартный AMI в AWS с операционной системой Ubuntu. С помощью Packer модернизируем его так, чтобы в дальнейшем мы могли управлять виртуалкой с помощью нашей системы управления Ansible. Для этого создадим отдельного пользователя в операционной системе, обеспечим ему возможность подключаться через ssh ключ, а также использовать sudo без пароля. В моей работе такая ситуация возникает постоянно. Если после инициализации система будет готова к работе с Ansible, то дальше мы просто накатываем на нее нужные роли Ansible. И буквально через несколько минут можем приступить к работе в нужном окружении.
Установка Packer не вызывает больших затруднений. В Mac OS это выполняется одной коммандой $ brew install packer. Сразу после этого мы можем приступить к работе над нужным нам образом. Для этого в директории, где выполняется команда packer, необходимо создать файл с конфигурацией в формате json. Назовем этот файл ami-base.json. Содержание файла представлено ниже.
{ "variables": { "name": "my-ami", "source_ami": "ami-4b7d572e", "access_key":"", "secret_key":"", "region":"us-east-2" }, "builders": [ { "type": "amazon-ebs", "access_key": "{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "ami_name": "{{user `name`}}", "region": "{{user `region`}}", "source_ami": "{{user `source_ami`}}", "instance_type": "t2.micro", "communicator": "ssh", "ssh_username": "myself", "run_tags":{"Name":"packer-image"}, "force_deregister": true, "force_delete_snapshot": true } ], "provisioners": [ { "type": "shell", "inline": "/usr/bin/sudo /usr/sbin/useradd -p $(openssl passwd -1 SOMEPASSWORD) ansibled -s /bin/bash -m -G sudo" }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/echo 'ansibled ALL=(ALL) NOPASSWD:ALL' | /usr/bin/sudo EDITOR='tee -a' visudo"] }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/mkdir /home/ansibled/.ssh"] }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/chown ansibled:ansibled /home/ansibled/.ssh"] }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/chmod 700 /home/ansibled/.ssh"] }, { "type": "file", "source": "./authorized_keys", "destination": "/tmp/authorized_keys" }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/mv /tmp/authorized_keys /home/ansibled/.ssh/authorized_keys"] }, { "type": "shell", "inline": ["/usr/bin/sudo /bin/chown ansibled:ansibled /home/ansibled/.ssh/authorized_keys"] } ] }
Давайте, разберем содержимое файла. В блоке variables мы задаем переменные, которые далее используем в процессе обработки конфигурации. Переменные access_key и secret_key оставили пустые, так как их укажем при выполнении Packer в коммандной строке.
Блок builders определяет то, где мы создаем образ операционной системы, а также параметры взаимодействия с конкретным провайдером инфраструктуры. В данном случае мы взаимодействуем с AWS. Тут мы прописываем настройки аутентификации, тип EC2 инстанса и прочие параметры, которые считаем необходимыми при создании виртуальной машины.
И завершающий блок — provisioners, определяет те действия, которые мы производим над начальным образом операционнной системы. Конкретно в нашем примере, мы создаем нового пользователя в системе, добавляем ssh ключ, настраиваем безпарольный доступ для sudo.
Теперь выполним команду, которая обработает конфигурацию, подключится к облаку AWS и создаст нужный нам образ.
#packer build -var 'access_key=SOMEACCESSKEY' -var 'secret_key=SOMESECRETKEY' ami-base.json
В результате выполнения команды, мы получим образ AMI с номером в облаке AWS, настроенный в соответствии с нашими инструкциями. После этого, мы можем использовать этот AMI уже в Terraform, Vagrant или AWS CLI.
Заключение
Эта статья знакомит читателей с одним из must have инструментов сисадмина и девопса. Packer очень простой сам по себе. Он занимается решением строго одной задачи. Но делает это в совершенстве. Точно так же, как мы в статье рассмотрели создание образа для AWS, мы можем создавать образы и в среде VMware или Azure.