Настройка веб-портала в центре обработки данных

ADM-HQ:

  • Находясь с требуемой директории с активированным виртуальным окружением создаём файл playbook1_keepalived.yml и описываем весь необходимый функционал:
cat << EOF > playbook1_keepalived.yml
- name: Install and settings keepalived for HA1-COD and HA2-COD
  hosts: proxy
  become: true

  tasks:
    - name: Install Keepalived
      community.general.apt_rpm:
        name: "keepalived"
        state: present
        update_cache: true

- hosts: ha1-cod
  become: true

  tasks:
    - name: Copy the 'keepalived.conf' file for MASTER
      ansible.builtin.template:
        src: templates/keepalived-master.conf.j2
        dest: /etc/keepalived/keepalived.conf
        owner: root
        group: root
        mode: '0644'

- hosts: ha2-cod
  become: true

  tasks:
    - name: Copy the 'keepalived.conf' file for BACKUP
      ansible.builtin.template:
        src: templates/keepalived-backup.conf.j2
        dest: /etc/keepalived/keepalived.conf
        owner: root
        group: root
        mode: '0644'

- hosts: proxy
  become: true

  tasks:
    - name: Started and enabled keepalived
      ansible.builtin.systemd:
        name: keepalived
        state: started
        enabled: true
EOF
  • Создаём директорию для шаблонов:
mkdir templates
  • Создадим сами шаблоны (в конце обязательно пустую строчку):
cat <<EOF > templates/keepalived-master.conf.j2
global_defs {
    enable_script_security
    max_auto_priority
}

vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}

vrrp_instance VI_1 {
  interface {{ keepalived_interface_name }}
  state MASTER

  virtual_router_id 51
  priority 101

  virtual_ipaddress {
    {{ keepalived_virtual_ipaddress }}
  }

  track_script {
    chk_haproxy
  }
}

EOF
Можно скопировать cp templates/keepalived-master.conf.j2 templates/keepalived-backup.conf.j2
и подправить (отличия выделены жирным)

cat <<EOF > templates/keepalived-backup.conf.j2
global_defs {
    enable_script_security
    max_auto_priority
}

vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}

vrrp_instance VI_1 {
  interface {{ keepalived_interface_name }}
  state BACKUP

  virtual_router_id 51
  priority 100

  virtual_ipaddress {
    {{ keepalived_virtual_ipaddress }}
  }

  track_script {
    chk_haproxy
  }
}

EOF
  • Создадим необходимые переменные (ens1 — интерфейс HA1-COD):
cat <<EOF > inventories/production/group_vars/proxy.yml
keepalived_interface_name: "ens1"
keepalived_virtual_ipaddress: "172.16.1.253/23"

EOF
  • Запускаем данный playbook:
ansible-playbook -i inventories/production/hosts playbook1_keepalived.yml 
  • Результат:

  • Проверить, наличие VirtualIP на HA1-COD:

  • Запускаем данный playbook повторно, все задачи должны быть OK

  • Находясь с требуемой директории с активированным виртуальным окружением создаём файл playbook2_web.yml и описываем весь необходимый функционал
cat <<EOF > playbook2_web.yml
---
- name: Install Angie Web Server
  hosts: server
  become: true
  
  tasks:
    - name: Install 'angie'
      community.general.apt_rpm:
        name: "angie"
        state: present
        update_cache: true
        
    - name: Copy index.html
      ansible.builtin.template:
        src: templates/index.html.j2
        dest: /usr/share/angie/html/index.html
        owner: root
        group: root
        mode: '0644'
     
    - name: Start and enable Angie
      ansible.builtin.systemd:
        name: angie
        state: started
        enabled: true

EOF
  • создаём необходимый шаблон :
cat <<EOF > templates/index.html.j2
<html>
   <head>
      <title>AU_Team</title>
   </head>
   <body>
      <h1>{{ ansible_facts['hostname'] }} by Angie!</h1>
   </body>
</html>

EOF
  • Запускаем данный playbook:
ansible-playbook -i inventories/production/hosts playbook2_web.yml 
  • Результат:

  • Проверяем доступность веб-серверов:

 

  • Запускаем данный playbook повторно, все задачи должны быть OK

  • Находясь с требуемой директории с активированным виртуальным окружением создаём файл playbook3_haproxy.yml и описываем весь необходимый функционал
cat <<EOF > playbook3_haproxy.yml
---
- name: Install and settings haproxy for HA1-COD and HA2-COD
  hosts: proxy
  become: true

  tasks:
    - name: Install package 'haproxy'
      community.general.apt_rpm:
        name: "haproxy"
        state: present
        update_cache: true

    - name: Copy the 'haproxy.cfg' file
      ansible.builtin.template:
        src: templates/haproxy.cfg.j2
        dest: /etc/haproxy/haproxy.cfg
        owner: root
        group: root
        mode: '0644'

    - name: Started and enabled haproxy
      ansible.builtin.systemd:
        name: haproxy
        state: started
        enabled: true

EOF
  • создаём необходимый шаблон (в конце обязательно пустую строчку):
cat <<EOF > templates/haproxy.cfg.j2
global
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    daemon

defaults
    log     global
    mode    http
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

frontend main
    bind {{ haproxy_frontend_bind_address }}:{{ haproxy_frontend_bind_port }}
    default_backend             app

backend app
    balance     roundrobin
    option httpchk GET /
    http-request set-header X-Forwarded-For %[src]
    http-request set-header X-Forwarded-Proto http
{% for record in haproxy_backend_add_hosts %}
    server {{ record.name }} {{ record.address }}:80 check
{% endfor %}

listen stats
    bind *:9000
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /haproxy_stats

EOF
  • Добавляем необходимые переменные с их значениями:
cat <<EOF >> inventories/production/group_vars/proxy.yml

haproxy_frontend_bind_address: "0.0.0.0"
haproxy_frontend_bind_port: "80"
haproxy_backend_add_hosts:
  - name: "srv1-cod"
    address: "172.16.1.1"
  - name: "srv2-cod"
    address: "172.16.1.2"
  - name: "srv3-cod"
    address: "172.16.1.3"

EOF
  • Запускаем данный playbook:
ansible-playbook -i inventories/production/hosts playbook3_haproxy.yml
  • Результат:

  • Проверить, что работает балансировщик:

 

Перейдем на сайт http://172.16.1.253:9000/haproxy_stats

 

  • Запускаем данный playbook повторно, все задачи должны быть OK

ADM-HQ:

  • Добавляем обратный прокси для безопасной публикации в рамках локальной сети:

    • заполняем форму Добавление правила публикации

  • Должно получиться следующее:
    • требуемое имя и автоматический редирект запросов с http на https

    • а также и корректный сертификат:

  • На DNS во FreeIPA добавляем CNAME запись следующего вида (CNAME www — fw-hq.au.team.):

В конце hostname ТОЧКА.

  • Результат:

Если сайт не грузится изменять запись в DNS