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 ТОЧКА.
- Результат:
- Проверяем доступ по https://www.au.team:
Если сайт не грузится изменять запись в DNS

















