diff --git a/tasks/main.yml b/tasks/main.yml index 022c5555..1b75fbf4 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -82,14 +82,30 @@ - name: Flush handlers meta: flush_handlers -- name: Importing rabbitmq_feature_flags tasks - include_tasks: rabbitmq_feature_flags.yml - args: - apply: - tags: - - rabbitmq-upgrade - tags: - - rabbitmq-upgrade +- name: Ensure all flags are set after upgrade is done when: - _rabbitmq_is_last_play_host - rabbitmq_upgrade + block: + - name: Including rabbitmq_cluster_state tasks + include_tasks: rabbitmq_cluster_state.yml + args: + apply: + tags: + - rabbitmq-upgrade + tags: + - rabbitmq-upgrade + + - name: Importing rabbitmq_feature_flags tasks + include_tasks: rabbitmq_feature_flags.yml + args: + apply: + tags: + - rabbitmq-upgrade + tags: + - rabbitmq-upgrade + when: + - _cluster_state + - (_cluster_state.get('running_nodes', []) | length) == (groups[rabbitmq_host_group] | length) + - (_cluster_state.get('alarms', []) | length) == 0 + - (_cluster_state.get('partitions', []) | length) == 0 diff --git a/tasks/rabbitmq_cluster_state.yml b/tasks/rabbitmq_cluster_state.yml new file mode 100644 index 00000000..08a5825f --- /dev/null +++ b/tasks/rabbitmq_cluster_state.yml @@ -0,0 +1,24 @@ +--- +# Copyright 2024, Cleura AB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- name: "Gather cluster status" + command: "rabbitmqctl cluster_status --formatter json" + register: _cluster_status + changed_when: False + failed_when: False + +- name: Define cluster_state fact + set_fact: + _cluster_state: "{{ (_cluster_status.rc == 0) | ternary(_cluster_status.stdout, {} | string) | from_json }}" diff --git a/tasks/rabbitmq_feature_flags.yml b/tasks/rabbitmq_feature_flags.yml index cd27fe6f..eb79c7f9 100644 --- a/tasks/rabbitmq_feature_flags.yml +++ b/tasks/rabbitmq_feature_flags.yml @@ -13,32 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -- name: "Gather cluster status" - command: "rabbitmqctl cluster_status --formatter json" - register: _cluster_status +- name: "Check for disabled RabbitMQ feature flags" + command: "rabbitmqctl list_feature_flags --formatter json name state stability" + register: _feature_flags changed_when: False failed_when: False - tags: - - rabbitmq-upgrade -- name: "Only enable feature flags if all cluster members are up and stable" - block: - - name: "Check for disabled RabbitMQ feature flags" - command: "rabbitmqctl list_feature_flags --formatter json name state stability" - register: _feature_flags - changed_when: False - failed_when: False - - - name: "Enable missing RabbitMQ feature flags" - command: "rabbitmqctl enable_feature_flag {{ flag['name'] }}" - changed_when: True - loop: "{{ _feature_flags.stdout | from_json | rejectattr('stability', 'eq', 'experimental') | selectattr('state', 'eq', 'disabled') }}" - loop_control: - loop_var: flag - when: - - _cluster_status.rc == 0 - - ((_cluster_status.stdout | from_json)['running_nodes'] | length) == (groups[rabbitmq_host_group] | length) - - ((_cluster_status.stdout | from_json)['alarms'] | length) == 0 - - ((_cluster_status.stdout | from_json)['partitions'] | length) == 0 - tags: - - rabbitmq-upgrade +# NOTE: changed_when required despite the above check because 'unstable' +# feature flags will remain disabled each time this runs +- name: "Enable missing RabbitMQ feature flags" + command: "rabbitmqctl enable_feature_flag {{ flag['name'] }}" + changed_when: False + loop: "{{ _feature_flags.stdout | from_json | rejectattr('stability', 'eq', 'experimental') | selectattr('state', 'eq', 'disabled') }}" + loop_control: + loop_var: flag