Filip Pytloun | 78944bc | 2016-04-13 13:03:54 +0200 | [diff] [blame] | 1 | {%- from "haproxy/map.jinja" import proxy with context -%} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 2 | |
| 3 | global |
Filip Pytloun | 78944bc | 2016-04-13 13:03:54 +0200 | [diff] [blame] | 4 | log /dev/log local0 |
| 5 | log /dev/log local1 notice |
| 6 | chroot /var/lib/haproxy |
| 7 | stats socket {{ proxy.stats_socket }} mode 660 level admin |
| 8 | stats timeout 30s |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 9 | user haproxy |
Filip Pytloun | 78944bc | 2016-04-13 13:03:54 +0200 | [diff] [blame] | 10 | group haproxy |
| 11 | daemon |
| 12 | pidfile /var/run/haproxy.pid |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 13 | spread-checks 4 |
| 14 | tune.maxrewrite 1024 |
| 15 | tune.bufsize 32768 |
Filip Pytloun | 78944bc | 2016-04-13 13:03:54 +0200 | [diff] [blame] | 16 | maxconn 16000 |
Ales Komarek | c07297c | 2016-10-14 16:43:09 +0200 | [diff] [blame^] | 17 | {%- if salt['pkg.version']('haproxy')[:3] >= '1.6' %} |
Filip Pytloun | 4201b38 | 2016-09-09 12:21:18 +0200 | [diff] [blame] | 18 | # SSL options |
| 19 | ca-base /etc/haproxy/ssl |
| 20 | crt-base /etc/haproxy/ssl |
| 21 | tune.ssl.default-dh-param 2048 |
| 22 | ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS |
| 23 | ssl-default-bind-options no-sslv3 no-tls-tickets |
| 24 | ssl-default-server-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS |
| 25 | ssl-default-server-options no-sslv3 no-tls-tickets |
Ales Komarek | c07297c | 2016-10-14 16:43:09 +0200 | [diff] [blame^] | 26 | {%- endif %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 27 | |
| 28 | defaults |
| 29 | log global |
| 30 | mode http |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 31 | |
Filip Pytloun | 98f7a4f | 2016-09-19 14:07:24 +0200 | [diff] [blame] | 32 | maxconn {{ proxy.maxconn|default(8000) }} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 33 | option redispatch |
Filip Pytloun | 98f7a4f | 2016-09-19 14:07:24 +0200 | [diff] [blame] | 34 | retries {{ proxy.retries|default(3) }} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 35 | stats enable |
Filip Pytloun | 98f7a4f | 2016-09-19 14:07:24 +0200 | [diff] [blame] | 36 | |
| 37 | timeout http-request {{ proxy.get('timeout', {}).get('http-request','10s') }} |
| 38 | timeout queue {{ proxy.get('timeout', {}).get('queue', '1m') }} |
| 39 | timeout connect {{ proxy.get('timeout', {}).get('connect', '10s') }} |
| 40 | timeout client {{ proxy.get('timeout', {}).get('client', '1m') }} |
| 41 | timeout server {{ proxy.get('timeout', {}).get('server', '1m') }} |
| 42 | timeout check {{ proxy.get('timeout', {}).get('check', '10s') }} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 43 | |
Jiri Konecny | 371c6de | 2016-03-02 11:32:46 +0100 | [diff] [blame] | 44 | {%- if proxy.listen.admin_page is defined and proxy.listen.admin_page.user is defined %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 45 | |
| 46 | userlist STATSUSERS |
| 47 | group admin users admin |
| 48 | user {{ proxy.listen.admin_page.user }} insecure-password {{ proxy.listen.admin_page.password }} |
| 49 | user stats insecure-password {{ proxy.listen.admin_page.password }} |
| 50 | {# |
| 51 | {%- for listen_name, listen in proxy.get('listen', {}).iteritems() %} |
| 52 | {%- if listen.user is defined %} |
| 53 | user {{ listen.user }} insecure-password {{ listen.password }} |
| 54 | {%- endif %} |
| 55 | {%- endfor %} |
| 56 | #} |
| 57 | |
| 58 | {%- endif %} |
| 59 | |
| 60 | {%- for listen_name, listen in proxy.get('listen', {}).iteritems() %} |
| 61 | {%- if listen.get('format', 'listen') == 'listen' %} |
| 62 | |
| 63 | listen {{ listen_name }} |
| 64 | {%- for bind in listen.binds %} |
Filip Pytloun | 4201b38 | 2016-09-09 12:21:18 +0200 | [diff] [blame] | 65 | bind {{ bind.address }}:{{ bind.port }} {% if bind.get('ssl', {}).enabled|default(False) %}ssl crt {{ bind.ssl.pem_file }}{% endif %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 66 | {%- endfor %} |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 67 | {%- if listen.get('type', None) == 'http' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 68 | mode http |
| 69 | balance roundrobin |
| 70 | option httplog |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 71 | {%- elif listen.get('type', None) == 'rabbitmq' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 72 | balance roundrobin |
| 73 | mode tcp |
| 74 | option tcpka |
| 75 | timeout client 48h |
| 76 | timeout server 48h |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 77 | {%- elif listen.get('type', None) == 'mysql' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 78 | balance leastconn |
| 79 | mode tcp |
| 80 | option httpchk |
| 81 | option tcplog |
| 82 | option clitcpka |
| 83 | option srvtcpka |
| 84 | timeout client 28801s |
| 85 | timeout server 28801s |
| 86 | option mysql-check user haproxy |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 87 | {%- elif listen.get('type', None) == 'horizon' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 88 | balance source |
| 89 | capture cookie vgnvisitor= len 32 |
| 90 | cookie SERVERID insert indirect nocache |
| 91 | mode http |
| 92 | option forwardfor |
| 93 | option httpchk |
| 94 | option httpclose |
| 95 | option httplog |
| 96 | rspidel ^Set-cookie:\ IP= |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 97 | {%- elif listen.get('type', None) == 'general-service' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 98 | mode http |
| 99 | balance roundrobin |
| 100 | option httplog |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 101 | {%- elif listen.get('type', None) == 'openstack-service' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 102 | option httpchk |
| 103 | option httplog |
| 104 | option httpclose |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 105 | {%- elif listen.get('type', None) == 'heat' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 106 | balance source |
| 107 | option tcpka |
| 108 | option httpchk |
| 109 | option tcplog |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 110 | {%- elif listen.get('type', None) == 'contrail-config' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 111 | mode http |
| 112 | stats enable |
| 113 | stats uri / |
| 114 | stats auth {{ listen.user }}:{{ listen.password }} |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 115 | {%- elif listen.get('type', None) == 'contrail-api' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 116 | option nolinger |
| 117 | balance roundrobin |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 118 | {%- elif listen.get('type', None) == 'contrail-analytics' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 119 | option nolinger |
| 120 | balance roundrobin |
| 121 | option tcp-check |
| 122 | tcp-check connect port 6379 |
| 123 | default-server error-limit 1 on-error mark-down |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 124 | {%- elif listen.get('type', None) == 'stats' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 125 | mode http |
| 126 | stats enable |
| 127 | stats uri / |
Jiri Konecny | 371c6de | 2016-03-02 11:32:46 +0100 | [diff] [blame] | 128 | {%- if listen.user is defined %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 129 | stats auth {{ listen.user }}:{{ listen.password }} |
| 130 | {%- endif %} |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 131 | {%- elif listen.get('type', None) == 'admin' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 132 | mode http |
| 133 | acl AuthOkay_ReadOnly http_auth(STATSUSERS) |
| 134 | acl AuthOkay_Admin http_auth_group(STATSUSERS) {{ listen.user }} |
| 135 | stats enable |
| 136 | stats refresh 60s |
| 137 | stats uri / |
| 138 | stats http-request auth realm admin_page unless AuthOkay_ReadOnly |
| 139 | stats admin if AuthOkay_Admin |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 140 | {%- else %} |
| 141 | {# no type specified #} |
| 142 | mode {{ listen.mode|default('tcp') }} |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 143 | balance {{ listen.balance|default('roundrobin') }} |
Filip Pytloun | 98f7a4f | 2016-09-19 14:07:24 +0200 | [diff] [blame] | 144 | {%- for ttype, timeout in listen.get('timeout', {}).iteritems() %} |
| 145 | timeout {{ ttype }} {{ timeout }} |
| 146 | {%- endfor %} |
Filip Pytloun | e1a6f06 | 2016-08-26 15:13:38 +0200 | [diff] [blame] | 147 | {%- for aclname, acl in listen.get('acl', {}).iteritems() %} |
| 148 | acl {{ aclname }} {{ acl }} |
| 149 | {%- endfor %} |
| 150 | {%- for http_request in listen.get('http_request', []) %} |
| 151 | http-request {{ http_request.action }}{% if http_request.condition is defined %} {{ http_request.condition }}{% endif %} |
| 152 | {%- endfor %} |
Filip Pytloun | f93ef1c | 2016-08-31 17:46:16 +0200 | [diff] [blame] | 153 | {%- for http_response in listen.get('http_response', []) %} |
| 154 | http-response {{ http_response.action }}{% if http_response.condition is defined %} {{ http_response.condition }}{% endif %} |
| 155 | {%- endfor %} |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 156 | {%- for option in listen.get('options', []) %} |
| 157 | option {{ option }} |
| 158 | {%- endfor %} |
Filip Pytloun | 161572b | 2016-08-26 10:28:29 +0200 | [diff] [blame] | 159 | {%- for reqadd in listen.get('reqadd', []) %} |
Filip Pytloun | e9e246f | 2016-08-26 09:44:51 +0200 | [diff] [blame] | 160 | reqadd {{ reqadd }} |
| 161 | {%- endfor %} |
Filip Pytloun | 161572b | 2016-08-26 10:28:29 +0200 | [diff] [blame] | 162 | {%- for reqirep in listen.get('reqirep', []) %} |
Filip Pytloun | e9e246f | 2016-08-26 09:44:51 +0200 | [diff] [blame] | 163 | reqirep {{ reqirep }} |
| 164 | {%- endfor %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 165 | {%- endif %} |
| 166 | {%- for server in listen.get('servers', []) %} |
| 167 | server {{ server.name }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }} |
| 168 | {%- endfor %} |
| 169 | {%- endif %} |
| 170 | {%- endfor %} |
| 171 | |
| 172 | {%- for listen_name, listen in proxy.get('listen', {}).iteritems() %} |
| 173 | {%- if listen.get('format', 'listen') == 'end' %} |
| 174 | |
| 175 | frontend {{ listen_name }} {{ listen.binds[0].address }}:{{ listen.binds[0].port }} |
| 176 | {%- for acl in listen.get('acls', []) %} |
| 177 | {%- for condition in acl.get('conditions', []) %} |
| 178 | acl {{ acl.name }} {{ condition.type }} {{ condition.condition }} |
| 179 | {%- endfor %} |
| 180 | use_backend {{ acl.name }}-backend if {{ acl.name }} |
| 181 | {%- endfor %} |
| 182 | default_backend {{ listen_name }}-backend |
| 183 | |
| 184 | backend {{ listen_name }}-backend |
Filip Pytloun | 7047366 | 2016-08-25 17:08:20 +0200 | [diff] [blame] | 185 | {%- if listen.get('type', None) == 'http' %} |
Filip Pytloun | 48d3830 | 2015-10-06 16:28:31 +0200 | [diff] [blame] | 186 | balance roundrobin |
| 187 | {%- endif %} |
| 188 | {%- for server in listen.get('servers', []) %} |
| 189 | server {{ server.get('name', server.host) }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }} |
| 190 | {%- endfor %} |
| 191 | {%- for acl in listen.get('acls', []) %} |
| 192 | |
| 193 | backend {{ acl.name }}-backend |
| 194 | balance roundrobin |
| 195 | {%- for server in acl.get('servers', []) %} |
| 196 | server {{ server.get('name', server.host) }} {{ server.host }}:{{ server.port }} {{ server.get('params', '') }} |
| 197 | {%- endfor %} |
| 198 | {%- endfor %} |
| 199 | {%- endif %} |
| 200 | {%- endfor %} |