Ansible-Roles/playbooks/vm-balancer.yml
2026-05-08 22:25:29 +03:00

227 lines
5.9 KiB
YAML

---
- name: Install balancer full
hosts:
- vm01-balancer
- vm02-balancer
roles:
- nginx
- zabbix-agent2
- firewall
- chrony
vars:
###### NGINX Configuration ######
nginx_worker_connections: 16384
nginx_use_epoll: true
nginx_multi_accept: "on"
nginx_selinux: false
pki_dir: /etc/nginx/certs
nginx_webroot: /var/www
local_http_port: 8080
nginx_letsencrypt_managed: true
letsencrypt_acme_install: true
letsencrypt_acme_certs_dir: /etc/letsencrypt/live
nginx_conf_snippets:
- nginx-compression.conf
- nginx-proxy-params.conf
- nginx-server-ssl.conf
# - nginx-websockets.conf
# - nginx-browser-cache.conf
# - letsencrypt-proxy.conf
# - nginx-cors.conf
nginx_streams:
- stream: DNS_udp
listen_port: 53
protocol: udp
transparent: true
responses: 1
timeout: 3s
backends:
- 10.203.2.11:53
- 10.203.2.12:53
- stream: DNS_tcp
listen_port: 53
protocol: tcp
transparent: true
responses: 1
timeout: 3s
backends:
- 10.203.2.11:53
- 10.203.2.12:53
- stream: NTP
listen_port: 123
protocol: udp
responses: 1
backends:
- 10.203.2.11:123
- 10.203.2.12:123
nginx_virthosts:
- virthost_name: gigacoms.ru
listen: "80"
server_name: gigacoms.ru
server_aliases: "www.gigacoms.ru"
# index: index.php
# error_page: /path_to_error_page.html
ssl_enabled: true
ssl_only: true
ssl_letsencrypt_certs: "{{ nginx_letsencrypt_managed }}"
# root: "{{ nginx_webroot }}"
server_tokens: "off"
proxy_standard_setup: true
proxy_additional_options:
- proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache:30m max_size=250m;
locations:
- location: /
target: "http://10.203.2.251:80"
###### Zabbix agent configuration ######
agent_package_state: present # present or latest
# agent_2_plugin_list: ['named'] # set in inventory vars
agent_apply_firewalld_rule: auto # force or auto
###### Firewalld configuration ######
firewall:
# - previous: replaced # flush previous rules
- zone: internal
state: enabled
permanent: true
service:
- ssh
- zabbix-agent
- ntp
- dns
- http
- https
port:
- '10050/tcp'
source:
- 10.200.0.0/16
- 10.202.0.0/16
- 10.203.0.0/16
- 91.218.87.192/26
- zone: internal
state: disabled
permanent: true
service:
- cockpit
- dhcpv6-client
- mdns
- samba-client
- zone: public
state: enabled
permanent: true
service:
- ntp
- dns
- http
- https
- zone: public
state: disabled
permanent: true
service:
- ssh
- cockpit
- dhcpv6-client
- mdns
- samba-client
- set_default_zone: internal
state: enabled
permanent: true
- interface: ens192
zone: internal
state: enabled
permanent: true
- interface: ens224
zone: public
state: enabled
permanent: true
###### chrony-client ######
chrony_disable_ntpd: true
chrony_enable: true
# Moved to inventory vars
handlers:
- name: Reload firewalld
ansible.builtin.service:
name: firewalld
state: reloaded
- name: Restart nginx-transparent-route
ansible.builtin.systemd:
name: nginx-transparent-route
state: restarted
daemon_reload: true
post_tasks:
- name: Включить ip_nonlocal_bind для transparent proxy
ansible.posix.sysctl:
name: net.ipv4.ip_nonlocal_bind
value: "1"
sysctl_file: /etc/sysctl.d/50-nginx-transparent.conf
reload: true
- name: Добавить таблицу 200 в rt_tables для local route
ansible.builtin.lineinfile:
path: /etc/iproute2/rt_tables
line: "200\tnginx-transparent"
regexp: "^200\\s"
owner: root
group: root
mode: "0644"
create: true
- name: Установить systemd unit nginx-transparent-route
ansible.builtin.copy:
dest: /etc/systemd/system/nginx-transparent-route.service
owner: root
group: root
mode: "0644"
content: |
[Unit]
Description=Local route for nginx transparent proxy return path
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ip rule add fwmark 100 table 200 priority 200
ExecStart=/usr/sbin/ip route add local 0.0.0.0/0 dev lo table 200
ExecStop=/usr/sbin/ip rule del fwmark 100 table 200 priority 200
ExecStop=/usr/sbin/ip route flush table 200
[Install]
WantedBy=multi-user.target
notify: Restart nginx-transparent-route
- name: Включить и запустить nginx-transparent-route
ansible.builtin.systemd:
name: nginx-transparent-route
enabled: true
state: started
daemon_reload: true
- name: Маркировать входящие DNS-ответы от бэкендов (PREROUTING)
ansible.builtin.command:
cmd: >
firewall-cmd --permanent --direct --add-rule
ipv4 mangle PREROUTING 0
-s 10.203.2.0/24 -p {{ item }} --sport 53
-j MARK --set-mark 100
loop:
- udp
- tcp
register: fwd_result
changed_when: "'ALREADY_ENABLED' not in fwd_result.stderr"
notify: Reload firewalld