Оглавление
- Жизнь перед контейнерами
- Представление операционного ящика
- Зачем использовать контейнер
- Построение изображения контейнера Docker
- Запуск контейнера
- Удаление на выходе
- Тома
- Рабочий каталог
- Переменные среды
- Использование Ansible внутри контейнера
Как человек, который фокусируется на разработке систем, а не на разработке приложений, я не видел, как контейнеры будут вписаться в мой ежедневный рабочий процесс. Но я был недоволен своим текущим опытом разработки и хотел посмотреть, смогут ли контейнеры улучшить его. Это было очень тяжело и медленно. В то время у меня была целая бродяка, состоящая из двух виртуальных машин Linux и одной виртуальной машины Windows. Vagrant будет встать на сервер управления Ansible и две целевые машины; Один окна и один Linux для запуска пейзажных книг.
После того, как я закончил разработку книги, которые я должен был; Сделайте это, нажмите, SSH куда -то еще, потяните его, затем запустите снова. Если бы мне пришлось отлаживать это, я использовал VI. Нет, чтобы спасти меня от белого пространства, а я собирался войти. И иногда я забыл обновить другие среды Ansible, и мой код потерпит неудачу. Это был … своего рода кошмар и заставил меня задуматься, почему я беспокоился с Ansible. Я хотел лучшего рабочего процесса. Нет, мне нужен был лучший рабочий процесс.
Резюме страданий
- Очень тяжелый и медленный, чтобы восстановить среду развития.
- Невозможно использовать IDE за пределами лабораторной среды.
- Много
- Неудовлетворенная убедительная среда
- Я: Q.
Я использовал контейнеры раньше. Главным образом для создания лабораторных сред для таких приложений, как TeamCity и OctopusDeploy. В основном вещи, которые уже имели солидные базовые изображения. Я не рассматривал их использование в качестве замены для моей среды разработки. Пока однажды коллега не поделился этой статьей Ansible, AWS CLI и Kubectl в портативном Docker Opsbox . Это познакомило меня с идеей операционного ящика или Opsbox.
В статье рассказывается о том, как они написали Dockerfile с инструкциями о том, как настроить среду разработки. Которые для них были инструменты AWS CLI, Ansible, и в то время Kubectl AWS для Kubernetes. Я подумал: «Ну, мне пока не нужны вещи AWS и Kubectl. Что если я напишу свое? » Так я и сделал. Это не заняло слишком много времени, пока я не столкнулся с проблемой. Я вложил ошибку, которую я попал в свой командный чат, и попросил помощи. Забавно, один член команды спросил: «Что ты пытаешься сделать?» Я сказал: «Построение изображения Docker, которое имеет в нем Ansible», на который он ответил: «О, я уже сделал это». После использования контейнера для Ansible Development в течение примерно двух минут я начал евангелизировать его.
Зачем использовать контейнер
Моя любимая часть использования контейнера — это возможность установить в него объем с моей местной машины. Это означает, что я могу поделиться ответным хранилищем и внести изменения непосредственно в пьесы без необходимости совершать, толкать, подталкивать код. Я могу просто внести изменения и запустить пьесы против среды Dev, прежде чем подтолкнуть их к конвейеру выпуска. Теперь первый действительный вопрос здесь: «Почему бы просто не установить Ansible на ваш ноутбук для локальной разработки?» Отличный вопрос, ответ — моя вторая любимая часть. Использование контейнера вместо моего ноутбука означает, что вся моя команда имеет постоянную среду разработки, и мы с большей вероятностью сталкиваемся с одними и теми же проблемами, и когда мы сталкиваемся с этими проблемами, и исправляет их, это решает проблему для всей команды.
Другая причина, по которой я предпочитаю контейнер, заключается в том, что он отделяет общепринятую среду из целевой среды. Целевая среда в этом контексте представляет собой кластер серверов, как правило, в одном и том же домене активного каталога, на который нацелен Ansible. В системном администрировании обычной практикой является воспроизведение всех компонентов инфраструктуры на окружающую среду. Портативность контейнера доказала, что нам не нужно это делать. Что в конце концов дало нам меньше вещей для управления, обновления и исправления. Это сокращение накладных расходов управления приводит к гораздо более стабильной и последовательной среде.
Последнее удивительное преимущество, которое я упоминаю об использовании контейнера, — это возможность легко воссоздать вашу среду разработки в считанные секунды. Вы даже работали над какой -то автоматизацией, и она работает повсюду, кроме как с одной конкретной машины? В результате вы заворачиваете рукава и начинаете отладки, используя модель OSI в качестве руководства по устранению неполадок. Примерно через час вы понимаете, что это какая -то странная проблема с средой с машиной, с которой вы ее запускаете. Это еще одно преимущество использования контейнера. Поскольку контейнер неизменен, если я теперь сталкиваюсь с странной проблемой DNS, я просто выхожу из контейнера, который удаляет его для меня и запускаю новый. Мой первый шаг устранения неполадок сейчас — обновить мою среду разработки, чтобы она была максимально чистой.
Краткое изложение льгот
- Последовательный опыт развития для вас и вашей команды
- Отключает обезболивающую среду из целевой среды.
- Портативность уменьшает накладные расходы управления
- Неизменное управляет изменчивым
Общие вопросы
Почему бы не установить Ansible локально? Зачем использовать контейнер?
- Контейнеры предлагают постоянную среду для всей моей команды.
Как насчет производственной среды? Конечно, вы не запускаете все вручную?
- После того, как изменения протестируются против среды разработки, запрос на тягу отправляется и объединяется. В этот момент трубопровод высвобождения отвечает за внедрение изменения в инфраструктуру. Этап развертывания этого конвейера выпуска использует тот же изображение контейнера, что и в среде разработки. Сохраняя два одинаковых.
Как вы управляете изменениями в Dockerfile и контейнере?
- Вытащить запросы
Остальная часть этого поста в блоге проведет вас через то, как настроить Opsbox для Ansible Development против Azure Resources. Эта идея может быть принята и применена к любой другой инфраструктуре в качестве инструмента кода. Будь то терраформ, AWS, VMware, PowerCli и т. Д… Есть два основных компонента; Инструмент и платформа. Вам просто нужно построить контейнер, чтобы соответствовать требованиям окружающей среды.
Построение изображения контейнера Docker
Чтобы создать изображение контейнера, вы впервые начинаете с DockerFile. DockerFile — это набор инструкций, которые Docker использует для построения слоев изображения контейнера. Я понимаю, что это может быть неизведанной территорией для некоторых, но на самом деле это не так отличается от сценария начальной загрузки или конфигурации для виртуальной машины.
ИЗ
DockerFile начинается с объявления базового изображения для использования. Так же, как когда вы создаете новую виртуальную машину с золотого изображения. Это основа контейнера. Ansible работает по нескольким различным распределению Linux, но для этой статьи я выбрал Centos. Первая строка будет читать От centos: centos7.4.1708 Анкет Вы заметите, что в этом есть больше, чем просто имя распределения. Также включена версия, которая в терминах Docker называется тегом. Я использую тег для версии заблокировать изображение базового контейнера.
FROM centos:centos7.4.1708
БЕЖАТЬ
Docker строит изображение в слоях. Не вдаваясь в подробности, важно иметь базовое понимание. Каждая команда в DockerFile, например, от и запуска каждый создает слой для изображения контейнера. Чтобы уменьшить количество слоев и сложности изображения, это общепринято, чтобы выпускать несколько команд в течение одного запуска, как показано ниже. На этом этапе у меня есть базовое изображение или операционная система, если хотите, и теперь мне нужно установить все, что необходимо для Ansible.
- Установить обновления
- Установите несколько пакетов разработки GCC, Libffi-Devel, Python-Devel, Epel-Release
- Установите Python-PIP и Python-Wheel
- Обновление PIP
RUN yum check-update; \ yum install -y gcc libffi-devel python-devel openssl-devel epel-release; \ yum install -y python-pip python-wheel; \ pip install --upgrade pip;
Поскольку я создаю контейнер Docker, который будет управлять ресурсом Azure, мне также нужен пакет Ansible [Azure] PIP. Как видите, это на своей линии. Когда я включил в предыдущие команды, я получаю ошибки, указывающие, что PIP не работает правильно. Причина в том, что он не был полностью установлен. Перемещение его в другую линию решило проблему, потому что PIP доступен в нижнем уровне.
RUN pip install ansible[azure];
Dockerfile
FROM centos:centos7.4.1708 RUN yum check-update; \ yum install -y gcc libffi-devel python-devel openssl-devel epel-release; \ yum install -y python-pip python-wheel; \ pip install --upgrade pip; RUN pip install ansible[azure];
Создайте изображение контейнера
Последний шаг в создании изображения Docker — запустить Docker Build командование Вы можете считать это шагом компиляции. У меня кодифицирован мой контейнер в Dockerfile, теперь мне нужно запустить его, чтобы создать изображение, которое будущие контейнеры будут использовать при запуске. Docker Build Команда используется для построения изображения.
-t это параметр, который помечает изображение, по сути, дает ему имя. Часть после параметра тега имеет три раздела Репозиторий/ImageName/Taggersion Анкет Разрушение этого Даффи — это название моего репозитория Dockerhub, AnsibleOpsbox — это название изображения, а 1.0 — это тег, указывающий версию. На каждом конце вы видите Анкет Это путь к DockerFile, который содержит инструкции по созданию изображения, Анкет означает текущий каталог.
docker build -t duffney/ansibleopsbox:1.0 .
Подтолкнуть изображение в реестр
На этом этапе у вас есть изображение на местной машине и вы можете запускать контейнеры, но как насчет ваших товарищей по команде? Чтобы другие могли использовать только что созданное вами изображение, вам придется загрузить изображение контейнера в реестр. Это может быть общественный реестр, такой как Dockerhub или частный реестр, использующий что -то вроде реестра контейнеров или артефактов Azure, для размещения репозитория для вас. Ниже приведен пример того, как подтолкнуть изображение в Dockerhub. Имя пользователя Duffney используется для загрузки его в мою учетную запись Dockerhub. Я уже подключил Docker Desktop к Dockerhub на своем ноутбуке, который заботится обо всей аутентификации и т. Д.
docker push duffney/ansibleopsbox:1.0
Запуск контейнера
Пришло время начать запускать контейнеры! Взаимодействие с контейнером немного отличается от виртуальных машин. Вместо SSH и WinRM или RDP вы взаимодействуете с ними через команды Docker. Команда Docker для запуска нового контейнера — это Docker Run Анкет По умолчанию контейнеры запускаются отделенными, что означает в фоновом режиме. Чтобы изменить это поведение, вы можете добавить -it Аргумент после команды Docker Run, который указывает на контейнер, будет выполнен интерактивно И ваша командная строка изменится. В конце команды вы должны указать, какое изображение вы хотите использовать для контейнера. Что в этом примере Duffney/ansibleopsbox: последний Анкет Заметил, что я использовал метку Последний не 1.0 Анкет Если вы не хотите менять версию каждый раз, когда вы можете использовать этот тег.
Docker Run- Docker CMD для запуска контейнера
-Это- Переключаются в интерактивный режим терминала
Duffney/ansibleopsbox: последний- Изображение Docker и тег для использования для контейнера
docker run -it duffney/ansibleopsbox:latest
Удаление контейнера на выходе
Используя команду Docker Run, как будет работать, но это приведет к гигантскому беспорядку на вашей машине. Поскольку команда сейчас находится каждый раз, когда вы выходите из контейнера, она будет оставаться в вашей системе в остановленном состоянии. Затем у вас есть возможность запустить его и повторно ввести интерактивный терминал, но почему это делает это, когда вы можете просто использовать новый? Чтобы помешать беспорядку добавить --RM Аргумент в команду Docker Run. —RM автоматически удалить контейнер при выходе.
--RM- Автоматически удалить контейнер, когда он выходит
docker run -it --rm duffney/ansibleopsbox:latest
Тома
Объемы — это то, что делает контейнер такой фантастической средой разработки. Объемы позволяют установить локальный каталог в каталог внутри контейнера. С монтированным объемом вы можете вносить изменения локально из своей машины разработки, используя свой выбор IDE. Эти изменения затем отражаются внутри контейнера! Чтобы установить объем внутри контейнера, вы добавляете еще один аргумент в команду Docker Run. Аргумент -v Затем последует Sourcepath: TargetPath . Sourcepath — это место на вашем машине разработки, которую вы хотите установить в контейнер. TargetPath — это место внутри контейнера, который вы хотите установить объем.
-v "$ (pwd)":/sln- Собирает текущий рабочий каталог/SLN внутри контейнера.
docker run -it --rm -v "$(pwd)":/sln duffney/ansibleopsbox:latest
Рабочий каталог
Одним из небольших неудобств, введенных путем монтажа тома, вы должны перейти на /sln каталог после запуска контейнера. Это неудобство, легко решаемое, используя еще один аргумент для команды Docker Run. Аргумент -w который указывает рабочий каталог для контейнера при запуска. Это изменяет местоположение интерактивной подсказки на значение, приведенное параметру.
-W/SLN- Определяет рабочий каталог/SLN
docker run -it --rm -v "$(pwd)":/sln -w /sln duffney/ansibleopsbox:latest
Переменные среды
Неизбежно вам придется что -то аутентифицировать подлинность. В случае Ansible вам, вероятно, придется аутентификация на инфраструктурную платформу. Такие, как Azure, AWS, VMware и т. Д. Ансибл использует конкретные переменные среды для подключения к этим платформам при запуске пейзажных книг. Использование переменных среды для хранения этой информации очень удобно и может быть заполнено Docker.
Docker предлагает несколько способов заполнить переменные среды. Один из способов — пройти их во время выполнения с командой Docker Run. Я буду использовать Azure в качестве своей инфраструктурной платформы и подключиться к ней, мне придется указать четыре переменных среды; Azure_subscription_id, azure_client_id, azure_secret, azure_tenant. С помощью -e Опция, сопровождаемая именем переменной среды, а затем значением этой переменной я могу заполнить переменные среды для контейнера.
-e "Environment_variable_name =" - Народные переменные среды внутри контейнера
docker run -it -w /sln -v "$(pwd)":/sln --rm \ -e "AZURE_SUBSCRIPTION_ID=" \ -e "AZURE_CLIENT_ID= " \ -e "AZURE_SECRET= " \ -e "AZURE_TENANT= " \ duffney/ansibleopsbox:latest
Использование переменных среды — это лишь один из нескольких способов подключения к Azure от Ansible. Для получения дополнительной информации проверьте подключение к Azure с Ansible.
Подключение к Azure с Ansible
Джош Дафни ・ 18 декабря ’19 ・ 5 минут прочитал
Использование Ansible внутри контейнера
На этом этапе вам решать, как интегрировать контейнер Ansible в ваш рабочий процесс разработки. Два наиболее распространенных применения, которые я видел,-это запускает его в автономном терминале и запускает его в IDE с использованием интегрированного терминала, такого как VS-код. Каждый подход точно такой же с точки зрения использования контейнера. Вы будете взаимодействовать с Ansible в командной строке изнутри контейнера.
Лично для меня большая часть моего времени проводится с помощью интегрированного терминала с кодом VS. Причина в том, что я могу быстро отредактировать все файлы в монтированном томе со всем комфортом и гаджетами, доступными в коде VS. Тем не менее, бывают случаи, когда я запускаю контейнер в командной строке для выполнения или отладки Playbooks.
Общая среда
- Автономный терминал
- Интегрированный терминал в IDE (VS код)
Автономный терминал
Интегрированный терминал против кода
Дополнительное чтение и источники
QuickStart: установите Ansible на виртуальные машины Linux в Azure
Лучшие практики для написания Dockerfiles
Azure Container Registry
Docker Hub Зарегистрироваться
Я превратил этот пост в блог в первую главу электронной книги на Ansible! Вы можете получить первую главу бесплатно в стал Анкет
Оригинал: «https://dev.to/cloudskills/using-containers-for-ansible-development-2n9n»