fdacf9d1d9
When using externally managed certificates, according to [1], one should set `kolla_externally_managed_cert: yes` and ensure that the certificates are in the correct place. However, RabbitMQ precheck still expects the certificates to be available on the controller node. This is incorrect. Fix by not running the tasks in question when `kolla_externally_managed_cert: yes` [1] https://docs.openstack.org/kolla-ansible/latest/admin/tls.html Closes-Bug: 1999081 Related-Bug: 1940286 Signed-off-by: Magnus Lööf <magnus.loof@basalt.se> Change-Id: I9f845a7bdf5055165e199ab1887ed3ccbfb9d808
226 lines
7.6 KiB
YAML
226 lines
7.6 KiB
YAML
---
|
|
- import_role:
|
|
name: service-precheck
|
|
vars:
|
|
service_precheck_services: "{{ rabbitmq_services }}"
|
|
service_name: "{{ project_name }}"
|
|
|
|
- name: Get container facts
|
|
become: true
|
|
kolla_container_facts:
|
|
container_engine: "{{ kolla_container_engine }}"
|
|
name:
|
|
- rabbitmq
|
|
- outward_rabbitmq
|
|
check_mode: false
|
|
register: container_facts
|
|
|
|
- name: Checking free port for RabbitMQ
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ rabbitmq_port }}"
|
|
connect_timeout: 1
|
|
timeout: 1
|
|
state: stopped
|
|
when:
|
|
- container_facts['rabbitmq'] is not defined
|
|
- inventory_hostname in groups['rabbitmq']
|
|
|
|
- name: Checking free port for RabbitMQ Management
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ rabbitmq_management_port }}"
|
|
connect_timeout: 1
|
|
timeout: 1
|
|
state: stopped
|
|
when:
|
|
- container_facts['rabbitmq'] is not defined
|
|
- inventory_hostname in groups['rabbitmq']
|
|
|
|
- name: Checking free port for RabbitMQ Cluster
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ rabbitmq_cluster_port }}"
|
|
connect_timeout: 1
|
|
timeout: 1
|
|
state: stopped
|
|
when:
|
|
- container_facts['rabbitmq'] is not defined
|
|
- inventory_hostname in groups['rabbitmq']
|
|
|
|
- name: Checking free port for RabbitMQ EPMD
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ rabbitmq_epmd_port }}"
|
|
connect_timeout: 1
|
|
timeout: 1
|
|
state: stopped
|
|
when:
|
|
- container_facts['rabbitmq'] is not defined
|
|
- inventory_hostname in groups['rabbitmq']
|
|
|
|
- name: Check if all rabbit hostnames are resolvable
|
|
vars:
|
|
nss_database: "{{ 'ahostsv4' if api_address_family == 'ipv4' else 'ahostsv6' }}"
|
|
command: "getent {{ nss_database }} {{ hostvars[item].ansible_facts.hostname }}"
|
|
changed_when: false
|
|
check_mode: false
|
|
register: rabbitmq_hostnames
|
|
with_items: "{{ groups['rabbitmq'] }}"
|
|
|
|
- name: Check if each rabbit hostname resolves uniquely to the proper IP address
|
|
fail:
|
|
msg: Hostname has to resolve uniquely to the IP address of api_interface
|
|
with_subelements:
|
|
- "{{ rabbitmq_hostnames.results }}"
|
|
- stdout_lines
|
|
when:
|
|
- not item.1 is match('^'+('api' | kolla_address(item.0.item))+'\\b')
|
|
|
|
- name: Check if TLS certificate exists for RabbitMQ
|
|
assert:
|
|
that: cert | length > 0
|
|
fail_msg: No TLS certificate provided for RabbitMQ.
|
|
vars:
|
|
cert: "{{ query('first_found', paths, errors='ignore') }}"
|
|
paths:
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}/rabbitmq-cert.pem"
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}-cert.pem"
|
|
- "{{ kolla_certificates_dir }}/rabbitmq-cert.pem"
|
|
when:
|
|
- not kolla_externally_managed_cert | bool
|
|
- rabbitmq_enable_tls | bool
|
|
|
|
- name: Check if TLS key exists for RabbitMQ
|
|
assert:
|
|
that: key | length > 0
|
|
fail_msg: No TLS key provided for RabbitMQ.
|
|
vars:
|
|
key: "{{ query('first_found', paths, errors='ignore') }}"
|
|
paths:
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}/rabbitmq-key.pem"
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}-key.pem"
|
|
- "{{ kolla_certificates_dir }}/rabbitmq-key.pem"
|
|
when:
|
|
- not kolla_externally_managed_cert | bool
|
|
- rabbitmq_enable_tls | bool
|
|
|
|
- name: Checking free port for outward RabbitMQ
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ outward_rabbitmq_port }}"
|
|
connect_timeout: 1
|
|
state: stopped
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
- inventory_hostname in groups['outward-rabbitmq']
|
|
- container_facts['outward_rabbitmq'] is not defined
|
|
|
|
- name: Checking free port for outward RabbitMQ Management
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ outward_rabbitmq_management_port }}"
|
|
connect_timeout: 1
|
|
state: stopped
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
- inventory_hostname in groups['outward-rabbitmq']
|
|
- container_facts['outward_rabbitmq'] is not defined
|
|
|
|
- name: Checking free port for outward RabbitMQ Cluster
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ outward_rabbitmq_cluster_port }}"
|
|
connect_timeout: 1
|
|
state: stopped
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
- inventory_hostname in groups['outward-rabbitmq']
|
|
- container_facts['outward_rabbitmq'] is not defined
|
|
|
|
- name: Checking free port for outward RabbitMQ EPMD
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ outward_rabbitmq_epmd_port }}"
|
|
connect_timeout: 1
|
|
state: stopped
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
- inventory_hostname in groups['outward-rabbitmq']
|
|
- container_facts['outward_rabbitmq'] is not defined
|
|
|
|
- name: Check if all outward rabbit hostnames are resolvable
|
|
vars:
|
|
nss_database: "{{ 'ahostsv4' if api_address_family == 'ipv4' else 'ahostsv6' }}"
|
|
command: "getent {{ nss_database }} {{ hostvars[item].ansible_facts.hostname }}"
|
|
changed_when: false
|
|
check_mode: false
|
|
register: outward_rabbitmq_hostnames
|
|
with_items: "{{ groups['outward-rabbitmq'] }}"
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
|
|
- name: Check if each rabbit hostname resolves uniquely to the proper IP address
|
|
fail:
|
|
msg: Hostname has to resolve uniquely to the IP address of api_interface
|
|
with_subelements:
|
|
- "{{ outward_rabbitmq_hostnames.results }}"
|
|
- stdout_lines
|
|
when:
|
|
- enable_outward_rabbitmq | bool
|
|
- not item.1 is match('^'+('api' | kolla_address(item.0.item))+'\\b')
|
|
|
|
- name: Check if TLS certificate exists for outward RabbitMQ
|
|
assert:
|
|
that: cert | length > 0
|
|
fail_msg: No TLS certificate provided for outward RabbitMQ.
|
|
vars:
|
|
cert: "{{ query('first_found', paths, errors='ignore') }}"
|
|
paths:
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}/outward_rabbitmq-cert.pem"
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}-cert.pem"
|
|
- "{{ kolla_certificates_dir }}/outward_rabbitmq-cert.pem"
|
|
when:
|
|
- not kolla_externally_managed_cert | bool
|
|
- enable_outward_rabbitmq | bool
|
|
- rabbitmq_enable_tls | bool
|
|
|
|
- name: Check if TLS key exists for outward RabbitMQ
|
|
assert:
|
|
that: key | length > 0
|
|
msg: No TLS key provided for outward RabbitMQ.
|
|
vars:
|
|
key: "{{ query('first_found', paths, errors='ignore') }}"
|
|
paths:
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}/outward_rabbitmq-key.pem"
|
|
- "{{ kolla_certificates_dir }}/{{ inventory_hostname }}-key.pem"
|
|
- "{{ kolla_certificates_dir }}/outward_rabbitmq-key.pem"
|
|
when:
|
|
- not kolla_externally_managed_cert | bool
|
|
- enable_outward_rabbitmq | bool
|
|
- rabbitmq_enable_tls | bool
|
|
|
|
- block:
|
|
- name: List RabbitMQ policies
|
|
become: true
|
|
command: "{{ kolla_container_engine }} exec rabbitmq rabbitmqctl list_policies --silent"
|
|
register: rabbitmq_policies
|
|
changed_when: false
|
|
check_mode: false
|
|
|
|
- name: Check if RabbitMQ HA needs to be configured
|
|
assert:
|
|
that: "'ha-all' in rabbitmq_policies.stdout"
|
|
fail_msg: >
|
|
om_enable_rabbitmq_high_availability is True but no mirroring policy has been found.
|
|
Currently the procedure to migrate from transient non-mirrored queues to durable mirrored queues is manual.
|
|
Please follow the process described here: https://docs.openstack.org/kolla-ansible/latest/reference/message-queues/rabbitmq.html#high-availability.
|
|
Note that this process may take several hours on larger systems, and may cause a degredation in performance at large scale.
|
|
If you do not wish to enable this feature, set om_enable_rabbitmq_high_availability to False.
|
|
|
|
run_once: true
|
|
when:
|
|
- container_facts['rabbitmq'] is defined
|
|
- om_enable_rabbitmq_high_availability | bool
|
|
tags: rabbitmq-ha-precheck
|