From df96ec783716223d3138aa065b07a9e7ffe4f90c Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Sat, 15 Apr 2017 21:10:30 +0530 Subject: [PATCH 01/10] Added module for snmp and syslog Signed-off-by: Rahul Gupta --- library/cisco_imc_snmp.py | 165 ++++++++++++++++++++++++++++ library/cisco_imc_snmp_trap.py | 161 +++++++++++++++++++++++++++ library/cisco_imc_snmp_user.py | 168 +++++++++++++++++++++++++++++ library/cisco_imc_syslog.py | 127 ++++++++++++++++++++++ library/cisco_imc_syslog_remote.py | 163 ++++++++++++++++++++++++++++ utils/cisco_imc.py | 20 ++-- 6 files changed, 794 insertions(+), 10 deletions(-) create mode 100644 library/cisco_imc_snmp.py create mode 100644 library/cisco_imc_snmp_trap.py create mode 100644 library/cisco_imc_snmp_user.py create mode 100644 library/cisco_imc_syslog.py create mode 100644 library/cisco_imc_syslog_remote.py diff --git a/library/cisco_imc_snmp.py b/library/cisco_imc_snmp.py new file mode 100644 index 0000000..a8cbcea --- /dev/null +++ b/library/cisco_imc_snmp.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_snmp +short_description: Configures SNMP on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the SNMP on a Cisco IMC Server +Input Params: + community: + description: community name + required: False + privilege: + description: SNMP community access + required: False + choices: ['disabled', 'limited', 'full'] + default: "disabled" + trap_community: + description: community to be used when generating traps + required: False + sys_contact: + description: system contact + required: False + sys_location: + description: system location + required: False + port: + description: SNMP port + required: False + default: "161" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_snmp: + community: + privilege: + trap_community: + sys_contact: + sys_location: + port: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + community=dict(required=False, type='str'), + com2_sec=dict(required=False, type='str', choices=['disabled', 'limited', 'full'], default="disabled"), + trap_community=dict(required=False, type='str'), + sys_contact=dict(required=False, type='str'), + sys_location=dict(required=False, type='str'), + port=dict(required=False, type='str', default="161"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_snmp(server, module): + from imcsdk.apis.admin.snmp import snmp_enable + from imcsdk.apis.admin.snmp import snmp_disable + from imcsdk.apis.admin.snmp import is_snmp_enabled + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = is_snmp_enabled(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + snmp_enable(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + snmp_disable(server) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_snmp(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_snmp_trap.py b/library/cisco_imc_snmp_trap.py new file mode 100644 index 0000000..00a5560 --- /dev/null +++ b/library/cisco_imc_snmp_trap.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_snmp_trap +short_description: Configures SNMP Trap on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the SNMP Trap on a Cisco IMC Server +Input Params: + hostname: + description: snmp trap ip address + required: True + port: + description: snmp port + required: True + version: + description: version + required: False + choices: ['v2c', 'v3'] + default: "v3" + notification_type: + description: snmp port + required: False + choices: ['informs', 'traps'] + default: "traps" + user: + description: user + required: False + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_snmp_trap: + hostname: + port: + version: + notification_type: + user: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + hostname=dict(required=True, type='str'), + port=dict(required=True, type='str'), + version=dict(required=False, type='str', choices=['v2c', 'v3'], default="v3"), + notification_type=dict(required=False, type='str', choices=['informs', 'traps'], default="traps"), + user=dict(required=False, type='str'), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_snmp_trap(server, module): + from imcsdk.apis.admin.snmp import snmp_trap_add + from imcsdk.apis.admin.snmp import snmp_trap_remove + from imcsdk.apis.admin.snmp import snmp_trap_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, trap_id = snmp_trap_exists(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + snmp_trap_add(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + snmp_trap_remove(server, trap_id) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_snmp_trap(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_snmp_user.py b/library/cisco_imc_snmp_user.py new file mode 100644 index 0000000..2e39c0f --- /dev/null +++ b/library/cisco_imc_snmp_user.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_snmp_user +short_description: Configures SNMP user on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the SNMP user on a Cisco IMC Server +Input Params: + name: + description: snmp username + required: True + security_level: + description: security level + required: False + choices: ['authpriv', 'authnopriv', 'noauthnopriv'] + default: "authpriv" + auth_pwd: + description: password + required: False + auth: + description: auth type + required: False + choices: ['MD5', 'SHA'] + default: "MD5" + privacy_pwd: + description: privacy password + required: False + privacy: + description: privacy type + required: False + choices: ['AES', 'DES'] + default: "AES" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_snmp_user: + name: + security_level: + auth_pwd: + auth: + privacy_pwd: + privacy: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + name=dict(required=True, type='str'), + security_level=dict(required=False, type='str', choices=['authpriv', 'authnopriv', 'noauthnopriv'], default="authpriv"), + auth_pwd=dict(required=False, type='str'), + auth=dict(required=False, type='str', choices=['MD5', 'SHA'], default="MD5"), + privacy_pwd=dict(required=False, type='str'), + privacy=dict(required=False, type='str', choices=['AES', 'DES'], default="AES"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_snmp_user(server, module): + from imcsdk.apis.admin.snmp import snmp_user_add + from imcsdk.apis.admin.snmp import snmp_user_remove + from imcsdk.apis.admin.snmp import snmp_user_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = snmp_user_exists(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + snmp_user_add(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + snmp_user_remove(server, mo.name) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_snmp_user(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_syslog.py b/library/cisco_imc_syslog.py new file mode 100644 index 0000000..954f54c --- /dev/null +++ b/library/cisco_imc_syslog.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_syslog +short_description: Configures system log on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the system log on a Cisco IMC Server +Input Params: + local_severity: + description: local minimmum severity to report + required: False + choices: ['alert', 'critical', 'debug', 'emergency', 'error', 'informational', 'notice', 'warning'] + remote_severity: + description: remote minimmum severity to report + required: False + choices: ['alert', 'critical', 'debug', 'emergency', 'error', 'informational', 'notice', 'warning'] + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_syslog: + local_severity: + remote_severity: + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + local_severity=dict(required=False, type='str', choices=['alert', 'critical', 'debug', 'emergency', 'error', 'informational', 'notice', 'warning']), + remote_severity=dict(required=False, type='str', choices=['alert', 'critical', 'debug', 'emergency', 'error', 'informational', 'notice', 'warning']), + ) + + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_syslog(server, module): + from imcsdk.apis.admin.syslog import syslog_configure + from imcsdk.apis.admin.syslog import syslog_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = syslog_exists(handle=server, **args_mo) + + if module.check_mode or exists: + return not exists, False + syslog_configure(handle=server, **args_mo) + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_syslog(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_syslog_remote.py b/library/cisco_imc_syslog_remote.py new file mode 100644 index 0000000..7a15099 --- /dev/null +++ b/library/cisco_imc_syslog_remote.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_syslog_remote +short_description: Enables remote system logs on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Enables system log for remote client on a Cisco IMC Server +Input Params: + hostname: + description: ip address of the remote host + required: True + name: + description: remote host type + required: False + choices: ['primary', 'secondary', 'tertiary'] + default: "primary" + port: + description: remote host port + required: False + default: "514" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_syslog_remote: + hostname: + name: + port: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + hostname=dict(required=True, type='str'), + name=dict(required=False, type='str', choices=['primary', 'secondary', 'tertiary'], default="primary"), + port=dict(required=False, type='str', default="514"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent', 'clear'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_syslog_remote(server, module): + from imcsdk.apis.admin.syslog import syslog_remote_enable + from imcsdk.apis.admin.syslog import syslog_remote_disable + from imcsdk.apis.admin.syslog import is_syslog_remote_enabled + from imcsdk.apis.admin.syslog import syslog_remote_clear + from imcsdk.apis.admin.syslog import is_syslog_remote_clear + + ansible = module.params + args_mo = _get_mo_params(ansible) + + if ansible["state"] == "clear": + exists, mo = is_syslog_remote_clear(handle=server, + name=args_mo['name']) + if module.check_mode or exists: + return not exists, False + syslog_remote_clear(handle=server, name=args_mo['name']) + return True, False + + exists, mo = is_syslog_remote_enabled(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + syslog_remote_enable(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + if ansible["state"] == "absent": + syslog_remote_disable(server, mo.name) + elif ansible["state"] == "clear": + syslog_remote_clear(server, mo.name) + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_syslog_remote(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/utils/cisco_imc.py b/utils/cisco_imc.py index 8350d34..39f1b30 100644 --- a/utils/cisco_imc.py +++ b/utils/cisco_imc.py @@ -10,8 +10,8 @@ class ImcConnection(): @staticmethod def is_login_param(param): - return param in ["ip", "username", "password", - "port", "secure", "proxy", "server"] + return param in ["imc_ip", "imc_username", "imc_password", + "imc_port", "imc_secure", "imc_proxy", "imc_server"] def __init__(self, module): if HAS_IMCSDK is False: @@ -23,19 +23,19 @@ def __init__(self, module): def login(self): ansible = self.module.params - server = ansible.get('server') + server = ansible.get('imc_server') if server: return server from imcsdk.imchandle import ImcHandle results = {} try: - server = ImcHandle(ip=ansible["ip"], - username=ansible["username"], - password=ansible["password"], - port=ansible["port"], - secure=ansible["secure"], - proxy=ansible["proxy"]) + server = ImcHandle(ip=ansible["imc_ip"], + username=ansible["imc_username"], + password=ansible["imc_password"], + port=ansible["imc_port"], + secure=ansible["imc_secure"], + proxy=ansible["imc_proxy"]) server.login() except Exception as e: results["msg"] = str(e) @@ -44,7 +44,7 @@ def login(self): return server def logout(self): - server = self.module.params.get('server') + server = self.module.params.get('imc_server') if server: # we used a pre-existing handle from a task. # do not logout From ad94b9be9532cdabfe953d1107270430e81f0d88 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Sun, 16 Apr 2017 14:38:23 +0530 Subject: [PATCH 02/10] Added module for ipmi Signed-off-by: Rahul Gupta --- library/cisco_imc_ipmi.py | 142 +++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 57 deletions(-) diff --git a/library/cisco_imc_ipmi.py b/library/cisco_imc_ipmi.py index 8044e6d..a8c3d4a 100644 --- a/library/cisco_imc_ipmi.py +++ b/library/cisco_imc_ipmi.py @@ -2,72 +2,120 @@ from ansible.module_utils.basic import * + DOCUMENTATION = ''' --- module: cisco_imc_ipmi -short_description: Configures ipmi a Cisco IMC Server -version_added: "0.9.0.0" +short_description: Configures ipmi on a Cisco IMC Server +version_added: 0.9.0.0 description: - - Configures the Serial Over Lan(SOL) service on a Cisco IMC Server + - Configures ipmi on a Cisco IMC Server Input Params: priv: - description: Privilege to be used + description: privilege level required: False - choices: ["admin", "user", "read-only"] - default: 'user' - + choices: ['admin', 'user', 'read-only'] + default: "admin" key: - description: Hexadecimal Key to be used for authentication + description: Optional encryption key as hexadecimal string required: False - + default: "'0'*40" server_id: description: Server Id to be specified for C3260 platforms - choices: ["admin", "read-only", "user"] - default: "read-only" - required: False - - state: - description: Used to create or delete the SOL console - choices: ["present", "absent"] - default: "present" required: False + default: 1 requirements: ['imcsdk'] -author: "Branson Matheson (brmathes@cisco.com)" +author: "Rahul Gupta(ragupta4@cisco.com)" ''' + EXAMPLES = ''' -- name: enable IPMI +- name: cisco_imc_ipmi: - priv: "admin" + priv: + key: + server_id: state: "present" ip: "192.168.1.1" username: "admin" password: "password" ''' + +def _argument_mo(): + return dict( + priv=dict(required=False, type='str', choices=['admin', 'user', 'read-only'], default="admin"), + key=dict(required=False, type='str', default="0"*40), + server_id=dict(required=False, type='str', default=1), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + def setup_ipmi(server, module): - from imcsdk.apis.admin.ipmi import ipmi_disable from imcsdk.apis.admin.ipmi import ipmi_enable + from imcsdk.apis.admin.ipmi import ipmi_disable from imcsdk.apis.admin.ipmi import is_ipmi_enabled ansible = module.params - priv, key, server_id = (ansible["priv"], - ansible["key"], ansible["server_id"]) + args_mo = _get_mo_params(ansible) + exists, mo = is_ipmi_enabled(handle=server, **args_mo) - exists = is_ipmi_enabled(server, server_id=server_id) - if ansible["state"] == "present": - if exists: - return False - if not module.check_mode: - ipmi_enable(server, priv=priv, key=key, server_id=server_id) + if module.check_mode or exists: + return not exists, False + ipmi_enable(handle=server, **args_mo) else: - if not exists: - return False - if not module.check_mode: - ipmi_disable(server, server_id=server_id) - return True + if module.check_mode or not exists: + return exists, False + ipmi_disable(server, args_mo['server_id']) + + return True, False def setup(server, module): @@ -75,7 +123,7 @@ def setup(server, module): err = False try: - results["changed"] = setup_ipmi(server, module) + results["changed"], err = setup_ipmi(server, module) except Exception as e: err = True @@ -87,29 +135,8 @@ def setup(server, module): def main(): from ansible.module_utils.cisco_imc import ImcConnection - module = AnsibleModule( - argument_spec=dict( - key=dict(required=False, type='str', default='0'*40), - server_id=dict(required=False, type='int', default=1), - priv=dict(required=False, default="read-only", - choices=["admin", "read-only", "user"], type='str'), - state=dict(required=False, default="present", - choices=["present", "absent"], type='str'), - - # ImcHandle - server=dict(required=False, type='dict'), - - # Imc server credentials - ip=dict(required=False, type='str'), - username=dict(required=False, default="admin", type='str'), - password=dict(required=False, type='str', no_log=True), - port=dict(required=False, default=None), - secure=dict(required=False, default=None), - proxy=dict(required=False, default=None) - ), - supports_check_mode=True - ) + module = _ansible_module_create() conn = ImcConnection(module) server = conn.login() results, err = setup(server, module) @@ -121,3 +148,4 @@ def main(): if __name__ == '__main__': main() + From cd15048d8b2ef0c385666f6bd19734b43fe391e6 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Fri, 21 Apr 2017 09:24:15 +0530 Subject: [PATCH 03/10] added module for redfish and certificate Signed-off-by: Rahul Gupta --- library/cisco_imc_certificate_request.py | 301 +++++++++++++++++++++++ library/cisco_imc_certificate_upload.py | 140 +++++++++++ library/cisco_imc_redfish.py | 113 +++++++++ 3 files changed, 554 insertions(+) create mode 100644 library/cisco_imc_certificate_request.py create mode 100644 library/cisco_imc_certificate_upload.py create mode 100644 library/cisco_imc_redfish.py diff --git a/library/cisco_imc_certificate_request.py b/library/cisco_imc_certificate_request.py new file mode 100644 index 0000000..58aa6ff --- /dev/null +++ b/library/cisco_imc_certificate_request.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_certificate +short_description: Generates certificate request on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Generates certificate request on a Cisco IMC Server +Input Params: + name: + description: certificate name + required: True + org: + description: organization name + required: True + locality: + description: locality + required: True + state: + description: state + required: True + country: + description: country code + required: True + choices: ['Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', + 'Anguilla', 'Antarctica', 'Antigua and Barbuda', 'Argentina', + 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', + 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', + 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', + 'Botswana', 'Bouvet Island', 'Brazil', 'British Indian Ocean Territory' + , 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', + 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', + 'Central African Republic', 'Chad', 'Chile', 'China', + 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', + 'Congo', 'Cook Islands', 'Costa Rica', "Cote D'Ivoire (Ivory Coast)", + 'Croatia (Hrvatska)', 'Cuba', 'Cyprus', 'Czech Republic', + 'Czechoslovakia', 'Denmark', 'Djibouti', 'Dominica', + 'Dominican Republic', 'East Timor', 'Ecuador', 'Egypt', + 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', + 'Falkland Islands (Malvinas)', 'Faroe Islands', 'Fiji', 'Finland', + 'France, Metropolitan', 'France', 'French Guiana', 'French Polynesia', + 'French Southern Territories', 'Gabon', 'Gambia', 'Georgia', 'Germany', + 'Ghana', 'Gibraltar', 'Great Britain (UK)', 'Greece', 'Greenland', + 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinea', 'Guinea-Bissau' + , 'Guyana', 'Haiti', 'Heard and McDonald Islands', 'Honduras', + 'Hong Kong', 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq' + , 'Ireland', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jordan', + 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea (North)', 'Korea (South)', + 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia', 'Lebanon', 'Lesotho', + 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania', 'Luxembourg', + 'Macau', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', + 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', + 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', + 'Mongolia', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia' + , 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', + 'Neutral Zone', 'New Caledonia', 'New Zealand (Aotearoa)', + 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', + 'Northern Mariana Islands', 'Norway', 'Oman', 'Pakistan', 'Palau', + 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', + 'Pitcairn', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Reunion', + 'Romania', 'Russian Federation', 'Rwanda', + 'S. Georgia and S. Sandwich Isls.', 'Saint Kitts and Nevis', + 'Saint Lucia', 'Saint Vincent and the Grenadines', 'Samoa', + 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', + 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovak Republic', + 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'Spain', + 'Sri Lanka', 'St. Helena', 'St. Pierre and Miquelon', 'Sudan', + 'Suriname', 'Svalbard and Jan Mayen Islands', 'Swaziland', 'Sweden', + 'Switzerland', 'Syria', 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', + 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', + 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', + 'US Minor Outlying Islands', 'USSR (former)', 'Uganda', 'Ukraine', + 'United Arab Emirates', 'United Kingdom', 'United States', 'Uruguay', + 'Uzbekistan', 'Vanuatu', 'Vatican City State (Holy See)', 'Venezuela', + 'Viet Nam', 'Virgin Islands (British)', 'Virgin Islands (U.S.)', + 'Wallis and Futuna Islands', 'Western Sahara', 'Yemen', 'Yugoslavia', + 'Zaire', 'Zambia', 'Zimbabwe'] + org_unit: + description: organization unit name + required: False + email: + description: Email + required: False + server: + description: ip address of the remote server + required: False + username: + description: remote server login user + required: False + password: + description: remote server login password + required: False + file_name: + description: file_name with full path for the certificate file + required: False + protocol: + description: protocol to transfer file to remote server + required: False + choices: ['ftp', 'http', 'none', 'scp', 'sftp', 'tftp'] + self_signed: + description: if self signed, (user, password, server, file, protocol) not required + required: False + default: False + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_certificate: + name: + org: + locality: + state: + country: + org_unit: + email: + server: + username: + password: + file_name: + protocol: + self_signed: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + name=dict(required=True, type='str'), + org=dict(required=True, type='str'), + locality=dict(required=True, type='str'), + state=dict(required=True, type='str'), + country=dict(required=True, type='str', choices=[ + 'Albania', 'Algeria', 'American Samoa', 'Andorra', + 'Angola', 'Anguilla', 'Antarctica', 'Antigua and Barbuda', + 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', + 'Azerbaijan', 'Bahamas', 'Bahrain', 'Bangladesh', + 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', + 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', + 'Botswana', 'Bouvet Island', 'Brazil', + 'British Indian Ocean Territory', 'Brunei Darussalam', + 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', + 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', + 'Central African Republic', 'Chad', 'Chile', 'China', + 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', + 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', + "Cote D'Ivoire (Ivory Coast)", 'Croatia (Hrvatska)', + 'Cuba', 'Cyprus', 'Czech Republic', 'Czechoslovakia', + 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', + 'East Timor', 'Ecuador', 'Egypt', 'El Salvador', + 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', + 'Falkland Islands (Malvinas)', 'Faroe Islands', 'Fiji', + 'Finland', 'France, Metropolitan', 'France', + 'French Guiana', 'French Polynesia', + 'French Southern Territories', 'Gabon', 'Gambia', + 'Georgia', 'Germany', 'Ghana', 'Gibraltar', + 'Great Britain (UK)', 'Greece', 'Greenland', 'Grenada', + 'Guadeloupe', 'Guam', 'Guatemala', 'Guinea', + 'Guinea-Bissau', 'Guyana', 'Haiti', + 'Heard and McDonald Islands', 'Honduras', 'Hong Kong', + 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', + 'Ireland', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jordan', + 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea (North)', + 'Korea (South)', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia', + 'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', + 'Lithuania', 'Luxembourg', 'Macau', 'Macedonia', + 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', + 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', + 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', + 'Monaco', 'Mongolia', 'Montserrat', 'Morocco', + 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', + 'Netherlands Antilles', 'Netherlands', 'Neutral Zone', + 'New Caledonia', 'New Zealand (Aotearoa)', 'Nicaragua', + 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', + 'Northern Mariana Islands', 'Norway', 'Oman', 'Pakistan', + 'Palau', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', + 'Philippines', 'Pitcairn', 'Poland', 'Portugal', + 'Puerto Rico', 'Qatar', 'Reunion', 'Romania', + 'Russian Federation', 'Rwanda', + 'S. Georgia and S. Sandwich Isls.', + 'Saint Kitts and Nevis', 'Saint Lucia', + 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', + 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', + 'Seychelles', 'Sierra Leone', 'Singapore', + 'Slovak Republic', 'Slovenia', 'Solomon Islands', + 'Somalia', 'South Africa', 'Spain', 'Sri Lanka', + 'St. Helena', 'St. Pierre and Miquelon', 'Sudan', + 'Suriname', 'Svalbard and Jan Mayen Islands', 'Swaziland', + 'Sweden', 'Switzerland', 'Syria', 'Taiwan', 'Tajikistan', + 'Tanzania', 'Thailand', 'Togo', 'Tokelau', 'Tonga', + 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', + 'Turks and Caicos Islands', 'Tuvalu', + 'US Minor Outlying Islands', 'USSR (former)', 'Uganda', + 'Ukraine', 'United Arab Emirates', 'United Kingdom', + 'United States', 'Uruguay', 'Uzbekistan', 'Vanuatu', + 'Vatican City State (Holy See)', 'Venezuela', 'Viet Nam', + 'Virgin Islands (British)', 'Virgin Islands (U.S.)', + 'Wallis and Futuna Islands', 'Western Sahara', 'Yemen', + 'Yugoslavia', 'Zaire', 'Zambia', 'Zimbabwe']), + org_unit=dict(required=False, type='str'), + email=dict(required=False, type='str'), + server=dict(required=False, type='str'), + username=dict(required=False, type='str'), + password=dict(required=False, type='str'), + file_name=dict(required=False, type='str'), + protocol=dict(required=False, type='str', choices=['ftp', 'http', 'none', 'scp', 'sftp', 'tftp']), + self_signed=dict(required=False, type='bool', default=False), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_certificate(server, module): + from imcsdk.apis.admin.certificate import certificate_signing_request_generate + from imcsdk.apis.admin.certificate import certificate_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = certificate_exists(handle=server, **args_mo) + + if module.check_mode or exists: + return not exists, False + + certificate_signing_request_generate(handle=server, **args_mo) + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_certificate(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_certificate_upload.py b/library/cisco_imc_certificate_upload.py new file mode 100644 index 0000000..7b6a9ad --- /dev/null +++ b/library/cisco_imc_certificate_upload.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_certificate_upload +short_description: Uploads certificate on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Uploads certificate on a Cisco IMC Server +Input Params: + server: + description: ip address of the remote server + required: True + username: + description: remote server login user + required: True + password: + description: remote server login password + required: True + file_name: + description: file_name with full path for the certificate file + required: True + protocol: + description: protocol to transfer file to remote server + required: True + choices: ['ftp', 'http', 'none', 'scp', 'sftp', 'tftp'] + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_certificate_upload: + server: + username: + password: + file_name: + protocol: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + server=dict(required=True, type='str'), + username=dict(required=True, type='str'), + password=dict(required=True, type='str'), + file_name=dict(required=True, type='str'), + protocol=dict(required=True, type='str', + choices=['ftp', 'http', 'none', 'scp', 'sftp', 'tftp']) + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_certificate_upload(server, module): + from imcsdk.apis.admin.certificate import certificate_upload + + ansible = module.params + exists = False + args_mo = _get_mo_params(ansible) + if module.check_mode or exists: + return not exists, False + certificate_upload(handle=server, **args_mo) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_certificate_upload(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_redfish.py b/library/cisco_imc_redfish.py new file mode 100644 index 0000000..33fdde0 --- /dev/null +++ b/library/cisco_imc_redfish.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_redfish +short_description: Configures redfish on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures redfish on a Cisco IMC Server +Input Params: + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_redfish: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def setup_redfish(server, module): + from imcsdk.apis.admin.redfish import redfish_enable + from imcsdk.apis.admin.redfish import redfish_disable + from imcsdk.apis.admin.redfish import is_redfish_enabled + + ansible = module.params + exists = is_redfish_enabled(handle=server) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + redfish_enable(handle=server) + else: + if module.check_mode or not exists: + return exists, False + redfish_disable(server) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_redfish(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From 20a8e3cc600c6adbd8432727a4167624975edb5c Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Fri, 21 Apr 2017 19:28:59 +0530 Subject: [PATCH 04/10] Added upload and delete module for bios profile Signed-off-by: Rahul Gupta --- library/cisco_imc_bios_profile_delete.py | 126 +++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 library/cisco_imc_bios_profile_delete.py diff --git a/library/cisco_imc_bios_profile_delete.py b/library/cisco_imc_bios_profile_delete.py new file mode 100644 index 0000000..536b9ad --- /dev/null +++ b/library/cisco_imc_bios_profile_delete.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_bios_profile_delete +short_description: Deletes the bios profile from a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Deletes the bios profile from a Cisco IMC Server +Input Params: + name: + description: name of bios profile + required: True + server_id: + description: id of the server to perform this operation on C3260 platorms + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_bios_profile_delete: + name: + server_id: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + name=dict(required=True, type='str'), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_bios_profile_delete(server, module): + from imcsdk.apis.server.bios import bios_profile_delete + from imcsdk.apis.server.bios import bios_profile_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = bios_profile_exists(handle=server, **args_mo) + + if module.check_mode or not exists: + return exists, False + bios_profile_delete(server, **args_mo) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_bios_profile_delete(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From e6b43822c9fa4ede1a0e7ddc721ef7df0e0fbd74 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Mon, 24 Apr 2017 09:42:24 +0530 Subject: [PATCH 05/10] Added upload and activate module for bios profile Signed-off-by: Rahul Gupta --- library/cisco_imc_bios_profile_activate.py | 137 ++++++++++++++++++ library/cisco_imc_bios_profile_upload.py | 155 +++++++++++++++++++++ 2 files changed, 292 insertions(+) create mode 100644 library/cisco_imc_bios_profile_activate.py create mode 100644 library/cisco_imc_bios_profile_upload.py diff --git a/library/cisco_imc_bios_profile_activate.py b/library/cisco_imc_bios_profile_activate.py new file mode 100644 index 0000000..7638516 --- /dev/null +++ b/library/cisco_imc_bios_profile_activate.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_bios_profile_activate +short_description: Activates bios profile on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Activates bios profile on a Cisco IMC Server +Input Params: + name: + description: bios profile name + required: True + backup_on_activate: + description: Backup running bios configuration before activating this profile.Will overwrite the previous backup. + required: False + default: "True" + reboot_on_activate: + description: Reboot the host/server for the newer bios configuration to be applied. + required: False + server_id: + description: Id of the server to perform this operation on C3260 platforms. + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_bios_profile_activate: + name: + backup_on_activate: + reboot_on_activate: + server_id: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + name=dict(required=True, type='str'), + backup_on_activate=dict(required=False, type='bool', default=True), + reboot_on_activate=dict(required=False, type='bool', default=False), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_bios_profile_activate(server, module): + from imcsdk.apis.server.bios import bios_profile_activate + from imcsdk.apis.server.bios import is_bios_profile_enabled + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists = is_bios_profile_enabled(server, args_mo['name'], args_mo['server_id']) + + if module.check_mode or exists: + return not exists, False + bios_profile_activate(handle=server, **args_mo) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_bios_profile_activate(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + diff --git a/library/cisco_imc_bios_profile_upload.py b/library/cisco_imc_bios_profile_upload.py new file mode 100644 index 0000000..57054d0 --- /dev/null +++ b/library/cisco_imc_bios_profile_upload.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_bios_profile_upload +short_description: Uploads a user configured bios profile in json format. +version_added: 0.9.0.0 +description: + - Uploads a user configured bios profile in json format. + Cisco IMC supports uploading a maximum of 3 profiles +Input Params: + remote_server: + description: ip address of the remote server + required: True + user: + description: remote server login user + required: True + pwd: + description: remote server login password + required: True + remote_file: + description: file_name with full path for the bios profile file + required: True + protocol: + description: protocol to transfer file to remote server + required: True + choices: ['ftp', 'http', 'none', 'scp', 'sftp', 'tftp'] + server_id: + description: d of the server to perform this operation on C3260 + platforms + required: False + choices: + default: 1 + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_bios_profile_upload: + remote_server: + user: + pwd: + remote_file: + protocol: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + remote_server=dict(required=True, type='str'), + user=dict(required=True, type='str'), + pwd=dict(required=True, type='str'), + remote_file=dict(required=True, type='str'), + protocol=dict(required=True, type='str', + choices=['ftp', 'http', 'none', 'scp', 'sftp', 'tftp']), + server_id=dict(required=False, type='str', default='1') + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_bios_profile_upload(server, module): + from imcsdk.apis.server.bios import bios_profile_upload + + ansible = module.params + exists = False + args_mo = _get_mo_params(ansible) + if module.check_mode or exists: + return not exists, False + mo = bios_profile_upload(handle=server, **args_mo) + if "failed" in mo.bios_profile_upload_status: + return False, True + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_bios_profile_upload(server, module) + if err: + results["msg"] = "Bios Profile already exist. If there is any "\ + "configuration change. Please remove the bios profile and "\ + "re-upload." + err = False + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From 314b6d2dcda604b0330b742744a3fd96233798a7 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Mon, 24 Apr 2017 12:59:44 +0530 Subject: [PATCH 06/10] Added module for KVM (RemotePresence) Signed-off-by: Rahul Gupta --- library/cisco_imc_kvm.py | 164 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 library/cisco_imc_kvm.py diff --git a/library/cisco_imc_kvm.py b/library/cisco_imc_kvm.py new file mode 100644 index 0000000..ae4e30e --- /dev/null +++ b/library/cisco_imc_kvm.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_kvm +short_description: Configures virtual kvm on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the virtual kvm on a Cisco IMC Server +Input Params: + total_sessions: + description: Max no. of sessions allowed (1-4) + required: False + default: "1" + port: + description: Port used for kvm communication + required: False + default: "2068" + encryption_state: + description: encryption_state video information sent over kvm + required: False + choices: ["enabled", "disabled"] + default: ""disabled" + local_video_state: + description: Mirror the kvm session on local monitor + required: False + choices: ["enabled", "disabled"] + default: ""disabled" + server_id: + description: Server Id to be specified for C3260 platforms + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_kvm: + total_sessions: + port: + encryption_state: + local_video_state: + server_id: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + total_sessions=dict(required=False, type='str', default="1"), + port=dict(required=False, type='str', default="2068"), + encryption_state=dict(required=False, type='str', default="disabled"), + local_video_state=dict(required=False, type='str', default="disabled"), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_kvm(server, module): + from imcsdk.apis.server.remotepresence import kvm_setup + from imcsdk.apis.server.remotepresence import kvm_disable + from imcsdk.apis.server.remotepresence import is_kvm_enabled + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = is_kvm_enabled(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + kvm_setup(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + kvm_disable(server, args_mo['server_id']) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_kvm(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From 75d44ed78fa720518ae13bb59f20fb84db67313f Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Tue, 25 Apr 2017 12:03:39 +0530 Subject: [PATCH 07/10] Added module to configure vmedia Signed-off-by: Rahul Gupta --- library/cisco_imc_vmedia.py | 152 ++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 library/cisco_imc_vmedia.py diff --git a/library/cisco_imc_vmedia.py b/library/cisco_imc_vmedia.py new file mode 100644 index 0000000..ae6d349 --- /dev/null +++ b/library/cisco_imc_vmedia.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_vmedia +short_description: Configures vmedia on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - Configures the vmedia on a Cisco IMC Server +Input Params: + encryption_state: + description: Encrypt virtual media communications + required: False + choices: ['disabled', 'enabled'] + default: "disabled" + low_power_usb: + description: Enable low power usb + required: False + choices: ['disabled', 'enabled'] + default: "disabled" + server_id: + description: Server Id to be specified for C3260 platforms + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_vmedia: + encryption_state: + low_power_usb: + server_id: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + encryption_state=dict(required=False, type='str', choices=['disabled', 'enabled'], default="disabled"), + low_power_usb=dict(required=False, type='str', choices=['disabled', 'enabled'], default="disabled"), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_vmedia(server, module): + from imcsdk.apis.server.remotepresence import vmedia_setup + from imcsdk.apis.server.remotepresence import vmedia_disable + from imcsdk.apis.server.remotepresence import is_vmedia_enabled + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = is_vmedia_enabled(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + vmedia_setup(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + vmedia_disable(server) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_vmedia(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From 345a7bbbe0575b71a57e714fba41b8549ae733a7 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Wed, 26 Apr 2017 09:46:05 +0530 Subject: [PATCH 08/10] Added module for mounting vmedia Signed-off-by: Rahul Gupta --- library/cisco_imc_vmedia_mount.py | 174 ++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 library/cisco_imc_vmedia_mount.py diff --git a/library/cisco_imc_vmedia_mount.py b/library/cisco_imc_vmedia_mount.py new file mode 100644 index 0000000..ddd8aca --- /dev/null +++ b/library/cisco_imc_vmedia_mount.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_vmedia_mount +short_description: mounts vmedia on a Cisco IMC Server +version_added: 0.9.0.0 +description: + - mounts the vmedia on a Cisco IMC Server +Input Params: + volume_name: + description: Name of the volume or identity of the image + required: True + map: + description: mount protocol + required: True + choices: ['nfs', 'cifs', 'www'] + mount_options: + description: Options to be passed while mounting the image + required: False + remote_share: + description: uri of the image + required: False + remote_file: + description: name of the image + required: False + user_id: + description: username + required: False + password: + description: password + required: False + server_id: + description: Server Id to be specified for C3260 platforms + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_vmedia_mount: + volume_name: + map: + mount_options: + remote_share: + remote_file: + user_id: + password: + server_id: + state: "present" + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + volume_name=dict(required=True, type='str'), + map=dict(required=True, type='str', choices=['nfs', 'cifs', 'www']), + mount_options=dict(required=False, type='str'), + remote_share=dict(required=False, type='str'), + remote_file=dict(required=False, type='str'), + user_id=dict(required=False, type='str'), + password=dict(required=False, type='str'), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_state(): + return dict( + state=dict(required=False, + default="present", + choices=['present', 'absent'], + type='str'), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_state()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if (key == 'state' or + ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_vmedia_mount(server, module): + from imcsdk.apis.server.remotepresence import vmedia_mount_add + from imcsdk.apis.server.remotepresence import vmedia_mount_remove + from imcsdk.apis.server.remotepresence import vmedia_mount_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = vmedia_mount_exists(handle=server, **args_mo) + + if ansible["state"] == "present": + if module.check_mode or exists: + return not exists, False + vmedia_mount_add(handle=server, **args_mo) + else: + if module.check_mode or not exists: + return exists, False + vmedia_mount_remove(server, mo.volume_name, args_mo['server_id']) + + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_vmedia_mount(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() + From 6e4a744c32da6c968f6311b5d0dc171b1464cf62 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Tue, 2 May 2017 15:09:53 +0530 Subject: [PATCH 09/10] Added and modified module for legacy boot order Signed-off-by: Rahul Gupta --- library/cisco_imc_boot_order_precision.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/library/cisco_imc_boot_order_precision.py b/library/cisco_imc_boot_order_precision.py index ef06d01..1f21928 100644 --- a/library/cisco_imc_boot_order_precision.py +++ b/library/cisco_imc_boot_order_precision.py @@ -111,15 +111,15 @@ def main(): server_id=dict(required=False, default=1, type='int'), # ImcHandle - server=dict(required=False, type='dict'), + imc_server=dict(required=False, type='dict'), # Imc server credentials - ip=dict(required=False, type='str'), - username=dict(required=False, default="admin", type='str'), - password=dict(required=False, type='str', no_log=True), - port=dict(required=False, default=None), - secure=dict(required=False, default=None), - proxy=dict(required=False, default=None) + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) ), supports_check_mode=True ) From 408bfc50ed3ad9733335afe4958ea022df438983 Mon Sep 17 00:00:00 2001 From: Rahul Gupta Date: Tue, 2 May 2017 15:11:03 +0530 Subject: [PATCH 10/10] Added module for legacy boot order Signed-off-by: Rahul Gupta --- library/cisco_imc_boot_order_legacy.py | 135 +++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 library/cisco_imc_boot_order_legacy.py diff --git a/library/cisco_imc_boot_order_legacy.py b/library/cisco_imc_boot_order_legacy.py new file mode 100644 index 0000000..bd62ce9 --- /dev/null +++ b/library/cisco_imc_boot_order_legacy.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python + +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: cisco_imc_boot_order_legacy +short_description: Set boot order precision for a Cisco IMC server. +version_added: 0.9.0.0 +description: + - Set boot order precision for a Cisco IMC server. +Input Params: + reboot_on_update: + description: reboots cimc if true and boot order changes + required: False + secure_boot: + description: secure_boot + required: False + boot_devices: + description: dictionary {"order":"", "device-type": ""} + required: True + server_id: + description: Server Id to be specified for C3260 platforms + required: False + default: "1" + +requirements: ['imcsdk'] +author: "Rahul Gupta(ragupta4@cisco.com)" +''' + + +EXAMPLES = ''' +- name: + cisco_imc_boot_order_legacy: + reboot_on_update: + secure_boot: + boot_devices: + server_id: + ip: "192.168.1.1" + username: "admin" + password: "password" +''' + + +def _argument_mo(): + return dict( + reboot_on_update=dict(required=False, type='bool', default=False), + secure_boot=dict(required=False, type='bool', default=False), + boot_devices=dict(required=True, type='list'), + server_id=dict(required=False, type='str', default="1"), + ) + + +def _argument_imc_connection(): + return dict( + # ImcHandle + imc_server=dict(required=False, type='dict'), + + # Imc server credentials + imc_ip=dict(required=False, type='str'), + imc_username=dict(required=False, default="admin", type='str'), + imc_password=dict(required=False, type='str', no_log=True), + imc_port=dict(required=False, default=None), + imc_secure=dict(required=False, default=None), + imc_proxy=dict(required=False, default=None) + ) + + +def _ansible_module_create(): + argument_spec = dict() + argument_spec.update(_argument_mo()) + argument_spec.update(_argument_imc_connection()) + + return AnsibleModule(argument_spec, + supports_check_mode=True) + + +def _get_mo_params(params): + from ansible.module_utils.cisco_imc import ImcConnection + args = {} + for key in params: + if ( ImcConnection.is_login_param(key) or + params.get(key) is None): + continue + args[key] = params.get(key) + return args + + +def setup_boot_order_legacy(server, module): + from imcsdk.apis.server.bios import boot_order_policy_set + from imcsdk.apis.server.bios import boot_order_policy_exists + + ansible = module.params + args_mo = _get_mo_params(ansible) + exists, mo = boot_order_policy_exists(handle=server, **args_mo) + + if module.check_mode or exists: + return not exists, False + + boot_order_policy_set(handle=server, **args_mo) + return True, False + + +def setup(server, module): + results = {} + err = False + + try: + results["changed"], err = setup_boot_order_legacy(server, module) + + except Exception as e: + err = True + results["msg"] = "setup error: %s " % str(e) + results["changed"] = False + + return results, err + + +def main(): + from ansible.module_utils.cisco_imc import ImcConnection + + module = _ansible_module_create() + conn = ImcConnection(module) + server = conn.login() + results, err = setup(server, module) + conn.logout() + if err: + module.fail_json(**results) + module.exit_json(**results) + + +if __name__ == '__main__': + main() +