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.