Задача:

  • Project 5 – Разворачивание веб сайта на базе контейнеров Docker
    • Проект должен быть выполнен средствами Ansible
    • Используйте папку project_5
    • В качестве плейбука используйте файл playbook_5.yml в каталоге project_5
    • Проект должен включать в себя все необходимые действия по установке Docker
    • Проект должен включать в себя все необходимые действия по развертыванию сервера баз данных MySQL (MariaDB), реверс-прокси Nginx и веб сервера Apache с поддержкой PHP и MySQL (MariaDB) на Docker
      • Проект должен включать в себя все необходимые действия по развертыванию сайта на контейнере Docker из Git репозитория заказчика.
        • Сайт должен быть доступен по протоколам http и https
      • Проект должен включать в себя все необходимые действия по импорту базы данных из дампа базы данных заказчика
      • Все используемые пароли должны быть выделены в отдельные переменные и зашифрованы

Вариант реализации:

ANS:

  • Из под пользователя user переходим в директорию /opt/ansible:
cd /opt/ansible
  • Создаём первый playbook_5.yml в директории project_5:
vim project_5/playbook_5.yml
    • Содержимое playbook_5.yml:
      • в переменную git_repo_url - нужно поместить репозиторий заказчика;
      • переменные db_root_password и db_user_password - определены в файле /opt/ansible/include_vars/passwords.yml и зашифрованы с помощь ansible-vault (пароль prof);
      • сертификаты в первом Play - забираются с RTR на ANS в директорию /opt/ansible/project_5/file/;
---
- name: We take the certificate and the private key from the RTR
  hosts: rtr
  become: true

  tasks:
    - name: We take the certificate and the private key from the RTR
      ansible.builtin.fetch:
        src: "/opt/ca/{{ item }}"
        dest: "file/{{ item }}"
        flat: true
      with_items:
        - "site.company.prof.crt"
        - "site.company.prof.key"

- name: Project 5 – Deploying a website based on Docker containers
  hosts: Redos
  become: true

  vars:
    git_repo_url: "https://github.com/NewErr0r/preparation_company.prof.git"

  tasks:
    - name: Include vars
      ansible.builtin.include_vars:
        dir: /opt/ansible/include_vars

    - name: Install docker
      ansible.builtin.dnf:
        name: 
          - docker-ce
          - python3-docker
        state: present

    - name: Adding a user to a docker group
      ansible.builtin.user:
        name: user
        group: docker
        state: present

    - name: Started and enabled docker
      ansible.builtin.systemd:
        name: docker
        enabled: true 
        state: started
       
    - name: Install Git
      ansible.builtin.dnf:
        name: git
        state: present
        update_cache: true

    - name: "Git clone repo {{ git_repo_url }}"
      ansible.builtin.git:
        repo: "{{ git_repo_url }}"
        dest: /opt/www
        update: false

    - name: Creating the necessary directory structure
      ansible.builtin.file:
        path: "/opt/{{ item }}"
        state: directory
        recurse: true
        group: "{{ ansible_ssh_user }}"
        owner: "{{ ansible_ssh_user }}"
      with_items: 
        - mariadb
        - nginx
        - ssl

    - name: Copying the database dump file from /opt/www to /opt/mariadb
      ansible.builtin.copy:
        src: /opt/www/test_db.sql.gz
        dest: /opt/mariadb/
        group: "{{ ansible_ssh_user }}"
        owner: "{{ ansible_ssh_user }}"
        remote_src: yes

    - name: Docker run container mariadb for database
      community.docker.docker_container:
        name: mariadb
        image: mariadb:11.2
        hostname: mariadb
        ports:
          - "3306:3306"
        volumes:
          - /opt/mariadb/:/docker-entrypoint-initdb.d/
        env:
          MARIADB_ROOT_PASSWORD: "{{ db_root_password }}"
          MARIADB_USER: "user"
          MARIADB_PASSWORD: "{{ db_user_password }}"
          MARIADB_DATABASE: "test_db"
        restart_policy: always

    - name: Copy Dockerfile for Apache2
      ansible.builtin.copy:
        src: file/Dockerfile_apache
        dest: /opt/www/Dockerfile
        group: "{{ ansible_ssh_user }}"
        owner: "{{ ansible_ssh_user }}"

    - name: Docker build image apache for web-server
      community.docker.docker_image:
        build:
          path: /opt/www
        name: apache
        source: build

    - name: Docker run container apache for web-server
      community.docker.docker_container:
        name: apache
        image: apache
        hostname: apache
        ports:
          - "8080:8080"
        volumes:
          - /opt/www/:/var/www/html
        restart_policy: always

    - name: Copy SSL Certificates in /opt/ssl
      ansible.builtin.copy:
        src: "file/{{ item }}"
        dest: /opt/ssl
        group: "{{ ansible_ssh_user }}"
        owner: "{{ ansible_ssh_user }}"
      with_items:
        - "site.company.prof.crt"
        - "site.company.prof.key"

    - name: Copy file site.conf by container nginx in /opt/nginx
      ansible.builtin.copy:
        src: file/nginx_site.conf
        dest: /opt/nginx/site.conf
        group: "{{ ansible_ssh_user }}"
        owner: "{{ ansible_ssh_user }}"

    - name: Docker run container nginx for reverse-proxy-server
      community.docker.docker_container:
        name: nginx
        image: nginx:1.27
        hostname: nginx
        expose:
          - "80"
          - "443"
          - "8433"
        ports:
          - "80:80"
          - "443:443"
          - "8443:8443"
        volumes:
          - /opt/ssl/:/etc/ssl/private/
          - /opt/nginx/:/etc/nginx/conf.d/
        restart_policy: always
  • Устанавливаем необходимые для работы ansible - коллекции:
    • из под пользователя user
ansible-galaxy collection install community.docker
  • Создаём директорию для хранения файлов для данного проекта:
mkdir project_5/file
  • Создаём Dockerfile для сборки образа веб-сервера Apache2:
vim project_5/file/Dockerfile_apache
    • Содержимое:

  • Создаём конфигурационный файл для обратного-прокси-сервера используя Nginx:
vim project_5/file/nginx_site.conf
    • Содержимое:

  • Таким образом, получается следующая структура для project_5:

  • Выполняем запуск playbook-сценария:
    • передаём параметр для запроса пароля на дешифрование файла с паролями;
ansible-playbook project_5/playbook_5.yml --ask-vault-pass
      • передаём пароль - prof:

      • Результат:

  • Проверяем на удалённом сервере запущенные контейнеры:

  • Проверяем работоспособность контейнера веб-сервера Apache2 на порту 8080:

  • Проверяем работоспособность обратного-прокси сервера на Nginx - на порту 80:

  • Проверяем работоспособность обратного-прокси сервера на Nginx - на порту 443:

  • Проверяем работоспособность обратного-прокси сервера на Nginx - на порту 8443:

Последнее изменение: четверг, 4 июля 2024, 18:17