--- - name: 'configure nginx tcp 443 forwarder' blockinfile: dest: '/etc/nginx/nginx.conf' block: | stream { # Get upstream $name rom TLS SNI Header map $ssl_preread_server_name $name { include /etc/nginx/map.conf.d/*.conf; } # Include upstream definitions include /etc/nginx/upstream.conf.d/*.conf; log_format stream_routing '$remote_addr [$time_local] ' 'with SNI name "$ssl_preread_server_name" ' 'proxying to "$name" ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; server { listen {{ public_ip }}:443; # Inspect TLS Headers ssl_preread on; # Proxy connection to upstream $name proxy_pass $name; # Log connection access_log /var/log/nginx/stream_443.log stream_routing; # If on send PROXY Protocol headers to EVERY upstream # servers. WARNING: It will break connection to upstreams # not configured to accept PROXY Protocol! proxy_protocol {{ 'on' if proxy_protocol else 'off' }}; } } delegate_to: 'reverse_proxy' notify: 'reload nginx' - name: 'configure nginx http 80 forwarder' lineinfile: dest: '/etc/nginx/nginx.conf' insertafter: '^http {' line: 'include /etc/nginx/http.conf.d/*.conf;' delegate_to: 'reverse_proxy' notify: 'reload nginx' - name: 'create configuration directories for sites' file: state: 'directory' dest: '/etc/nginx/{{ item }}' delegate_to: 'reverse_proxy' notify: 'reload nginx' loop: - 'http.conf.d' - 'map.conf.d' - 'upstream.conf.d' - name: 'configure http proxy for https redirect and acme challenge' template: src: 'http.conf.j2' dest: '/etc/nginx/http.conf.d/{{ ansible_hostname }}.conf' delegate_to: 'reverse_proxy' notify: 'reload nginx' - name: 'configure upstream server spec' copy: content: | upstream {{ ansible_hostname }}_https { server {{ hostvars|ip_from_inventory(ansible_hostname) }}:{{ "10443" if proxy_protocol else "443" }}; } dest: '/etc/nginx/upstream.conf.d/{{ ansible_hostname }}.conf' delegate_to: 'reverse_proxy' notify: 'reload nginx' - name: 'configure sni-upstream mapping' copy: content: | {% for server_fqdn in server_fqdns %} {{ server_fqdn }} {{ ansible_hostname }}_https; {% endfor %} dest: '/etc/nginx/map.conf.d/{{ ansible_hostname }}.conf' delegate_to: 'reverse_proxy' notify: 'reload nginx'