Задание:

a) Реализуйте следующий функционал на инстансах Cloud-HA01 и Cloud-HA02:

  • i. Установить и настроить HAProxy:
    • 1. Настроить frontend для прослушивания портов 80 (HTTP) и 443 (HTTPS);
    • 2. Настроить backend с балансировкой между веб-серверами Cloud-WEB01 и Cloud-WEB02, с использованием сети Internal-Net;
    • 3. Использовать алгоритм балансировки round-robin;
    • 4. При обращении на IP-адреса Cloud-HA01 и Cloud-HA02 из сети Management-Net с инстанса Cloud-ADM, как на порт 80 так и на порт 443, должно выводиться содержимое веб-приложения развёрнутого на Cloud-WEB01 и Cloud-WEB2, в случае обращения на порт 443 у Cloud-ADM не должно возникать никаких проблем с сертификатами (не допускается использование «Добавления исключений»).

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

Cloud-ADM:

  • Вся дальнейшая работа реализуется в контексте директории /home/altlinux/bin/ansible:
cd /home/altlinux/bin/ansible
  • Создадим файл 'haproxy_deploy_playbook.yml', в котором последовательно будем описывать всё что касается настройки серверов Cloud-HA01 и Cloud-HA02 в контексте данного задания:
vim haproxy_deploy_playbook.yml
    • Добавляем следующее содержимое:
      • см. комментарии в коде;
---
- name: Install HAProxy
  hosts: ha
  become: true

  tasks:
    # Установка пакета "haproxy"
    - name: Install HAProxy
      community.general.apt_rpm:
        name: haproxy
        state: present
        update_cache: true
    
    # Копирование конфигурационного файла 'haproxy.cfg' из шаблона
    - name: Copy file 'haproxy.cfg'
      ansible.builtin.template:
        src: templates/haproxy.cfg.j2
        dest: /etc/haproxy/haproxy.cfg
      notify:
        - Restarted HAProxy

    # Копирование сертификата для haproxy
    - name: Copy certificate for HAProxy
      ansible.builtin.copy:
        src: files/www.pem
        dest: /var/lib/ssl/www.pem
      notify:
        - Restarted HAProxy

    # Запуск и добавление в автозагрузку haproxy
    - name: Started and enabled HAProxy
      ansible.builtin.systemd:
        name: haproxy
        state: restarted
        enabled: true

  handlers:
    - name: Restarted HAProxy
      ansible.builtin.systemd:
        name: haproxy
        state: restarted
  • В директории templates создаём файл шаблона "haproxy.cfg.j2":
vim templates/haproxy.cfg.j2
    • и указываем следующее содержимое:
global
    log /dev/log daemon
    chroot      /var/lib/haproxy
    pidfile     /run/haproxy.pid
    maxconn     4000
    user        _haproxy
    group       _haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend http_front
    bind *:80
    bind *:443 ssl crt /var/lib/ssl/www.pem
    default_backend http_back

frontend pg_frontend
    bind *:5432
    mode tcp
    default_backend pg_backend

backend http_back
    balance roundrobin
    server cloud-web01 192.168.10.3:80 check
    server cloud-web02 192.168.10.4:80 check

backend pg_backend
    mode tcp
    balance leastconn
    option tcp-check
    server db_master 192.168.10.5:5432 check port 5432 inter 2s rise 2 fall 3
    server db_replica 192.168.10.6:5432 check port 5432 inter 2s rise 2 fall 3 backup
  • Создаём сертификат для haproxy:
openssl genrsa -out files/www.key 2048
openssl req -key files/www.key -new -out files/www.csr
cat <<EOF > files/www.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName=@alt_names
[alt_names]
DNS.1=www.au.team
IP.1=192.168.10.65
IP.2=192.168.10.66
IP.3=192.168.10.7
EOF
openssl x509 -req -CA ca.crt -CAkey ca.key -in files/www.csr -out files/www.crt -days 365 -CAcreateserial -extfile files/www.ext
cat files/www.key files/www.crt > files/www.pem
  • Запускаем playbook для настройки веб-серверов:
ansible-playbook haproxy_deploy_playbook.yml
    • Результат:

  • В файл /etc/hosts добавляем 2 записи на Cloud-ADM:

  • Приложение должно быть доступно по https://www.au.team а также выполнено подключение к БД:

  • При повторном обращении отрабатывает балансировка:

Последнее изменение: понедельник, 21 июля 2025, 15:27