blob: 81562118bf4a8b92cc736498b0e18fe2eefeb625 [file] [log] [blame]
Filip Pytloun78944bc2016-04-13 13:03:54 +02001{%- from "haproxy/map.jinja" import proxy with context -%}
Filip Pytloun48d38302015-10-06 16:28:31 +02002
3global
Filip Pytloun78944bc2016-04-13 13:03:54 +02004 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 Pytloun48d38302015-10-06 16:28:31 +02009 user haproxy
Filip Pytloun78944bc2016-04-13 13:03:54 +020010 group haproxy
11 daemon
12 pidfile /var/run/haproxy.pid
Filip Pytloun48d38302015-10-06 16:28:31 +020013 spread-checks 4
14 tune.maxrewrite 1024
15 tune.bufsize 32768
Filip Pytloun78944bc2016-04-13 13:03:54 +020016 maxconn 16000
Ales Komarekc07297c2016-10-14 16:43:09 +020017 {%- if salt['pkg.version']('haproxy')[:3] >= '1.6' %}
Filip Pytloun4201b382016-09-09 12:21:18 +020018 # 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 Komarekc07297c2016-10-14 16:43:09 +020026 {%- endif %}
Filip Pytloun48d38302015-10-06 16:28:31 +020027
28defaults
29 log global
30 mode http
Filip Pytloun48d38302015-10-06 16:28:31 +020031
Filip Pytloun98f7a4f2016-09-19 14:07:24 +020032 maxconn {{ proxy.maxconn|default(8000) }}
Filip Pytloun48d38302015-10-06 16:28:31 +020033 option redispatch
Filip Pytloun98f7a4f2016-09-19 14:07:24 +020034 retries {{ proxy.retries|default(3) }}
Filip Pytloun48d38302015-10-06 16:28:31 +020035 stats enable
Filip Pytloun98f7a4f2016-09-19 14:07:24 +020036
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 Pytloun48d38302015-10-06 16:28:31 +020043
Jiri Konecny371c6de2016-03-02 11:32:46 +010044{%- if proxy.listen.admin_page is defined and proxy.listen.admin_page.user is defined %}
Filip Pytloun48d38302015-10-06 16:28:31 +020045
46userlist 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
63listen {{ listen_name }}
64 {%- for bind in listen.binds %}
Filip Pytloun4201b382016-09-09 12:21:18 +020065 bind {{ bind.address }}:{{ bind.port }} {% if bind.get('ssl', {}).enabled|default(False) %}ssl crt {{ bind.ssl.pem_file }}{% endif %}
Filip Pytloun48d38302015-10-06 16:28:31 +020066 {%- endfor %}
Filip Pytloun70473662016-08-25 17:08:20 +020067 {%- if listen.get('type', None) == 'http' %}
Filip Pytloun48d38302015-10-06 16:28:31 +020068 mode http
69 balance roundrobin
70 option httplog
Filip Pytloun70473662016-08-25 17:08:20 +020071 {%- elif listen.get('type', None) == 'rabbitmq' %}
Filip Pytloun48d38302015-10-06 16:28:31 +020072 balance roundrobin
73 mode tcp
74 option tcpka
75 timeout client 48h
76 timeout server 48h
Filip Pytloun70473662016-08-25 17:08:20 +020077 {%- elif listen.get('type', None) == 'mysql' %}
Filip Pytloun48d38302015-10-06 16:28:31 +020078 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 Pytloun70473662016-08-25 17:08:20 +020087 {%- elif listen.get('type', None) == 'horizon' %}
Filip Pytloun48d38302015-10-06 16:28:31 +020088 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 Pytloun70473662016-08-25 17:08:20 +020097 {%- elif listen.get('type', None) == 'general-service' %}
Filip Pytloun48d38302015-10-06 16:28:31 +020098 mode http
99 balance roundrobin
100 option httplog
Filip Pytloun70473662016-08-25 17:08:20 +0200101 {%- elif listen.get('type', None) == 'openstack-service' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200102 option httpchk
103 option httplog
104 option httpclose
Filip Pytloun70473662016-08-25 17:08:20 +0200105 {%- elif listen.get('type', None) == 'heat' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200106 balance source
107 option tcpka
108 option httpchk
109 option tcplog
Filip Pytloun70473662016-08-25 17:08:20 +0200110 {%- elif listen.get('type', None) == 'contrail-config' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200111 mode http
112 stats enable
113 stats uri /
114 stats auth {{ listen.user }}:{{ listen.password }}
Filip Pytloun70473662016-08-25 17:08:20 +0200115 {%- elif listen.get('type', None) == 'contrail-api' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200116 option nolinger
117 balance roundrobin
Filip Pytloun70473662016-08-25 17:08:20 +0200118 {%- elif listen.get('type', None) == 'contrail-analytics' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200119 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 Pytloun70473662016-08-25 17:08:20 +0200124 {%- elif listen.get('type', None) == 'stats' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200125 mode http
126 stats enable
127 stats uri /
Jiri Konecny371c6de2016-03-02 11:32:46 +0100128 {%- if listen.user is defined %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200129 stats auth {{ listen.user }}:{{ listen.password }}
130 {%- endif %}
Filip Pytloun70473662016-08-25 17:08:20 +0200131 {%- elif listen.get('type', None) == 'admin' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200132 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 Pytloun70473662016-08-25 17:08:20 +0200140 {%- else %}
141 {# no type specified #}
142 mode {{ listen.mode|default('tcp') }}
Filip Pytloun70473662016-08-25 17:08:20 +0200143 balance {{ listen.balance|default('roundrobin') }}
Filip Pytloun98f7a4f2016-09-19 14:07:24 +0200144 {%- for ttype, timeout in listen.get('timeout', {}).iteritems() %}
145 timeout {{ ttype }} {{ timeout }}
146 {%- endfor %}
Filip Pytloune1a6f062016-08-26 15:13:38 +0200147 {%- 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 Pytlounf93ef1c2016-08-31 17:46:16 +0200153 {%- 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 Pytloun70473662016-08-25 17:08:20 +0200156 {%- for option in listen.get('options', []) %}
157 option {{ option }}
158 {%- endfor %}
Filip Pytloun161572b2016-08-26 10:28:29 +0200159 {%- for reqadd in listen.get('reqadd', []) %}
Filip Pytloune9e246f2016-08-26 09:44:51 +0200160 reqadd {{ reqadd }}
161 {%- endfor %}
Filip Pytloun161572b2016-08-26 10:28:29 +0200162 {%- for reqirep in listen.get('reqirep', []) %}
Filip Pytloune9e246f2016-08-26 09:44:51 +0200163 reqirep {{ reqirep }}
164 {%- endfor %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200165 {%- 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
175frontend {{ 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
184backend {{ listen_name }}-backend
Filip Pytloun70473662016-08-25 17:08:20 +0200185 {%- if listen.get('type', None) == 'http' %}
Filip Pytloun48d38302015-10-06 16:28:31 +0200186 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
193backend {{ 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 %}