diff --git a/.gigacode/plans/nginx-ssl-preread.md b/.gigacode/plans/nginx-ssl-preread.md new file mode 100644 index 0000000..4cbd4f6 --- /dev/null +++ b/.gigacode/plans/nginx-ssl-preread.md @@ -0,0 +1,85 @@ +# План добавления SSL preread map в роль nginx + +## Описание задачи +Добавить поддержку создания stream-конфигураций с `ssl_preread` и `map` для маршрутизации TLS-трафика на основе SNI. + +## Текущая структура +- `tasks/nginx-stream.yml` - импортирует конфигурацию stream +- `templates/nginx-stream.j2` - шаблон stream-конфигурации +- `defaults/main.yml` - переменная `nginx_streams` с примерами + +## План реализации + +### 1. Обновить шаблон `templates/nginx-stream.j2` +Добавить поддержку двух типов stream-конфигураций: +- **Обычный proxy** (текущий функционал) +- **SSL preread map** (новый функционал) + +#### Для SSL preread map потребуется: +- `map` блок для сопоставления SNI-имён с upstream-ами +- `upstream` блоки для каждого target +- `server` блок с `ssl_preread on` и `proxy_pass $name` + +### 2. Обновить `defaults/main.yml` +Добавить пример stream-конфигурации с ssl_preread: +```yaml +nginx_streams: + - stream: HTTPS_ssl_preread + listen_port: 443 + type: ssl_preread + ssl_preread: + server_names: + - storagecat.ru: ocserv + default_target: https + upstreams: + - name: https + servers: + - 127.0.0.1:8443 + - name: ocserv + servers: + - 127.0.0.1:9443 + proxy_timeout: 4s + proxy_responses: 1 +``` + +### 3. Обновить `tasks/nginx-stream.yml` (при необходимости) +Проверить, что задача корректно обрабатывает оба типа stream-конфигураций. + +## Пример выходной конфигурации +``` +# Ansible Managed: DO NOT EDIT +# Конфигурация для HTTPS_ssl_preread + +map $ssl_preread_server_name $name { + storagecat.ru ocserv; + default https; +} + +upstream https { + server 127.0.0.1:8443; +} + +upstream ocserv { + server 127.0.0.1:9443; +} + +server { + listen 443; + ssl_preread on; + proxy_protocol on; + proxy_pass $name; + proxy_timeout 4s; + proxy_responses 1; +} +``` + +## Шаги реализации +1. Создать новый шаблон `templates/nginx-stream-ssl-preread.j2` +2. Обновить `templates/nginx-stream.j2` для поддержки обоих типов +3. Добавить пример в `defaults/main.yml` +4. Протестировать на примере из `playbooks/vm-balancer.yml` + +## Вопросы для уточнения +- [x] Формат данных: расширить текущую структуру nginx_streams +- [x] Обязательные параметры: server_names, upstream_name, default_target +- [x] Дополнительные параметры: proxy_timeout, proxy_responses, proxy_bind, proxy_connect_timeout diff --git a/playbooks/vm-balancer.yml b/playbooks/vm-balancer.yml index 0b3d68e..94d6977 100644 --- a/playbooks/vm-balancer.yml +++ b/playbooks/vm-balancer.yml @@ -57,6 +57,26 @@ - 10.203.2.11:123 - 10.203.2.12:123 + # Stream with SSL preread map + # - stream: HTTPS_ssl_preread + # listen_port: 443 + # type: ssl_preread + # ssl_preread: + # ssl_preread: true + # proxy_protocol: true + # server_names: + # - storagecat.ru: ocserv + # default_target: https + # upstreams: + # - name: https + # servers: + # - 127.0.0.1:8443 + # - name: ocserv + # servers: + # - 127.0.0.1:9443 + # proxy_timeout: 4s + # proxy_responses: 1 + nginx_virthosts: - virthost_name: gigacoms.ru listen: "80" diff --git a/roles/nginx/defaults/main.yml b/roles/nginx/defaults/main.yml index a4d6095..e82ffcf 100644 --- a/roles/nginx/defaults/main.yml +++ b/roles/nginx/defaults/main.yml @@ -188,6 +188,31 @@ nginx_robots_disallowed_uris_list: [] # List any options here, ending with ; # nginx_streams: [] + +# Stream example with SSL preread map +# nginx_streams: +# - stream: HTTPS_ssl_preread +# listen_port: 443 +# type: ssl_preread +# ssl_preread: +# ssl_preread: true +# proxy_protocol: true +# server_names: +# - storagecat.ru: ocserv +# default_target: https +# upstreams: +# - name: https +# servers: +# - 127.0.0.1:8443 +# - name: ocserv +# servers: +# - 127.0.0.1:9443 +# proxy_timeout: 4s +# proxy_responses: 1 +# proxy_connect_timeout: 30s +# responses: 1 +# timeout: 4s +# connect_timeout: 30s # Virtualhost example nginx_virthosts: [] # - virthost_name: '{{ ansible_fqdn }}' diff --git a/roles/nginx/templates/nginx-stream.j2 b/roles/nginx/templates/nginx-stream.j2 index b11d6ba..6077cdb 100644 --- a/roles/nginx/templates/nginx-stream.j2 +++ b/roles/nginx/templates/nginx-stream.j2 @@ -1,3 +1,52 @@ +{% if item.type == 'ssl_preread' %} +# Ansible Managed: DO NOT EDIT +# Конфигурация для {{ item.stream }} (SSL preread) + +{% if item.ssl_preread is defined and item.ssl_preread.server_names is defined %} +map $ssl_preread_server_name $name { +{% for mapping in item.ssl_preread.server_names %} +{% if mapping is string %} + {{ mapping }}; +{% else %} +{% for hostname, target in mapping.items() %} + {{ hostname }} {{ target }}; +{% endfor %} +{% endif %} +{% endfor %} + default {{ item.ssl_preread.default_target | default('https') }}; +} +{% endif %} + +{% if item.upstreams is defined %} +{% for upstream in item.upstreams %} +upstream {{ upstream.name }} { +{% for server in upstream.servers %} + server {{ server }}; +{% endfor %} +} +{% endfor %} +{% endif %} + +server { + listen {{ item.listen_port }}; +{% if item.ssl_preread is defined and item.ssl_preread.ssl_preread | default(false) %} + ssl_preread on; +{% endif %} +{% if item.ssl_preread is defined and item.ssl_preread.proxy_protocol | default(false) %} + proxy_protocol on; +{% endif %} + proxy_pass $name; +{% if item.responses is defined %} + proxy_responses {{ item.responses }}; +{% endif %} +{% if item.timeout is defined %} + proxy_timeout {{ item.timeout }}; +{% endif %} +{% if item.connect_timeout is defined %} + proxy_connect_timeout {{ item.connect_timeout }}; +{% endif %} +} +{% else %} # Ansible Managed: DO NOT EDIT # Конфигурация для {{ item.stream }} @@ -24,3 +73,4 @@ server { proxy_connect_timeout {{ item.connect_timeout }}; {% endif %} } +{% endif %} diff --git a/test-nginx-stream.yml b/test-nginx-stream.yml new file mode 100644 index 0000000..1dfe1b7 --- /dev/null +++ b/test-nginx-stream.yml @@ -0,0 +1,41 @@ +--- +- name: Test nginx stream template + hosts: localhost + gather_facts: false + vars: + nginx_streams: + - stream: HTTPS_ssl_preread + listen_port: 443 + type: ssl_preread + ssl_preread: + ssl_preread: true + proxy_protocol: true + server_names: + - storagecat.ru: ocserv + default_target: https + upstreams: + - name: https + servers: + - 127.0.0.1:8443 + - name: ocserv + servers: + - 127.0.0.1:9443 + proxy_timeout: 4s + proxy_responses: 1 + + tasks: + - name: Render nginx stream template + ansible.builtin.template: + src: roles/nginx/templates/nginx-stream.j2 + dest: /tmp/test-nginx-stream.conf + mode: '0644' + loop: "{{ nginx_streams }}" + loop_control: + loop_var: item + + - name: Display rendered config + ansible.builtin.debug: + var: item + loop: "{{ nginx_streams }}" + loop_control: + loop_var: item