Почему Ansible?
Независимо от вашей роли или целей автоматизации, Ansible может помочь показать свою ценность, объединить команды и обеспечить эффективность вашей организации. Ansible обеспечивает простую IT-автоматизацию, берет на себя повторяющиеся задачи и позволяет DevOps-командам заниматься более стратегической работой.
Задача:
В этом посте мы узнаем, как развернуть веб-сайт на нескольких экземплярах AWS EC2 с помощью плейбуков Ansible без установки сервиса на каждый сервер отдельно. Для этого воспользуемся возможностями автоматизации. Она необходима в практике DevOps, ведь ключевой принцип DevOps — «автоматизировать все».
Понадобятся:
Аккаунт AWS
Базовые знания Ansible и Ansible playbooks
Базовые знания Linux
Архитектура проекта
На изображении ниже показана эталонная архитектура нашего проекта.
Шаги
Шаг 1. Создайте пару групп безопасности в AWS VPC, сначала для нашего Ansible Control Master Server, а затем еще одну для узлов Ansible. Войдите в консоль AWS, выберите предпочитаемый регион, вернитесь в VPC и выберите группы безопасности на левой панели навигации как показано ниже:
Нажмите Create security group:
Укажите основные сведения о вашей группе безопасности, такие как имя и описание, и выберите VPC по умолчанию, как показано ниже:
В разделе Inbound Rules разрешите ssh из любого места для демонстрации и нажмите Create security group.
Теперь создадим еще одну группу безопасности, общую для всех трех узлов Ansible, на которых мы будем разворачивать веб-сервер.
В разделе Inbound Rules разрешите HTTP из любого места и разрешите SSH только из группы безопасности главного сервера и нажмите Create security group, как показано ниже:
Шаг 2. Теперь, когда мы создали обе группы безопасности, пришло время создать экземпляр Ansible master EC2.
Перейдите на панель инструментов EC2 и нажмите Launch instance:
Укажите имя для вашего EC2 Instance:
В разделе AMI выберите Amazon Linux 2023 AMI, который подходит для уровня бесплатного пользования:
В разделе Instance type выберите t2.micro, который предоставляет 1 vCPU, 1 Гб памяти, а также подходит для уровня бесплатного пользования.
Пара ключей (key pair) позволяет нам подключаться по ssh к экземпляру EC2. В этом разделе мы можем выбрать: использовать существующую или создать новую пару. Для этой демонстрации мы создадим новую пару ключей.
Укажите имя для новой пары ключей и нажмите Create key pair. Убедитесь, что вы сохранили эту пару ключей, так как вы можете загрузить ее только один раз.
Теперь отредактируйте настройки сети. Выберите VPC по умолчанию, выберите подсеть по вашему выбору или оставьте без предпочтений. Автоматическое назначение общедоступного IP-адреса должно быть включено, и в соответствии с безопасностью группы выберите существующую группу безопасности для сервера ansible-master, который мы создали в первом шаге.
Остальные настройки мы можем оставить по умолчанию и нажать на Launch instance.
Сообщение об успешном завершении показывает, что экземпляр EC2 завершен, теперь нажмите ссылку Connect to Instance, как показано ниже:
Теперь в окне Connect to Instance скопируйте следующие команды и вставьте их в свой терминал, чтобы подключиться к серверу по ssh:
chmod 400 devops.pem
ssh -i "devops.pem" ec2-user@ec2-52-90-115-27.compute-1.amazonaws.com
Выход терминала:
Шаг 3. Создайте пару ключей на мастер-сервере Ansible, которая будет использоваться для установления соединения между главным и узловым Ansible с помощью команды:
ssh-keygen -t rsa -b 2048
Шаг 4. Теперь, после создания пары ключей SSH, нам нужно импортировать открытый ключ в консоль EC2. Это позволит узлам Ansible использовать этот ключ для установления связи с главным сервером Ansible.
Скопируйте открытый ключ, выполнив следующие шаги, как показано в выводе:
Скопировав открытый ключ, перейдите в консоль управления EC2 и на левой панели навигации в разделе Network & Security выберите Key Pairs. Затем в разделе Actions нажмите Import key pair.
Укажите имя нового импортируемого ключа и вставьте открытый ключ из терминала. Затем нажмите Import key pair.
Шаг 5. Запустите Ansible Node Servers.
Теперь мы запустим три экземпляра EC2 для этой демонстрации.
Перейдите на панель инструментов EC2 и нажмите Launch instances.
Укажите имя и в поле Number of instances введите 3.
Выберите Amazon Linux 2023 AMI и тип экземпляра как t2.micro.
Здесь мы должны убедиться, что в паре ключей нам нужно выбрать ansible-public-key, который мы создали ранее в нашей демонстрации.
В настройках сети выберите VPC по умолчанию и включите автоматическое назначение общедоступного IP-адреса. Обязательно выберите существующую группу безопасности ansible-nodes-sg, которую мы создали в предыдущих шагах.
Оставьте остальные настройки по умолчанию и запустите экземпляры.
После успешного запуска мы можем просмотреть экземпляры и пометить их соответствующим образом, как показано ниже:
Шаг 6. Проверьте соединение между главным и узловым серверами Ansible.
Чтобы проверить соединение ssh между главным и рабочим/подчиненным узлами, мы войдем на главный сервер Ansible и возьмем частный IP-адрес первого узлового сервера из консоли как показано ниже:
Перейдите к терминалу главного сервера Ansible и введите следующую команду, как показано на снимке экрана ниже.
В приведенном выше выводе проверьте частный IP-адрес. Он должен быть тем же, что мы скопировали ранее из консоли AWS.
Таким же образом проверьте подключение между двумя другими серверами и главным сервером.
Примечание. Мы можем подключаться между главным сервером Ansible и всеми другими узлами. Следует отметить, что это соединение стало возможным благодаря самому SSH, а не Ansible, поскольку до сих пор мы не установили Ansible на главном сервере.
Шаг 7. Установите Ansible на главный сервер.
Сначала мы обновим наш главный сервер Ansible с помощью следующей команды:
sudo yum update -y
Поскольку мы используем Amazon Linux 2023 AMI, этапы установки будут отличаться от действий для Amazon Linux2 AMI.
Скопируйте и вставьте следующие команды для установки Ansible:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user
python3 -m pip install --user ansible
Выход:
Чтобы убедиться, что Ansible был успешно установлен, проверьте версию с помощью следующей команды:
Шаг 8. Создайте Ansible inventory-файл.
Ansible автоматизирует задачи на управляемых узлах или «хостах» в вашей инфраструктуре, используя список или группу списков, известную как Inventory. Вы можете передавать имена хостов в командной строке, но большинство пользователей Ansible создают inventory-файлы. В вашем inventory-файле перечислите управляемые узлы, которые вы хотите автоматизировать, с группами, чтобы вы могли запускать задачи автоматизации на нескольких хостах одновременно.
В inventory-файле вы можете организовать свои серверы в различные группы и подгруппы.
Давайте создадим inventory-файл на главном сервере Ansible с помощью следующей команды:
Sudo vi inventory
Создайте группу веб-серверов и введите под ней IP-адреса всех узловых серверов, как показано ниже:
Шаг 9. Создайте Ansible плейбук.
Ansible плейбук — это план задач автоматизации. Он представляет собой комплекс IT-действий, которые выполняются с ограниченным участием человека или без него. Ansible плейбуки выполняются сетом, группой или по классификации хостов, из которых состоит Ansible inventory-файл.
Давайте создадим плейбук на главном сервере Ansible в домашнем каталоге, где у нас также есть наш inventory-файл:
sudo vi website.yml
Как только файл будет открыт, вставьте код в файл плейбук. Вы можете найти ссылку на репозиторий GitHub в конце этого поста.
- name: deploy bootstrap-website
hosts: all
become: yes
become_user: root
tasks:
- name: update ec2 instance
yum:
name: "*"
state: latest
update_cache: yes
- name: install apache server
yum:
name: httpd
state: latest
- name: change directory to the html directory
shell: cd /var/www/html
- name: download web files from github
get_url:
url: https://github.com/mudasirhaji/website/raw/main/website.zip
dest: /var/www/html/
- name: unzip the zip folder
ansible.builtin.unarchive:
src: /var/www/html/website.zip
dest: /var/www/html
remote_src: yes
- name: copy webfiles from the website directory to the html directory
copy:
src: /var/www/html/website/
dest: /var/www/html
remote_src: yes
- name: remove the website directory
file:
path: /var/www/html/website
state: absent
- name: remove the website.zip folder
file:
path: /var/www/html/website.zip
state: absent
- name: start apache server, if not started
ansible.builtin.service:
enabled: yes
name: httpd
state: started
Перед запуском плейбука для установки нашего веб-сайта на сервер Apache давайте сначала проверим связь между мастером и всеми узлами с помощью команды Ansible:
ansible all --key-file ~/.ssh/id_rsa -i inventory -m ping -u ec2-user
Успешный вывод вышеуказанной команды должен выглядеть так:
Приведенный выше вывод, выделенный зеленым цветом, показывает, что мы можем подключаться к узлам с помощью Ansible.
Еще одна вещь, которую нужно сделать перед запуском нашего Ansible плейбука — это создать файл конфигурации Ansible, в котором мы укажем путь к нашей паре ключей, inventory-файлу и имени пользователя по умолчанию ec2-user, чтобы нам не нужно было упоминать его каждый раз, когда мы запускаем наш плейбук.
Чтобы создать тип файла конфигурации Ansible:
sudo vi ansible.cfg
После того как файл открыт, введите данные следующим образом:
[defaults]
remote_user = ec2-user
inventory = inventory
private_key_file = ~/.ssh/id_rsa
Сохраните файл и выйдите.
Шаг 10. Запустите плейбук для установки веб-сервера на серверы.
Чтобы запустить плейбук, введите следующую команду на главный сервер Ansible:
ansible-playbook website.yml
Выход:
В конце вывода вы можете увидеть, что все задачи успешно выполнены без каких-либо сбоев:
Мы можем это подтвердить, если обратимся к любому общедоступному IP-адресу узлового сервера из нашего браузера. Перейдите в консоль EC2 и скопируйте общедоступный IP-адрес сервера Ansible-node-1 следующим образом:
Затем вставьте публичный IP-адрес в свой браузер, и вы должны увидеть свой веб-сайт, как я вижу свой:
Таким же образом убедитесь, что деплой сайта прошел успешно и на других серверах.
Заключение
В этом посте мы узнали, как написать сценарий с помощью Ansible на экземпляре EC2 и развернуть веб-сайт на веб-сервере Apache на нескольких экземплярах EC2. Убедитесь, что вы очистили ресурсы в облаке AWS.
Используемые ресурсы
Ссылка на GitHub: https://github.com/mudasirhaji/website.git
Узнать больше про плейбуки и деплой с помощью Ansible можно в Слёрме на курсе «Ansible: Infrastructure as Code». Старт потока — 5 июня.
Записаться на курс ???? на нашем сайте.
Комментарии (5)
Tamerlan666
29.05.2023 22:38+3Вот этот таск особенно смешной получился:
- name: change directory to the html directory shell: cd /var/www/html
Dmitri-D
CloudFormation? Нет, никогда не слышал. CDK? Тем более. CI/CD? не, никогда
selivanov_pavel
Ну это всё-таки гайд для новичков, чтобы они пощупали ec2 и ansible.