diff --git a/changelogs/fragments/988-cloudwatch_metric_alarm_info-add-new-module.yml b/changelogs/fragments/988-cloudwatch_metric_alarm_info-add-new-module.yml new file mode 100644 index 00000000000..7bd35fb878a --- /dev/null +++ b/changelogs/fragments/988-cloudwatch_metric_alarm_info-add-new-module.yml @@ -0,0 +1,2 @@ +minor_changes: +- cloudwatch_metric_alarm_info - Added a new module that describes the cloudwatch metric alarms (https://github.com/ansible-collections/amazon.aws/pull/988). diff --git a/meta/runtime.yml b/meta/runtime.yml index d5b1c573ca0..ce1935ddca0 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -16,6 +16,7 @@ action_groups: - cloudwatchlogs_log_group - cloudwatchlogs_log_group_info - cloudwatchlogs_log_group_metric_filter + - cloudwatch_metric_alarm_info - ec2_ami - ec2_ami_info - ec2_eip diff --git a/plugins/modules/cloudwatch_metric_alarm_info.py b/plugins/modules/cloudwatch_metric_alarm_info.py new file mode 100644 index 00000000000..d78e8302e49 --- /dev/null +++ b/plugins/modules/cloudwatch_metric_alarm_info.py @@ -0,0 +1,321 @@ +#!/usr/bin/python +# This file is part of Ansible +# GNU General Public License v3.0+ (see COPYING or https://wwww.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = ''' +--- +module: cloudwatch_metric_alarm_info +version_added: 5.0.0 +short_description: Gather information about the alarms for the specified metric +description: + - Retrieves the alarms for the specified metric. +author: + - Mandar Vijay Kulkarni (@mandar242) +options: + alarm_names: + description: + - The name of the metric. + required: false + type: list + elements: str + alarm_name_prefix: + description: + - An alarm name prefix to retrieve information about alarms that have names that start with this prefix. + - Can not be used with I(alarm_names). + required: false + type: str + alarm_type: + description: + - Specify this to return metric alarms or composite alarms. + - Module is defaulted to return metric alarms but can return composite alarms if I(alarm_type=CompositeAlarm). + required: false + type: str + default: MetricAlarm + choices: ['CompositeAlarm', 'MetricAlarm'] + children_of_alarm_name: + description: + - If specified returns information about the "children" alarms of the alarm name specified. + required: false + type: str + parents_of_alarm_name: + description: + - If specified returns information about the "parent" alarms of the alarm name specified. + required: false + type: str + state_value: + description: + - If specified returns information only about alarms that are currently in the particular state. + required: false + type: str + choices: ['OK', 'ALARM', 'INSUFFICIENT_DATA'] + action_prefix: + description: + - This parameter can be used to filter the results of the operation to only those alarms that use a certain alarm action. + required: false + type: str + +extends_documentation_fragment: +- amazon.aws.aws +- amazon.aws.ec2 +''' + +EXAMPLES = ''' +# Note: These examples do not set authentication details, see the AWS Guide for details. + +- name: describe the metric alarm based on alarm names + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - my-test-alarm-1 + - my-test-alarm-2 + +- name: describe the metric alarm based alarm names and state value + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - my-test-alarm-1 + - my-test-alarm-2 + state_value: OK + +- name: describe the metric alarm based alarm names prefix + amazon.aws.cloudwatch_metric_alarm_info: + alarm_name_prefix: my-test- + +''' + +RETURN = ''' +metric_alarms: + description: The gathered information about specified metric alarms. + returned: when success + type: list + elements: dict + contains: + alarm_name: + description: Unique name for the alarm. + returned: always + type: str + alarm_arn: + description: The Amazon Resource Name (ARN) of the alarm. + returned: always + type: str + alarm_description: + description: The description of the alarm. + returned: always + type: str + alarm_configuration_updated_timestamp: + description: The time stamp of the last update to the alarm configuration. + returned: always + type: str + actions_enabled: + description: Indicates whether actions should be executed during any changes to the alarm state. + returned: always + type: bool + ok_actions: + description: The actions to execute when this alarm transitions to an OK state from any other state. + returned: always + type: list + elements: str + alarm_actions: + description: The actions to execute when this alarm transitions to an ALARM state from any other state. + returned: always + type: list + elements: str + insufficient_data_actions: + description: The actions to execute when this alarm transitions to an INSUFFICIENT_DATA state from any other state. + returned: always + type: list + elements: str + state_value: + description: The state value for the alarm. + returned: always + type: str + state_reason: + description: An explanation for the alarm state, in text format. + returned: always + type: str + state_reason_data: + description: An explanation for the alarm state, in JSON format. + returned: always + type: str + state_updated_timestamp: + description: The time stamp of the last update to the alarm state. + returned: always + type: str + metric_name: + description: Name of the monitored metric (e.g. C(CPUUtilization)). + returned: always + type: str + namespace: + description: + - Name of the appropriate namespace (C(AWS/EC2), C(System/Linux), etc.). + - Determines the category it will appear under in CloudWatch. + returned: always + type: str + statistic: + description: The statistic for the metric associated with the alarm, other than percentile. + returned: always + type: str + extended_statistic: + description: The percentile statistic for the metric associated with the alarm. + returned: always + type: str + dimensions: + description: The dimensions for the metric. + returned: always + type: list + elements: dict + contains: + name: + description: The name of the dimension. + returned: always + type: str + value: + description: The value of the dimension. + returned: always + type: str + period: + description: + - The length, in seconds, used each time the metric specified in MetricName is evaluated. + - Valid values are 10, 30, and any multiple of 60. + returned: always + type: int + unit: + description: Unit used when storing the metric + returned: always + type: str + evaluation_period: + description: The number of periods over which data is compared to the specified threshold. + returned: always + type: int + datapoints_to_alarm: + description: The number of data points that must be breaching to trigger the alarm. + returned: always + type: int + threshold: + description: The value to compare with the specified statistic. + returned: always + type: float + comparison_operator: + description: The arithmetic operation to use when comparing the specified statistic and threshold. + returned: always + type: str + treat_missing_data: + description: Sets how alarm is to handle missing data points. + returned: always + type: str + evaluate_low_sample_count_percentile: + description: + - Used only for alarms based on percentiles. + - If I(ignore), the alarm state does not change during periods with too few data points to be statistically significant. + - If I(evaluate) or this parameter is not used, the alarm is always evaluated and possibly changes state. + returned: always + type: str + metrics: + description: An array of MetricDataQuery structures, used in an alarm based on a metric math expression. + returned: always + type: list + elements: dict + threshold_metric_id: + description: This is the ID of the ANOMALY_DETECTION_BAND function used as the threshold for the alarm. + returned: always + type: str + +''' + + +try: + import botocore +except ImportError: + pass # Handled by AnsibleAWSModule + +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + + +@AWSRetry.jittered_backoff(retries=10) +def _describe_alarms(connection, **params): + paginator = connection.get_paginator('describe_alarms') + return paginator.paginate(**params).build_full_result() + + +def describe_metric_alarms_info(connection, module): + + params = build_params(module) + + alarm_type_to_return = module.params.get('alarm_type') + + try: + describe_metric_alarms_info_response = _describe_alarms(connection, **params) + # describe_metric_alarms_info_response = describe_metric_alarms_info_response[alarm_type_to_return] + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: + module.fail_json_aws(e, msg='Failed to describe cloudwatch metric alarm') + + result = [] + + if alarm_type_to_return == 'CompositeAlarm': + for response_list_item in describe_metric_alarms_info_response['CompositeAlarms']: + result.append(camel_dict_to_snake_dict(response_list_item)) + module.exit_json(composite_alarms=result) + + for response_list_item in describe_metric_alarms_info_response['MetricAlarms']: + result.append(camel_dict_to_snake_dict(response_list_item)) + + module.exit_json(metric_alarms=result) + + +def build_params(module): + + params = {} + + if module.params.get('alarm_names'): + params['AlarmNames'] = module.params.get('alarm_names') + + if module.params.get('alarm_name_prefix'): + params['AlarmNamePrefix'] = module.params.get('alarm_name_prefix') + + if module.params.get('children_of_alarm_name'): + params['ChildrenOfAlarmName'] = module.params.get('children_of_alarm_name') + + if module.params.get('parents_of_alarm_name'): + params['ParentsOfAlarmName'] = module.params.get('parents_of_alarm_name') + + if module.params.get('state_value'): + params['StateValue'] = module.params.get('state_value') + + if module.params.get('action_prefix'): + params['ActionPrefix'] = module.params.get('action_prefix') + + return params + + +def main(): + + argument_spec = dict( + alarm_names=dict(type='list', elements='str', required=False), + alarm_name_prefix=dict(type='str', required=False), + alarm_type=dict(type='str', choices=['CompositeAlarm', 'MetricAlarm'], default='MetricAlarm', required=False), + children_of_alarm_name=dict(type='str', required=False), + parents_of_alarm_name=dict(type='str', required=False), + state_value=dict(type='str', choices=['OK', 'ALARM', 'INSUFFICIENT_DATA'], required=False), + action_prefix=dict(type='str', required=False), + ) + + module = AnsibleAWSModule( + argument_spec=argument_spec, + mutually_exclusive=[['alarm_names', 'alarm_name_prefix']], + supports_check_mode=True + ) + + try: + connection = module.client('cloudwatch', retry_decorator=AWSRetry.jittered_backoff()) + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: + module.fail_json_aws(e, msg='Failed to connect to AWS') + + describe_metric_alarms_info(connection, module) + + +if __name__ == '__main__': + main() diff --git a/tests/integration/targets/cloudwatch_metric_alarm/tasks/main.yml b/tests/integration/targets/cloudwatch_metric_alarm/tasks/main.yml index f713f973251..13476e84f97 100644 --- a/tests/integration/targets/cloudwatch_metric_alarm/tasks/main.yml +++ b/tests/integration/targets/cloudwatch_metric_alarm/tasks/main.yml @@ -13,12 +13,9 @@ include_tasks: env_setup.yml - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" register: alarm_info_query - name: Make instance in a default subnet of the VPC @@ -59,24 +56,17 @@ register: ec2_instance_metric_alarm_check - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query_check - - - name: convert it to an object - set_fact: - alarm_info_check: '{{ alarm_info_query_check.stdout | from_json }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info_check - - name: verify that an alarm was not created in check mode + - name: "verify that an alarm was not created in check mode" assert: that: - - ec2_instance_metric_alarm_check.changed - - not ec2_instance_metric_alarm_check.alarm_arn - - alarm_info_check["MetricAlarms"] | length == 0 + - 'ec2_instance_metric_alarm_check.changed' + - 'not ec2_instance_metric_alarm_check.alarm_arn' + - 'alarm_info_check.metric_alarms | length == 0' - name: create ec2 metric alarm on ec2 instance ec2_metric_alarm: @@ -98,34 +88,27 @@ register: ec2_instance_metric_alarm - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query - - - name: convert it to an object - set_fact: - alarm_info: '{{ alarm_info_query.stdout | from_json }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info - - name: verify that an alarm was created + - name: "verify that an alarm was created" assert: that: - - ec2_instance_metric_alarm.changed - - ec2_instance_metric_alarm.alarm_arn - - ec2_instance_metric_alarm.statistic == alarm_info["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm.name == alarm_info["MetricAlarms"][0].AlarmName - - ec2_instance_metric_alarm.metric == alarm_info["MetricAlarms"][0].MetricName - - ec2_instance_metric_alarm.namespace == alarm_info["MetricAlarms"][0].Namespace - - ec2_instance_metric_alarm.comparison == alarm_info["MetricAlarms"][0].ComparisonOperator - - ec2_instance_metric_alarm.threshold == alarm_info["MetricAlarms"][0].Threshold - - ec2_instance_metric_alarm.period == alarm_info["MetricAlarms"][0].Period - - ec2_instance_metric_alarm.unit == alarm_info["MetricAlarms"][0].Unit - - ec2_instance_metric_alarm.evaluation_periods == alarm_info["MetricAlarms"][0].EvaluationPeriods - - ec2_instance_metric_alarm.description == alarm_info["MetricAlarms"][0].AlarmDescription - - ec2_instance_metric_alarm.treat_missing_data == alarm_info["MetricAlarms"][0].TreatMissingData + - 'ec2_instance_metric_alarm.changed' + - 'ec2_instance_metric_alarm.alarm_arn' + - 'ec2_instance_metric_alarm.statistic == alarm_info.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm.name == alarm_info.metric_alarms[0].alarm_name' + - 'ec2_instance_metric_alarm.metric == alarm_info.metric_alarms[0].metric_name' + - 'ec2_instance_metric_alarm.namespace == alarm_info.metric_alarms[0].namespace' + - 'ec2_instance_metric_alarm.comparison == alarm_info.metric_alarms[0].comparison_operator' + - 'ec2_instance_metric_alarm.threshold == alarm_info.metric_alarms[0].threshold' + - 'ec2_instance_metric_alarm.period == alarm_info.metric_alarms[0].period' + - 'ec2_instance_metric_alarm.unit == alarm_info.metric_alarms[0].unit' + - 'ec2_instance_metric_alarm.evaluation_periods == alarm_info.metric_alarms[0].evaluation_periods' + - 'ec2_instance_metric_alarm.description == alarm_info.metric_alarms[0].alarm_description' + - 'ec2_instance_metric_alarm.treat_missing_data == alarm_info.metric_alarms[0].treat_missing_data' - name: create ec2 metric alarm on ec2 instance (idempotent) (check mode) ec2_metric_alarm: @@ -148,42 +131,33 @@ register: ec2_instance_metric_alarm_idempotent_check - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query_idempotent_check - - - name: convert it to an object - set_fact: - alarm_info_idempotent_check: '{{ alarm_info_query_idempotent_check.stdout | - from_json }}' - - - name: Verify alarm does not register as changed after update in check mode + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info_idempotent_check + + - name: "Verify alarm does not register as changed after update in check mode" assert: that: - - not ec2_instance_metric_alarm_idempotent_check.changed + - not ec2_instance_metric_alarm_idempotent_check.changed - - name: Verify alarm did not change after updating in check mode + - name: "Verify alarm did not change after updating in check mode" assert: that: - - alarm_info['MetricAlarms'][0]['{{item}}'] == alarm_info_idempotent_check['MetricAlarms'][0]['{{ - item }}'] + - "alarm_info.metric_alarms[0]['{{item}}'] == alarm_info_idempotent_check.metric_alarms[0]['{{ item }}']" with_items: - - AlarmArn - - Statistic - - AlarmName - - MetricName - - Namespace - - ComparisonOperator - - Threshold - - Period - - Unit - - EvaluationPeriods - - AlarmDescription - - TreatMissingData + - alarm_arn + - statistic + - alarm_name + - metric_name + - namespace + - comparison_operator + - threshold + - period + - unit + - evaluation_periods + - alarm_description + - treat_missing_data - name: create ec2 metric alarm on ec2 instance (idempotent) ec2_metric_alarm: @@ -205,41 +179,33 @@ register: ec2_instance_metric_alarm_idempotent - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query_idempotent - - - name: convert it to an object - set_fact: - alarm_info_idempotent: '{{ alarm_info_query_idempotent.stdout | from_json }}' - - - name: Verify alarm does not register as changed after update + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info_idempotent_check + + - name: "Verify alarm does not register as changed after update in check mode" assert: that: - - not ec2_instance_metric_alarm_idempotent.changed + - not ec2_instance_metric_alarm_idempotent_check.changed - - name: Verify alarm did not change after updating + - name: "Verify alarm did not change after updating in check mode" assert: that: - - alarm_info['MetricAlarms'][0]['{{item}}'] == alarm_info_idempotent['MetricAlarms'][0]['{{ - item }}'] + - "alarm_info.metric_alarms[0]['{{item}}'] == alarm_info_idempotent_check.metric_alarms[0]['{{ item }}']" with_items: - - AlarmArn - - Statistic - - AlarmName - - MetricName - - Namespace - - ComparisonOperator - - Threshold - - Period - - Unit - - EvaluationPeriods - - AlarmDescription - - TreatMissingData + - alarm_arn + - statistic + - alarm_name + - metric_name + - namespace + - comparison_operator + - threshold + - period + - unit + - evaluation_periods + - alarm_description + - treat_missing_data - name: update alarm (check mode) ec2_metric_alarm: @@ -269,18 +235,18 @@ assert: that: - ec2_instance_metric_alarm_update_check.changed - - ec2_instance_metric_alarm_update_check.period == alarm_info["MetricAlarms"][0].Period # Period of actual alarm should not change - - ec2_instance_metric_alarm_update_check.alarm_arn == ec2_instance_metric_alarm.alarm_arn - - ec2_instance_metric_alarm_update_check.statistic == alarm_info["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm_update_check.name == alarm_info["MetricAlarms"][0].AlarmName - - ec2_instance_metric_alarm_update_check.metric == alarm_info["MetricAlarms"][0].MetricName - - ec2_instance_metric_alarm_update_check.namespace == alarm_info["MetricAlarms"][0].Namespace - - ec2_instance_metric_alarm_update_check.statistic == alarm_info["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm_update_check.comparison == alarm_info["MetricAlarms"][0].ComparisonOperator - - ec2_instance_metric_alarm_update_check.threshold == alarm_info["MetricAlarms"][0].Threshold - - ec2_instance_metric_alarm_update_check.unit == alarm_info["MetricAlarms"][0].Unit - - ec2_instance_metric_alarm_update_check.evaluation_periods == alarm_info["MetricAlarms"][0].EvaluationPeriods - - ec2_instance_metric_alarm_update_check.treat_missing_data == alarm_info["MetricAlarms"][0].TreatMissingData + - 'ec2_instance_metric_alarm_update_check.period == alarm_info.metric_alarms[0].period' # Period of actual alarm should not change + - 'ec2_instance_metric_alarm_update_check.alarm_arn == ec2_instance_metric_alarm.alarm_arn' + - 'ec2_instance_metric_alarm_update_check.statistic == alarm_info.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm_update_check.name == alarm_info.metric_alarms[0].alarm_name' + - 'ec2_instance_metric_alarm_update_check.metric == alarm_info.metric_alarms[0].metric_name' + - 'ec2_instance_metric_alarm_update_check.namespace == alarm_info.metric_alarms[0].namespace' + - 'ec2_instance_metric_alarm_update_check.statistic == alarm_info.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm_update_check.comparison == alarm_info.metric_alarms[0].comparison_operator' + - 'ec2_instance_metric_alarm_update_check.threshold == alarm_info.metric_alarms[0].threshold' + - 'ec2_instance_metric_alarm_update_check.unit == alarm_info.metric_alarms[0].unit' + - 'ec2_instance_metric_alarm_update_check.evaluation_periods == alarm_info.metric_alarms[0].evaluation_periods' + - 'ec2_instance_metric_alarm_update_check.treat_missing_data == alarm_info.metric_alarms[0].treat_missing_data' - name: update alarm ec2_metric_alarm: @@ -311,16 +277,16 @@ - ec2_instance_metric_alarm_update.changed - ec2_instance_metric_alarm_update.period == 60 # Period should be 60, not matching old value - ec2_instance_metric_alarm_update.alarm_arn == ec2_instance_metric_alarm.alarm_arn - - ec2_instance_metric_alarm_update.statistic == alarm_info["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm_update.name == alarm_info["MetricAlarms"][0].AlarmName - - ec2_instance_metric_alarm_update.metric == alarm_info["MetricAlarms"][0].MetricName - - ec2_instance_metric_alarm_update.namespace == alarm_info["MetricAlarms"][0].Namespace - - ec2_instance_metric_alarm_update.statistic == alarm_info["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm_update.comparison == alarm_info["MetricAlarms"][0].ComparisonOperator - - ec2_instance_metric_alarm_update.threshold == alarm_info["MetricAlarms"][0].Threshold - - ec2_instance_metric_alarm_update.unit == alarm_info["MetricAlarms"][0].Unit - - ec2_instance_metric_alarm_update.evaluation_periods == alarm_info["MetricAlarms"][0].EvaluationPeriods - - ec2_instance_metric_alarm_update.treat_missing_data == alarm_info["MetricAlarms"][0].TreatMissingData + - 'ec2_instance_metric_alarm_update.statistic == alarm_info.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm_update.name == alarm_info.metric_alarms[0].alarm_name' + - 'ec2_instance_metric_alarm_update.metric == alarm_info.metric_alarms[0].metric_name' + - 'ec2_instance_metric_alarm_update.namespace == alarm_info.metric_alarms[0].namespace' + - 'ec2_instance_metric_alarm_update.statistic == alarm_info.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm_update.comparison == alarm_info.metric_alarms[0].comparison_operator' + - 'ec2_instance_metric_alarm_update.threshold == alarm_info.metric_alarms[0].threshold' + - 'ec2_instance_metric_alarm_update.unit == alarm_info.metric_alarms[0].unit' + - 'ec2_instance_metric_alarm_update.evaluation_periods == alarm_info.metric_alarms[0].evaluation_periods' + - 'ec2_instance_metric_alarm_update.treat_missing_data == alarm_info.metric_alarms[0].treat_missing_data' - name: try to remove the alarm (check mode) ec2_metric_alarm: @@ -335,22 +301,15 @@ - ec2_instance_metric_alarm_deletion_check.changed - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" register: alarm_info_query_check - - name: convert it to an object - set_fact: - alarm_info: '{{ alarm_info_query_check.stdout | from_json }}' - - name: Verify that the alarm was not deleted in check mode using cli assert: that: - - alarm_info["MetricAlarms"] | length > 0 + - 'alarm_info.metric_alarms | length > 0' - name: try to remove the alarm ec2_metric_alarm: @@ -364,22 +323,15 @@ - ec2_instance_metric_alarm_deletion.changed - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query - - - name: convert it to an object - set_fact: - alarm_info: '{{ alarm_info_query.stdout | from_json }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info - name: Verify that the alarm was deleted using cli assert: that: - - alarm_info["MetricAlarms"] | length == 0 + - 'alarm_info.metric_alarms | length == 0' - name: create ec2 metric alarm with no unit on ec2 instance ec2_metric_alarm: @@ -400,34 +352,27 @@ register: ec2_instance_metric_alarm_no_unit - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query_no_unit - - - name: convert it to an object - set_fact: - alarm_info_no_unit: '{{ alarm_info_query_no_unit.stdout | from_json }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info_no_unit - name: verify that an alarm was created assert: that: - ec2_instance_metric_alarm_no_unit.changed - ec2_instance_metric_alarm_no_unit.alarm_arn - - ec2_instance_metric_alarm_no_unit.statistic == alarm_info_no_unit["MetricAlarms"][0].Statistic - - ec2_instance_metric_alarm_no_unit.name == alarm_info_no_unit["MetricAlarms"][0].AlarmName - - ec2_instance_metric_alarm_no_unit.metric == alarm_info_no_unit["MetricAlarms"][0].MetricName - - ec2_instance_metric_alarm_no_unit.namespace == alarm_info_no_unit["MetricAlarms"][0].Namespace - - ec2_instance_metric_alarm_no_unit.comparison == alarm_info_no_unit["MetricAlarms"][0].ComparisonOperator - - ec2_instance_metric_alarm_no_unit.threshold == alarm_info_no_unit["MetricAlarms"][0].Threshold - - ec2_instance_metric_alarm_no_unit.period == alarm_info_no_unit["MetricAlarms"][0].Period - - alarm_info_no_unit["MetricAlarms"][0].Unit is not defined - - ec2_instance_metric_alarm_no_unit.evaluation_periods == alarm_info_no_unit["MetricAlarms"][0].EvaluationPeriods - - ec2_instance_metric_alarm_no_unit.description == alarm_info_no_unit["MetricAlarms"][0].AlarmDescription - - ec2_instance_metric_alarm_no_unit.treat_missing_data == alarm_info_no_unit["MetricAlarms"][0].TreatMissingData + - 'ec2_instance_metric_alarm_no_unit.statistic == alarm_info_no_unit.metric_alarms[0].statistic' + - 'ec2_instance_metric_alarm_no_unit.name == alarm_info_no_unit.metric_alarms[0].alarm_name' + - 'ec2_instance_metric_alarm_no_unit.metric == alarm_info_no_unit.metric_alarms[0].metric_name' + - 'ec2_instance_metric_alarm_no_unit.namespace == alarm_info_no_unit.metric_alarms[0].namespace' + - 'ec2_instance_metric_alarm_no_unit.comparison == alarm_info_no_unit.metric_alarms[0].comparison_operator' + - 'ec2_instance_metric_alarm_no_unit.threshold == alarm_info_no_unit.metric_alarms[0].threshold' + - 'ec2_instance_metric_alarm_no_unit.period == alarm_info_no_unit.metric_alarms[0].period' + - 'alarm_info_no_unit.metric_alarms[0].Unit is not defined' + - 'ec2_instance_metric_alarm_no_unit.evaluation_periods == alarm_info_no_unit.metric_alarms[0].evaluation_periods' + - 'ec2_instance_metric_alarm_no_unit.description == alarm_info_no_unit.metric_alarms[0].alarm_description' + - 'ec2_instance_metric_alarm_no_unit.treat_missing_data == alarm_info_no_unit.metric_alarms[0].treat_missing_data' - name: try to remove the alarm ec2_metric_alarm: @@ -441,22 +386,15 @@ - ec2_instance_metric_alarm_deletion_no_unit.changed - name: get info on alarms - command: aws cloudwatch describe-alarms --alarm-names {{ alarm_full_name }} - environment: - AWS_ACCESS_KEY_ID: '{{ aws_access_key }}' - AWS_SECRET_ACCESS_KEY: '{{ aws_secret_key }}' - AWS_SESSION_TOKEN: "{{ security_token | default('') }}" - AWS_DEFAULT_REGION: '{{ aws_region }}' - register: alarm_info_query_no_unit - - - name: convert it to an object - set_fact: - alarm_info_no_unit: '{{ alarm_info_query_no_unit.stdout | from_json }}' + amazon.aws.cloudwatch_metric_alarm_info: + alarm_names: + - "{{ alarm_full_name }}" + register: alarm_info_no_unit - name: Verify that the alarm was deleted using cli assert: that: - - alarm_info_no_unit["MetricAlarms"] | length == 0 + - 'alarm_info_no_unit.metric_alarms | length == 0' always: - name: try to delete the alarm