Создаем образ ОС с Packer

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *