diff --git a/validations/library/pacemaker.py b/validations/library/pacemaker.py new file mode 100644 index 000000000..f1512d423 --- /dev/null +++ b/validations/library/pacemaker.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# 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. + +from xml.etree import ElementTree + +from ansible.module_utils.basic import * # NOQA + + +def parse_pcs_status(pcs_status_xml): + root = ElementTree.fromstring(pcs_status_xml) + result = { + 'failures': root.findall('failures/failure'), + } + return result + + +def format_failure(failure): + return ("Task {task} {op_key} failed on node {node}. Exit reason: " + "'{exitreason}'. Exit status: '{exitstatus}'." + .format(task=failure.get('task'), + op_key=failure.get('op_key'), + node=failure.get('node'), + exitreason=failure.get('exitreason'), + exitstatus=failure.get('exitstatus'))) + + +def main(): + module = AnsibleModule(argument_spec=dict( + status=dict(required=True, type='str'), + )) + + pcs_status = parse_pcs_status(module.params.get('status')) + failures = pcs_status['failures'] + failed = len(failures) > 0 + if failed: + msg = "The pacemaker status contains some failed actions:\n" +\ + '\n'.join((format_failure(failure) for failure in failures)) + else: + msg = "The pacemaker status reports no errors." + module.exit_json( + failed=failed, + msg=msg, + ) + + +if __name__ == '__main__': + main() diff --git a/validations/pacemaker-status.yaml b/validations/pacemaker-status.yaml new file mode 100644 index 000000000..7d7c97cf8 --- /dev/null +++ b/validations/pacemaker-status.yaml @@ -0,0 +1,19 @@ +--- +- hosts: controller + vars: + metadata: + name: Check the status of the pacemaker cluster + description: > + This runs `pcs status` and checks for any failed actions. + + A failed status post-deployment indicates something is not configured + correctly. This should also be run before upgrade as the process will + likely fail with a cluster that's not completely healthy. + groups: + - post-deployment + tasks: + - name: Get pacemaker status + command: pcs status xml + register: pcs_status + - name: Check pacemaker status + pacemaker: status="{{ pcs_status.stdout }}"