{"id":894,"sha1":"bcc969d8a1930c7212163ae68eb191bfcbe99cce","playbook":{"id":4,"items":{"plays":107,"tasks":2438,"results":2413,"hosts":13,"files":511,"records":0},"arguments":{"version":null,"verbosity":0,"private_key_file":null,"remote_user":null,"connection":"openstack.osa.ssh","timeout":null,"ssh_common_args":null,"sftp_extra_args":null,"scp_extra_args":null,"ssh_extra_args":null,"ask_pass":false,"connection_password_file":null,"force_handlers":true,"flush_cache":false,"become":false,"become_method":"sudo","become_user":null,"become_ask_pass":false,"become_password_file":null,"tags":["all"],"skip_tags":[],"check":false,"diff":false,"inventory":["/home/zuul/src/opendev.org/openstack/openstack-ansible/inventory/dynamic_inventory.py","/home/zuul/src/opendev.org/openstack/openstack-ansible/inventory/inventory.ini","/etc/openstack_deploy/inventory.ini"],"listhosts":false,"subset":null,"extra_vars":"Not saved by ARA as configured by 'ignored_arguments'","vault_ids":[],"ask_vault_pass":false,"vault_password_files":[],"forks":4,"module_path":null,"syntax":false,"listtasks":false,"listtags":false,"step":false,"start_at_task":null,"args":["setup-openstack.yml"]},"labels":[{"id":1,"name":"check:False"},{"id":2,"name":"tags:all"}],"started":"2025-12-14T10:21:40.790759Z","ended":"2025-12-14T11:05:36.775743Z","duration":"00:43:55.984984","name":null,"ansible_version":"2.18.6","client_version":"1.7.4","python_version":"3.13.5","server_version":"1.7.4","status":"completed","path":"/home/zuul/src/opendev.org/openstack/openstack-ansible/playbooks/setup-openstack.yml","controller":"aio1.openstack.local","user":"root"},"content":"---\n# Copyright 2023, Cleura AB\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# special haproxy stick table for horizon\n# returns 429 when more than 20 calls to /auth per 10 second window\n# returns 429 when more than 20 4xx responses per 10 second window\n# from external IP addresses. Override as necessary.\nopenstack_haproxy_horizon_stick_table:\n  - \"stick-table  type ipv6  size 256k  expire 10s  store http_req_rate(10s),http_err_rate(10s)\"\n  - \"http-request track-sc0 src\"\n  - \"http-request deny deny_status 429 if { sc_http_req_rate(0) gt 20 } { path_beg /auth } !{ src {{ haproxy_stick_table_allowlist_networks | join(' } !{ src ') }} }\"\n  - \"http-request deny deny_status 429 if { sc_http_err_rate(0) gt 20 } !{ src {{ haproxy_stick_table_allowlist_networks | join(' } !{ src ') }} }\"\n\nhorizon_webroot: \"{{ (groups['skyline_all'] | default([])) | ternary('/horizon', '/') }}\"\n\nhaproxy_horizon_service:\n  haproxy_backend_only: true    #only describe the backends, frontend is in `base` via haproxy_all group vars\n  haproxy_service_name: horizon\n  haproxy_backend_nodes: \"{{ groups['horizon_all'] | default([]) }}\"\n  haproxy_backend_port: \"{{ (horizon_backend_ssl | default(openstack_service_backend_ssl)) | ternary(443, 80) }}\"\n  haproxy_balance_type: http\n  haproxy_balance_alg: source\n  haproxy_backend_httpcheck_options:\n    - 'send hdr User-Agent \"osa-haproxy-healthcheck\" meth HEAD uri {{ horizon_webroot.rstrip(\"/\") }}/auth/login/'\n  haproxy_service_enabled: \"{{ groups['horizon_all'] is defined and groups['horizon_all'] | length > 0 }}\"\n  haproxy_backend_ssl: \"{{ horizon_backend_ssl | default(openstack_service_backend_ssl) }}\"\n  haproxy_backend_ca: \"{{ horizon_haproxy_backend_ca | default(openstack_haproxy_backend_ca) }}\"\n  haproxy_stick_table: \"{{ openstack_haproxy_horizon_stick_table }}\"\n  haproxy_map_entries:\n    - name: base_regex\n      order: 98\n      #match any requests to the horizon backend\n      entries:\n        - \"{{ horizon_webroot }} horizon-back\"\n\nhorizon_haproxy_services:\n  - \"{{ haproxy_horizon_service | combine(haproxy_horizon_service_overrides | default({})) }}\"\n","created":"2025-12-14T10:55:02.611330Z","updated":"2025-12-14T10:55:02.611342Z","path":"/home/zuul/src/opendev.org/openstack/openstack-ansible/inventory/group_vars/horizon_all/haproxy_service.yml"}