Почему 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)


  1. Dmitri-D
    29.05.2023 22:38

    CloudFormation? Нет, никогда не слышал. CDK? Тем более. CI/CD? не, никогда


    1. selivanov_pavel
      29.05.2023 22:38

      Ну это всё-таки гайд для новичков, чтобы они пощупали ec2 и ansible.


  1. Tamerlan666
    29.05.2023 22:38
    +3

    Вот этот таск особенно смешной получился:

    - name: change directory to the html directory
      shell: cd /var/www/html
    


  1. citius
    29.05.2023 22:38
    +2

    ключевой принцип DevOps — «автоматизировать все»

    > (всю статью тыкают мышкой в AWS).

    Оооок.


    1. mc2
      29.05.2023 22:38

      Статья для начинающих.