diff options
30 files changed, 225 insertions, 57 deletions
diff --git a/ansible/roles/aodh/defaults/main.yml b/ansible/roles/aodh/defaults/main.yml index 76d9360dd..0c6df039c 100644 --- a/ansible/roles/aodh/defaults/main.yml +++ b/ansible/roles/aodh/defaults/main.yml @@ -17,7 +17,8 @@ aodh_services: port: "{{ aodh_api_port }}" listen_port: "{{ aodh_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" aodh_api_external: enabled: "{{ enable_aodh }}" mode: "http" @@ -26,7 +27,8 @@ aodh_services: port: "{{ aodh_api_public_port }}" listen_port: "{{ aodh_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" aodh-evaluator: container_name: aodh_evaluator group: aodh-evaluator @@ -131,7 +133,11 @@ aodh_api_enable_healthchecks: "{{ enable_container_healthchecks }}" aodh_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" aodh_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" aodh_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" -aodh_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ aodh_api_listen_port }}"] +aodh_api_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ aodh_api_listen_port }}/healthcheck aodh_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" aodh_api_healthcheck: interval: "{{ aodh_api_healthcheck_interval }}" diff --git a/ansible/roles/barbican/defaults/main.yml b/ansible/roles/barbican/defaults/main.yml index 86d12e558..211080579 100644 --- a/ansible/roles/barbican/defaults/main.yml +++ b/ansible/roles/barbican/defaults/main.yml @@ -18,7 +18,8 @@ barbican_services: listen_port: "{{ barbican_api_listen_port }}" tls_backend: "{{ barbican_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" barbican_api_external: enabled: "{{ enable_barbican }}" mode: "http" @@ -28,7 +29,8 @@ barbican_services: listen_port: "{{ barbican_api_listen_port }}" tls_backend: "{{ barbican_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" barbican-keystone-listener: container_name: barbican_keystone_listener group: barbican-keystone-listener @@ -107,7 +109,7 @@ barbican_api_healthcheck_test: - >- healthcheck_curl {{ 'https' if barbican_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ barbican_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ barbican_api_listen_port }}/healthcheck" barbican_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" barbican_api_healthcheck: interval: "{{ barbican_api_healthcheck_interval }}" diff --git a/ansible/roles/cinder/defaults/main.yml b/ansible/roles/cinder/defaults/main.yml index e2a2d2dd6..4258d863e 100644 --- a/ansible/roles/cinder/defaults/main.yml +++ b/ansible/roles/cinder/defaults/main.yml @@ -18,7 +18,8 @@ cinder_services: listen_port: "{{ cinder_api_listen_port }}" tls_backend: "{{ cinder_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" cinder_api_external: enabled: "{{ enable_cinder }}" mode: "http" @@ -28,7 +29,8 @@ cinder_services: listen_port: "{{ cinder_api_listen_port }}" tls_backend: "{{ cinder_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" cinder-scheduler: container_name: cinder_scheduler group: cinder-scheduler @@ -125,7 +127,7 @@ cinder_api_healthcheck_test: - >- healthcheck_curl {{ 'https' if cinder_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ cinder_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ cinder_api_listen_port }}/healthcheck cinder_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" cinder_api_healthcheck: interval: "{{ cinder_api_healthcheck_interval }}" diff --git a/ansible/roles/cloudkitty/defaults/main.yml b/ansible/roles/cloudkitty/defaults/main.yml index c5c093571..b1840642e 100644 --- a/ansible/roles/cloudkitty/defaults/main.yml +++ b/ansible/roles/cloudkitty/defaults/main.yml @@ -17,7 +17,8 @@ cloudkitty_services: port: "{{ cloudkitty_api_port }}" listen_port: "{{ cloudkitty_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" cloudkitty_api_external: enabled: "{{ enable_cloudkitty }}" mode: "http" @@ -26,7 +27,8 @@ cloudkitty_services: port: "{{ cloudkitty_api_public_port }}" listen_port: "{{ cloudkitty_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" cloudkitty-processor: container_name: "cloudkitty_processor" group: "cloudkitty-processor" @@ -100,7 +102,11 @@ cloudkitty_api_enable_healthchecks: "{{ enable_container_healthchecks }}" cloudkitty_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" cloudkitty_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" cloudkitty_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" -cloudkitty_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ cloudkitty_api_port }}"] +cloudkitty_api_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ cloudkitty_api_port }}/healthcheck cloudkitty_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" cloudkitty_api_healthcheck: interval: "{{ cloudkitty_api_healthcheck_interval }}" diff --git a/ansible/roles/cyborg/defaults/main.yml b/ansible/roles/cyborg/defaults/main.yml index 75e790eaa..7aa233a00 100644 --- a/ansible/roles/cyborg/defaults/main.yml +++ b/ansible/roles/cyborg/defaults/main.yml @@ -16,6 +16,9 @@ cyborg_services: external: false port: "{{ cyborg_api_port }}" listen_port: "{{ cyborg_api_listen_port }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" cyborg_api_external: enabled: "{{ enable_cyborg }}" mode: "http" @@ -23,6 +26,9 @@ cyborg_services: external_fqdn: "{{ cyborg_external_fqdn }}" port: "{{ cyborg_api_public_port }}" listen_port: "{{ cyborg_api_listen_port }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" cyborg-agent: container_name: cyborg_agent group: cyborg-agent diff --git a/ansible/roles/designate/defaults/main.yml b/ansible/roles/designate/defaults/main.yml index cb94c39a6..f9e5bc7e5 100644 --- a/ansible/roles/designate/defaults/main.yml +++ b/ansible/roles/designate/defaults/main.yml @@ -17,7 +17,8 @@ designate_services: port: "{{ designate_api_port }}" listen_port: "{{ designate_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ designate_enable_tls_backend | bool }}" designate_api_external: enabled: "{{ enable_designate }}" @@ -27,7 +28,8 @@ designate_services: port: "{{ designate_api_public_port }}" listen_port: "{{ designate_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ designate_enable_tls_backend | bool }}" designate-backend-bind9: container_name: designate_backend_bind9 @@ -159,7 +161,7 @@ designate_api_healthcheck_test: - >- healthcheck_curl {{ 'https' if designate_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ designate_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ designate_api_listen_port }}/healthcheck designate_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" designate_api_healthcheck: interval: "{{ designate_api_healthcheck_interval }}" diff --git a/ansible/roles/etcd/defaults/main.yml b/ansible/roles/etcd/defaults/main.yml index 443031ecc..563eff9dc 100644 --- a/ansible/roles/etcd/defaults/main.yml +++ b/ansible/roles/etcd/defaults/main.yml @@ -8,12 +8,16 @@ etcd_services: image: "{{ etcd_image_full }}" volumes: "{{ etcd_default_volumes + etcd_extra_volumes }}" dimensions: "{{ etcd_dimensions }}" + healthcheck: "{{ etcd_healthcheck }}" haproxy: etcd: enabled: true mode: "http" external: false port: "{{ etcd_client_port }}" + backend_http_extra: + - "option httpchk GET /health" + - "http-check expect status 200" tls_backend: "{{ etcd_enable_tls | bool }}" #################### @@ -84,6 +88,19 @@ etcd_tag: "{{ openstack_tag }}" etcd_image_full: "{{ etcd_image }}:{{ etcd_tag }}" etcd_dimensions: "{{ default_container_dimensions }}" +etcd_enable_healthchecks: "{{ enable_container_healthchecks }}" +etcd_healthcheck_interval: "{{ default_container_healthcheck_interval }}" +etcd_healthcheck_retries: "{{ default_container_healthcheck_retries }}" +etcd_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" +etcd_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ etcd_client_port }}/health"] +etcd_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" +etcd_healthcheck: + interval: "{{ etcd_healthcheck_interval }}" + retries: "{{ etcd_healthcheck_retries }}" + start_period: "{{ etcd_healthcheck_start_period }}" + test: "{% if etcd_enable_healthchecks | bool %}{{ etcd_healthcheck_test }}{% else %}NONE{% endif %}" + timeout: "{{ etcd_healthcheck_timeout }}" + etcd_default_volumes: - "{{ node_config_directory }}/etcd/:{{ container_config_directory }}/:ro" - "/etc/localtime:/etc/localtime:ro" diff --git a/ansible/roles/etcd/tasks/bootstrap_cluster.yml b/ansible/roles/etcd/tasks/bootstrap_cluster.yml index e62ebfc0d..f8b731dea 100644 --- a/ansible/roles/etcd/tasks/bootstrap_cluster.yml +++ b/ansible/roles/etcd/tasks/bootstrap_cluster.yml @@ -12,6 +12,7 @@ name: "{{ service.container_name }}" volumes: "{{ service.volumes }}" dimensions: "{{ service.dimensions }}" + healthcheck: "{{ service.healthcheck | default(omit) }}" - name: Wait for etcd service port liveness ansible.builtin.wait_for: diff --git a/ansible/roles/etcd/tasks/bootstrap_services.yml b/ansible/roles/etcd/tasks/bootstrap_services.yml index b2bb46328..d9aa18abc 100644 --- a/ansible/roles/etcd/tasks/bootstrap_services.yml +++ b/ansible/roles/etcd/tasks/bootstrap_services.yml @@ -24,6 +24,7 @@ name: "{{ service.container_name }}" volumes: "{{ service.volumes }}" dimensions: "{{ service.dimensions }}" + healthcheck: "{{ service.healthcheck | default(omit) }}" - name: Wait for etcd service port liveness ansible.builtin.wait_for: diff --git a/ansible/roles/etcd/tasks/restart_services.yml b/ansible/roles/etcd/tasks/restart_services.yml index 3f6991dcf..192bad8d4 100644 --- a/ansible/roles/etcd/tasks/restart_services.yml +++ b/ansible/roles/etcd/tasks/restart_services.yml @@ -12,6 +12,7 @@ volumes: "{{ service.volumes }}" dimensions: "{{ service.dimensions }}" environment: "{{ service.environment }}" + healthcheck: "{{ service.healthcheck | default(omit) }}" - name: Wait for etcd service port liveness ansible.builtin.wait_for: diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml index b24235c43..b8ab38514 100644 --- a/ansible/roles/glance/defaults/main.yml +++ b/ansible/roles/glance/defaults/main.yml @@ -22,7 +22,8 @@ glance_services: - "timeout client {{ haproxy_glance_api_client_timeout }}" backend_http_extra: - "timeout server {{ haproxy_glance_api_server_timeout }}" - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" custom_member_list: "{{ haproxy_members.split(';') }}" tls_backend: "{{ glance_enable_tls_backend | bool }}" glance_api_external: @@ -35,7 +36,8 @@ glance_services: - "timeout client {{ haproxy_glance_api_client_timeout }}" backend_http_extra: - "timeout server {{ haproxy_glance_api_server_timeout }}" - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" custom_member_list: "{{ haproxy_members.split(';') }}" tls_backend: "{{ glance_enable_tls_backend | bool }}" @@ -146,7 +148,7 @@ glance_api_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if glance_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ glance_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ glance_api_listen_port }}/healthcheck glance_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" glance_api_healthcheck: interval: "{{ glance_api_healthcheck_interval }}" @@ -155,6 +157,23 @@ glance_api_healthcheck: test: "{% if glance_api_enable_healthchecks | bool %}{{ glance_api_healthcheck_test }}{% else %}NONE{% endif %}" timeout: "{{ glance_api_healthcheck_timeout }}" +glance_tls_proxy_enable_healthchecks: "{{ enable_container_healthchecks }}" +glance_tls_proxy_healthcheck_interval: "{{ default_container_healthcheck_interval }}" +glance_tls_proxy_healthcheck_retries: "{{ default_container_healthcheck_retries }}" +glance_tls_proxy_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" +glance_tls_proxy_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl -u {{ haproxy_user }}:{{ haproxy_password }} {{ + api_interface_address | put_address_in_context('url') }}:{{ glance_tls_proxy_stats_port }}/healthcheck +glance_tls_proxy_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" +glance_tls_proxy_healthcheck: + interval: "{{ glance_tls_proxy_healthcheck_interval }}" + retries: "{{ glance_tls_proxy_healthcheck_retries }}" + start_period: "{{ glance_tls_proxy_healthcheck_start_period }}" + test: "{% if glance_tls_proxy_enable_healthchecks | bool %}{{ glance_tls_proxy_healthcheck_test }}{% else %}NONE{% endif %}" + timeout: "{{ glance_tls_proxy_healthcheck_timeout }}" + glance_api_default_volumes: - "{{ node_config_directory }}/glance-api/:{{ container_config_directory }}/:ro" - "/etc/localtime:/etc/localtime:ro" diff --git a/ansible/roles/gnocchi/defaults/main.yml b/ansible/roles/gnocchi/defaults/main.yml index 32ba19ca4..401f14326 100644 --- a/ansible/roles/gnocchi/defaults/main.yml +++ b/ansible/roles/gnocchi/defaults/main.yml @@ -17,7 +17,8 @@ gnocchi_services: port: "{{ gnocchi_api_port }}" listen_port: "{{ gnocchi_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" gnocchi_api_external: enabled: "{{ enable_gnocchi }}" mode: "http" @@ -26,7 +27,8 @@ gnocchi_services: port: "{{ gnocchi_api_public_port }}" listen_port: "{{ gnocchi_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" gnocchi-metricd: container_name: gnocchi_metricd group: gnocchi-metricd @@ -100,7 +102,11 @@ gnocchi_api_enable_healthchecks: "{{ enable_container_healthchecks }}" gnocchi_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" gnocchi_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" gnocchi_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" -gnocchi_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ gnocchi_api_listen_port }}"] +gnocchi_api_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ gnocchi_api_listen_port }}/healthcheck gnocchi_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" gnocchi_api_healthcheck: interval: "{{ gnocchi_api_healthcheck_interval }}" diff --git a/ansible/roles/grafana/defaults/main.yml b/ansible/roles/grafana/defaults/main.yml index 0b34175b8..e7aac005a 100644 --- a/ansible/roles/grafana/defaults/main.yml +++ b/ansible/roles/grafana/defaults/main.yml @@ -7,6 +7,7 @@ grafana_services: image: "{{ grafana_image_full }}" volumes: "{{ grafana_default_volumes + grafana_extra_volumes }}" dimensions: "{{ grafana_dimensions }}" + healthcheck: "{{ grafana_healthcheck }}" haproxy: grafana_server: enabled: "{{ enable_grafana }}" @@ -15,7 +16,8 @@ grafana_services: port: "{{ grafana_server_port }}" listen_port: "{{ grafana_server_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /api/health" + - "http-check expect status 200" grafana_server_external: enabled: "{{ enable_grafana_external | bool }}" mode: "http" @@ -24,7 +26,8 @@ grafana_services: port: "{{ grafana_server_public_port }}" listen_port: "{{ grafana_server_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /api/health" + - "http-check expect status 200" #################### # Database @@ -90,6 +93,23 @@ grafana_tag: "{{ openstack_tag }}" grafana_image_full: "{{ grafana_image }}:{{ grafana_tag }}" grafana_admin_username: "admin" +grafana_enable_healthchecks: "{{ enable_container_healthchecks }}" +grafana_healthcheck_interval: "{{ default_container_healthcheck_interval }}" +grafana_healthcheck_retries: "{{ default_container_healthcheck_retries }}" +grafana_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" +grafana_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ grafana_server_port }}/api/health +grafana_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" +grafana_healthcheck: + interval: "{{ grafana_healthcheck_interval }}" + retries: "{{ grafana_healthcheck_retries }}" + start_period: "{{ grafana_healthcheck_start_period }}" + test: "{% if grafana_enable_healthchecks | bool %}{{ grafana_healthcheck_test }}{% else %}NONE{% endif %}" + timeout: "{{ grafana_healthcheck_timeout }}" + grafana_dimensions: "{{ default_container_dimensions }}" grafana_default_volumes: - "{{ node_config_directory }}/grafana/:{{ container_config_directory }}/:ro" diff --git a/ansible/roles/grafana/handlers/main.yml b/ansible/roles/grafana/handlers/main.yml index 7096d367d..7e66df2da 100644 --- a/ansible/roles/grafana/handlers/main.yml +++ b/ansible/roles/grafana/handlers/main.yml @@ -12,6 +12,7 @@ image: "{{ service.image }}" volumes: "{{ service.volumes }}" dimensions: "{{ service.dimensions }}" + healthcheck: "{{ service.healthcheck | default(omit) }}" when: - inventory_hostname == groups[service.group] | first @@ -25,7 +26,7 @@ container_engine: "{{ kolla_container_engine }}" module_name: uri module_args: - url: "http://{{ api_interface_address | put_address_in_context('url') }}:{{ grafana_server_port }}/login" + url: "http://{{ api_interface_address | put_address_in_context('url') }}:{{ grafana_server_port }}/api/health" status_code: 200 register: result until: result.get('status') == 200 @@ -47,5 +48,6 @@ image: "{{ service.image }}" volumes: "{{ service.volumes }}" dimensions: "{{ service.dimensions }}" + healthcheck: "{{ service.healthcheck | default(omit) }}" when: - inventory_hostname != groups[service.group] | first diff --git a/ansible/roles/heat/defaults/main.yml b/ansible/roles/heat/defaults/main.yml index f13263d23..ec82d57c0 100644 --- a/ansible/roles/heat/defaults/main.yml +++ b/ansible/roles/heat/defaults/main.yml @@ -18,7 +18,8 @@ heat_services: listen_port: "{{ heat_api_listen_port }}" tls_backend: "{{ heat_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" heat_api_external: enabled: "{{ enable_heat }}" mode: "http" @@ -28,7 +29,8 @@ heat_services: listen_port: "{{ heat_api_listen_port }}" tls_backend: "{{ heat_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" heat-api-cfn: container_name: heat_api_cfn group: heat-api-cfn @@ -47,7 +49,8 @@ heat_services: listen_port: "{{ heat_api_cfn_listen_port }}" tls_backend: "{{ heat_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" heat_api_cfn_external: enabled: "{{ enable_heat }}" mode: "http" @@ -57,7 +60,8 @@ heat_services: listen_port: "{{ heat_api_cfn_listen_port }}" tls_backend: "{{ heat_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" heat-engine: container_name: heat_engine group: heat-engine @@ -127,7 +131,7 @@ heat_api_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if heat_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ heat_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ heat_api_listen_port }}/healthcheck heat_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" heat_api_healthcheck: interval: "{{ heat_api_healthcheck_interval }}" @@ -144,7 +148,7 @@ heat_api_cfn_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if heat_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ heat_api_cfn_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ heat_api_cfn_listen_port }}/healthcheck heat_api_cfn_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" heat_api_cfn_healthcheck: interval: "{{ heat_api_cfn_healthcheck_interval }}" diff --git a/ansible/roles/keystone/defaults/main.yml b/ansible/roles/keystone/defaults/main.yml index f6a29d44b..3727fdd3f 100644 --- a/ansible/roles/keystone/defaults/main.yml +++ b/ansible/roles/keystone/defaults/main.yml @@ -19,7 +19,8 @@ keystone_services: listen_port: "{{ keystone_internal_listen_port }}" backend_http_extra: - "balance {{ 'source' if enable_keystone_federation | bool else 'roundrobin' }}" - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" keystone_external: enabled: "{{ enable_keystone }}" mode: "http" @@ -30,7 +31,8 @@ keystone_services: listen_port: "{{ keystone_public_listen_port }}" backend_http_extra: - "balance {{ 'source' if enable_keystone_federation | bool else 'roundrobin' }}" - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" keystone-fernet: container_name: "keystone_fernet" group: "keystone" @@ -136,7 +138,7 @@ keystone_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if keystone_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ keystone_public_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ keystone_public_listen_port }}/healthcheck keystone_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" keystone_healthcheck: interval: "{{ keystone_healthcheck_interval }}" diff --git a/ansible/roles/magnum/defaults/main.yml b/ansible/roles/magnum/defaults/main.yml index 0118ee657..0e848a729 100644 --- a/ansible/roles/magnum/defaults/main.yml +++ b/ansible/roles/magnum/defaults/main.yml @@ -19,7 +19,8 @@ magnum_services: port: "{{ magnum_api_port }}" listen_port: "{{ magnum_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ magnum_enable_tls_backend | bool }}" magnum_api_external: enabled: "{{ enable_magnum }}" @@ -29,7 +30,8 @@ magnum_services: port: "{{ magnum_api_public_port }}" listen_port: "{{ magnum_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ magnum_enable_tls_backend | bool }}" magnum-conductor: container_name: magnum_conductor @@ -105,7 +107,7 @@ magnum_api_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if magnum_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ magnum_api_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ magnum_api_listen_port }}/healthcheck magnum_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" magnum_api_healthcheck: interval: "{{ magnum_api_healthcheck_interval }}" diff --git a/ansible/roles/manila/defaults/main.yml b/ansible/roles/manila/defaults/main.yml index 8b7442ba5..3ddaa7d84 100644 --- a/ansible/roles/manila/defaults/main.yml +++ b/ansible/roles/manila/defaults/main.yml @@ -17,7 +17,8 @@ manila_services: port: "{{ manila_api_port }}" listen_port: "{{ manila_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" manila_api_external: enabled: "{{ enable_manila }}" mode: "http" @@ -26,7 +27,8 @@ manila_services: port: "{{ manila_api_public_port }}" listen_port: "{{ manila_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" manila-scheduler: container_name: "manila_scheduler" group: "manila-scheduler" @@ -115,7 +117,11 @@ manila_api_enable_healthchecks: "{{ enable_container_healthchecks }}" manila_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" manila_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" manila_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" -manila_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ manila_api_port }}"] +manila_api_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ manila_api_port }}/healthcheck manila_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" manila_api_healthcheck: interval: "{{ manila_api_healthcheck_interval }}" diff --git a/ansible/roles/masakari/defaults/main.yml b/ansible/roles/masakari/defaults/main.yml index 396726964..12910a5b9 100644 --- a/ansible/roles/masakari/defaults/main.yml +++ b/ansible/roles/masakari/defaults/main.yml @@ -7,6 +7,7 @@ masakari_services: image: "{{ masakari_api_image_full }}" volumes: "{{ masakari_api_default_volumes + masakari_api_extra_volumes }}" dimensions: "{{ masakari_api_dimensions }}" + healthcheck: "{{ masakari_api_healthcheck }}" wsgi: "masakari.wsgi.api:application" haproxy: masakari_api: @@ -16,7 +17,8 @@ masakari_services: port: "{{ masakari_api_port }}" listen_port: "{{ masakari_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" masakari_api_external: enabled: "{{ enable_masakari }}" mode: "http" @@ -25,7 +27,8 @@ masakari_services: port: "{{ masakari_api_public_port }}" listen_port: "{{ masakari_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" masakari-engine: container_name: masakari_engine group: masakari-engine @@ -105,6 +108,23 @@ masakari_engine_dimensions: "{{ default_container_dimensions }}" masakari_instancemonitor_dimensions: "{{ masakari_monitors_dimensions | default(default_container_dimensions) }}" masakari_hostmonitor_dimensions: "{{ default_container_dimensions }}" +masakari_api_enable_healthchecks: "{{ enable_container_healthchecks }}" +masakari_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" +masakari_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" +masakari_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" +masakari_api_healthcheck_test: + - "CMD-SHELL" + - >- + healthcheck_curl http://{{ + api_interface_address | put_address_in_context('url') }}:{{ masakari_api_port }}/healthcheck +masakari_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" +masakari_api_healthcheck: + interval: "{{ masakari_api_healthcheck_interval }}" + retries: "{{ masakari_api_healthcheck_retries }}" + start_period: "{{ masakari_api_healthcheck_start_period }}" + test: "{% if masakari_api_enable_healthchecks | bool %}{{ masakari_api_healthcheck_test }}{% else %}NONE{% endif %}" + timeout: "{{ masakari_api_healthcheck_timeout }}" + masakari_extra_volumes: "{{ default_extra_volumes }}" masakari_api_extra_volumes: "{{ masakari_extra_volumes }}" masakari_engine_extra_volumes: "{{ masakari_extra_volumes }}" diff --git a/ansible/roles/mistral/defaults/main.yml b/ansible/roles/mistral/defaults/main.yml index 0bb575590..156342118 100644 --- a/ansible/roles/mistral/defaults/main.yml +++ b/ansible/roles/mistral/defaults/main.yml @@ -17,7 +17,8 @@ mistral_services: port: "{{ mistral_api_port }}" listen_port: "{{ mistral_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" mistral_api_external: enabled: "{{ enable_mistral }}" mode: "http" @@ -26,7 +27,8 @@ mistral_services: port: "{{ mistral_api_public_port }}" listen_port: "{{ mistral_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" mistral-engine: container_name: mistral_engine group: mistral-engine diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml index 8e3e53c62..0518e3d8d 100644 --- a/ansible/roles/neutron/defaults/main.yml +++ b/ansible/roles/neutron/defaults/main.yml @@ -18,7 +18,8 @@ neutron_services: port: "{{ neutron_server_port }}" listen_port: "{{ neutron_server_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ neutron_enable_tls_backend | bool }}" neutron_server_external: enabled: true @@ -28,7 +29,8 @@ neutron_services: port: "{{ neutron_server_public_port }}" listen_port: "{{ neutron_server_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" tls_backend: "{{ neutron_enable_tls_backend | bool }}" neutron-rpc-server: container_name: "neutron_rpc_server" @@ -443,7 +445,7 @@ neutron_server_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if neutron_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ neutron_server_listen_port }} + api_interface_address | put_address_in_context('url') }}:{{ neutron_server_listen_port }}/healthcheck neutron_server_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" neutron_server_healthcheck: interval: "{{ neutron_server_healthcheck_interval }}" diff --git a/ansible/roles/nova/defaults/main.yml b/ansible/roles/nova/defaults/main.yml index 2fe3b3e52..faf44558a 100644 --- a/ansible/roles/nova/defaults/main.yml +++ b/ansible/roles/nova/defaults/main.yml @@ -19,7 +19,8 @@ nova_services: listen_port: "{{ nova_api_listen_port }}" tls_backend: "{{ nova_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" nova_api_external: enabled: "{{ enable_nova }}" mode: "http" @@ -29,7 +30,8 @@ nova_services: listen_port: "{{ nova_api_listen_port }}" tls_backend: "{{ nova_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" nova-metadata: container_name: "nova_metadata" group: "nova-metadata" @@ -48,7 +50,8 @@ nova_services: listen_port: "{{ nova_metadata_listen_port }}" tls_backend: "{{ nova_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" nova_metadata_external: enabled: "{{ nova_enable_external_metadata }}" mode: "http" @@ -58,7 +61,8 @@ nova_services: listen_port: "{{ nova_metadata_listen_port }}" tls_backend: "{{ nova_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /" + - "http-check expect status 200" nova-scheduler: container_name: "nova_scheduler" group: "nova-scheduler" diff --git a/ansible/roles/octavia/defaults/main.yml b/ansible/roles/octavia/defaults/main.yml index 37cd2b077..a75ee1770 100644 --- a/ansible/roles/octavia/defaults/main.yml +++ b/ansible/roles/octavia/defaults/main.yml @@ -17,6 +17,9 @@ octavia_services: port: "{{ octavia_api_port }}" listen_port: "{{ octavia_api_listen_port }}" tls_backend: "{{ octavia_enable_tls_backend }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" octavia_api_external: enabled: "{{ enable_octavia }}" mode: "http" @@ -25,6 +28,9 @@ octavia_services: port: "{{ octavia_api_public_port }}" listen_port: "{{ octavia_api_listen_port }}" tls_backend: "{{ octavia_enable_tls_backend }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" octavia-driver-agent: container_name: octavia_driver_agent group: octavia-driver-agent diff --git a/ansible/roles/placement/defaults/main.yml b/ansible/roles/placement/defaults/main.yml index 85a734c18..f70c496b9 100644 --- a/ansible/roles/placement/defaults/main.yml +++ b/ansible/roles/placement/defaults/main.yml @@ -19,6 +19,7 @@ placement_services: tls_backend: "{{ placement_enable_tls_backend }}" backend_http_extra: - "option httpchk GET /" + - "http-check expect status 200" placement_api_external: enabled: "{{ enable_placement }}" mode: "http" @@ -29,6 +30,7 @@ placement_services: tls_backend: "{{ placement_enable_tls_backend }}" backend_http_extra: - "option httpchk GET /" + - "http-check expect status 200" #################### # Config Validate diff --git a/ansible/roles/rabbitmq/defaults/main.yml b/ansible/roles/rabbitmq/defaults/main.yml index f1ed69f38..72cb1e657 100644 --- a/ansible/roles/rabbitmq/defaults/main.yml +++ b/ansible/roles/rabbitmq/defaults/main.yml @@ -26,7 +26,8 @@ rabbitmq_services: port: "{{ rabbitmq_management_port }}" host_group: "rabbitmq" backend_http_extra: - - "option httpchk" + - "option httpchk GET /api/overview" + - "http-check send hdr Authorization 'Basic {{ (rabbitmq_monitoring_user + ':' + rabbitmq_monitoring_password) | b64encode }}'" #################### # Docker diff --git a/ansible/roles/tacker/defaults/main.yml b/ansible/roles/tacker/defaults/main.yml index ddcee2a24..e00108b97 100644 --- a/ansible/roles/tacker/defaults/main.yml +++ b/ansible/roles/tacker/defaults/main.yml @@ -16,6 +16,9 @@ tacker_services: external: false port: "{{ tacker_server_port }}" listen_port: "{{ tacker_server_listen_port }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" custom_member_list: "{{ tacker_haproxy_members.split(';') }}" tacker_server_external: enabled: "{{ enable_tacker }}" @@ -24,6 +27,9 @@ tacker_services: external_fqdn: "{{ tacker_external_fqdn }}" port: "{{ tacker_server_public_port }}" listen_port: "{{ tacker_server_listen_port }}" + backend_http_extra: + - "option httpchk GET /" + - "http-check expect status 200" custom_member_list: "{{ tacker_haproxy_members.split(';') }}" tacker-conductor: container_name: "tacker_conductor" diff --git a/ansible/roles/trove/defaults/main.yml b/ansible/roles/trove/defaults/main.yml index 3abf8e622..8dd251d4e 100644 --- a/ansible/roles/trove/defaults/main.yml +++ b/ansible/roles/trove/defaults/main.yml @@ -18,7 +18,8 @@ trove_services: listen_port: "{{ trove_api_listen_port }}" tls_backend: "{{ trove_enable_tls_backend }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" trove_api_external: enabled: "{{ enable_trove }}" mode: "http" @@ -28,7 +29,8 @@ trove_services: external_fqdn: "{{ trove_external_fqdn }}" port: "{{ trove_api_public_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" trove-conductor: container_name: trove_conductor group: trove-conductor @@ -106,7 +108,7 @@ trove_api_healthcheck_test: - "CMD-SHELL" - >- healthcheck_curl {{ 'https' if trove_enable_tls_backend | bool else 'http' }}://{{ - api_interface_address | put_address_in_context('url') }}:{{ trove_api_port }} + api_interface_address | put_address_in_context('url') }}:{{ trove_api_port }}/healthcheck trove_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" trove_api_healthcheck: interval: "{{ trove_api_healthcheck_interval }}" diff --git a/ansible/roles/watcher/defaults/main.yml b/ansible/roles/watcher/defaults/main.yml index d22e5ad99..86a68d5b4 100644 --- a/ansible/roles/watcher/defaults/main.yml +++ b/ansible/roles/watcher/defaults/main.yml @@ -17,6 +17,7 @@ watcher_services: listen_port: "{{ watcher_api_listen_port }}" backend_http_extra: - "option httpchk GET /" + - "http-check expect status 200" watcher_api_external: enabled: "{{ enable_watcher }}" mode: "http" @@ -26,6 +27,7 @@ watcher_services: listen_port: "{{ watcher_api_listen_port }}" backend_http_extra: - "option httpchk GET /" + - "http-check expect status 200" watcher-applier: container_name: watcher_applier group: watcher-applier diff --git a/ansible/roles/zun/defaults/main.yml b/ansible/roles/zun/defaults/main.yml index a35d0ddfa..01a577f20 100644 --- a/ansible/roles/zun/defaults/main.yml +++ b/ansible/roles/zun/defaults/main.yml @@ -17,7 +17,8 @@ zun_services: port: "{{ zun_api_port }}" listen_port: "{{ zun_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" zun_api_external: enabled: "{{ enable_zun }}" mode: "http" @@ -26,7 +27,8 @@ zun_services: port: "{{ zun_api_public_port }}" listen_port: "{{ zun_api_listen_port }}" backend_http_extra: - - "option httpchk" + - "option httpchk GET /healthcheck" + - "http-check expect status 200" zun-wsproxy: container_name: zun_wsproxy group: zun-wsproxy @@ -127,7 +129,7 @@ zun_api_enable_healthchecks: "{{ enable_container_healthchecks }}" zun_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}" zun_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}" zun_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}" -zun_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ zun_api_port }}"] +zun_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ zun_api_port }}/healthcheck"] zun_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}" zun_api_healthcheck: interval: "{{ zun_api_healthcheck_interval }}" diff --git a/releasenotes/notes/add-healthcheck-a7b535c31bb72cfe.yaml b/releasenotes/notes/add-healthcheck-a7b535c31bb72cfe.yaml new file mode 100644 index 000000000..9b0082db7 --- /dev/null +++ b/releasenotes/notes/add-healthcheck-a7b535c31bb72cfe.yaml @@ -0,0 +1,14 @@ +--- +features: + - | + Standardized health check endpoints for OpenStack API + services and supporting components (Grafana, etcd, influxdb, + rabbitmq). Both HAProxy and Docker health checks now use + dedicated endpoints like **/healthcheck**, **/api/health**, + or service-specific paths for consistent and reliable detection. + + Health checks now explicitly expect HTTP 200 status codes + and use standardized curl commands across all services. + + Docker container health checks have been unified with + HAProxy configurations, using the same dedicated endpoints. |
