Initial alarm setup.

For the library merged code from https://github.com/hpcloud-mon/ansible-module-monasca

Change-Id: Ie387a60f787b79e13d5d430c23dc25a15f5aa2e2
This commit is contained in:
Tim Kuhlman 2014-11-26 16:09:38 -07:00
parent ab85b6291e
commit fbf1a0074c
5 changed files with 213 additions and 0 deletions

10
library/README.md Normal file
View File

@ -0,0 +1,10 @@
This directory is for Ansible modules used by this project.
The modules typically are maintained in separate git repos and added here. The preferred way to add in these repos
is with [git-subtree](https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt) as it avoids the end
user having to do anything special when downloading the code. Unfortunately this does not play well with gerrit which
is used by OpenStack. With the desire to still avoid the special clone syntax used with git submodule the files were just
imported from the upstream libraries.
- monasca comes from https://github.com/hpcloud-mon/ansible-module-monasca.git

1
library/monasca/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

17
library/monasca/README.md Normal file
View File

@ -0,0 +1,17 @@
# ansible-module-monasca
Ansible module for crud operations on Monasca alarm definitions
Example usage
tasks:
- name: Create System Alarm Definitions
monasca_alarm_definition:
name: "{{item.name}}"
expression: "{{item.expression}}"
keystone_url: "{{keystone_url}}"
keystone_user: "{{keystone_user}}"
keystone_password: "{{keystone_password}}"
with_items:
- { name: "High CPU usage", expression: "avg(cpu.idle_perc) < 10 times 3" }
More information on [Monasca](https://wiki.openstack.org/wiki/Monasca)

View File

@ -0,0 +1,145 @@
#!/usr/bin/env python
DOCUMENTATION = '''
---
module: monasca_alarm_definition
short_description: crud operations on Monasca alarm definitions
description:
- Performs crud operations (create/update/delete) on monasca alarm definitions
- Monasca project homepage - https://wiki.openstack.org/wiki/Monasca
author: Tim Kuhlman <tim@backgroundprocess.com>
requirements: [ python-monascaclient ]
options:
api_version:
required: false
default: '2_0'
description:
- The monasca api version.
description:
required: false
description:
- The description associated with the alarm
expression:
required: false
description:
- The alarm expression, required for create/update operations.
keystone_password:
required: true
description:
- Keystone password to use for authentication.
keystone_url:
required: true
description:
- Keystone url to authenticate against. Example http://192.168.10.5:5000/v3
keystone_user:
required: true
description:
- Keystone user to log in as.
monasca_api_url:
required: false
description:
- If unset the service endpoing registered with keystone will be used.
name:
required: true
description:
- The alarm definition name
severity:
required: false
default: "LOW"
description:
- The severity set for the alarm must be LOW, MEDIUM, HIGH or CRITICAL
state:
required: false
default: "present"
choices: [ present, absent ]
description:
- Whether the account should exist. When C(absent), removes the user account.
'''
EXAMPLES = '''
monasca_alarm: expression='avg(cpu.idle_perc) < 10 times 3' state=present name='High CPU Usage'
keystone_url=http://localhost:5000/v3.0 keystone_user=admin keystone_password=password
'''
from ansible.module_utils.basic import *
try:
from monascaclient import client
from monascaclient import ksclient
import requests
except ImportError:
monascaclient_found = False
else:
monascaclient_found = True
# Todo support check_mode
# ),
# supports_check_mode=True
# todo support setting alarm actions
# todo keep the keystone token across multiple runs
def main():
module = AnsibleModule(
argument_spec=dict(
api_version=dict(required=False, default='2_0', type='str'),
description=dict(required=False, type='str'),
expression=dict(required=False, type='str'),
keystone_password=dict(required=True, type='str'),
keystone_url=dict(required=True, type='str'),
keystone_user=dict(required=True, type='str'),
monasca_api_url=dict(required=False, type='str'),
name=dict(required=True, type='str'),
severity=dict(default='LOW', type='str'),
state=dict(default='present', choices=['present', 'absent'], type='str')
)
)
name = module.params['name']
expression = module.params['expression']
if not monascaclient_found:
module.fail_json(msg="python-monascaclient >= 1.0.9 is required")
# Authenticate to Keystone
ks = ksclient.KSClient(auth_url=module.params['keystone_url'], username=module.params['keystone_user'],
password=module.params['keystone_password'])
# construct the mon client
if module.params['monasca_api_url'] is None:
api_url = ks.monasca_url
else:
api_url = module.params['monasca_api_url']
monasca = client.Client(module.params['api_version'], api_url, token=ks.token)
# Find existing definitions
definitions = {definition['name']: definition for definition in monasca.alarm_definitions.list()}
if module.params['state'] == 'absent':
if name not in definitions.keys():
module.exit_json(changed=False)
resp = monasca.alarm_definitions.delete(alarm_id=definitions[name].id)
if resp.status_code == requests.codes.ok:
module.exit_json(changed=True)
else:
module.fail_json(msg=resp.text)
else: # Only other option is state=present
def_kwargs = {"name": name, "description": module.params['description'], "expression": expression,
"match_by": ["hostname"], "severity": module.params['severity']}
if name in definitions.keys():
if definitions[name]['expression'] == expression:
module.exit_json(changed=False)
body = monasca.alarm_definitions.patch(**def_kwargs)
else:
body = monasca.alarm_definitions.create(**def_kwargs)
if 'id' in body:
module.exit_json(changed=True)
else:
module.fail_json(msg=body)
if __name__ == "__main__":
main()

View File

@ -99,3 +99,43 @@
mysql_password: password,
tags: [thresh]}
- {role: tkuhlman.monasca-agent, tags: [agent]}
- name: Define default alarms
hosts: mini-mon
gather_facts: no
vars:
keystone_url: http://192.168.10.5:35357/v3/
keystone_user: mini-mon
keystone_password: password
tasks:
- name: Create System Alarm Definitions
monasca_alarm_definition:
name: "{{item.name}}"
expression: "{{item.expression}}"
keystone_url: "{{keystone_url}}"
keystone_user: "{{keystone_user}}"
keystone_password: "{{keystone_password}}"
with_items:
- { name: "High CPU usage", expression: "avg(cpu.idle_perc) < 10 times 3" }
- { name: "Disk Inode Usage", expression: "disk.inode_used_perc > 90" }
- { name: "Disk Usage", expression: "disk.space_used_perc > 90" }
- { name: "Memory usage", expression: "avg(mem.usable_perc) < 10 times 3" }
- { name: "Network Errors", expression: "net.in_errors >5 or net.out_errors > 5" }
tags:
- alarms
- system_alarms
- name: Create Monasca Alarm Definitions
monasca_alarm_definition:
name: "{{item.name}}"
expression: "{{item.expression}}"
keystone_url: "{{keystone_url}}"
keystone_user: "{{keystone_user}}"
keystone_password: "{{keystone_password}}"
with_items:
- { name: "Monasca Agent emit time", expression: "avg(monasca.emit_time_sec) > 2 times 3" }
- { name: "Monasca Agent collection time", expression: "avg(monasca.collection_time_sec) > 5 times 3" }
- { name: "Monasca Configuration DB query time", expression: "avg(monasca.config_db_time.95percentile) > 5 times 3" }
- { name: "Zookeeper Average Latency", expression: "avg(zookeeper.avg_latency_sec) > 1 times 3" }
tags:
- alarms
- monasca_alarms