mirror of https://github.com/ansible/ansible.git
Migrated to cisco.ucs
parent
3149db0869
commit
675129ae19
@ -1,97 +0,0 @@
|
|||||||
# This code is part of Ansible, but is an independent component.
|
|
||||||
# This particular file snippet, and this file snippet only, is BSD licensed.
|
|
||||||
# Modules you write using this snippet, which is embedded dynamically by Ansible
|
|
||||||
# still belong to the author of the module, and may assign their own license
|
|
||||||
# to the complete work.
|
|
||||||
#
|
|
||||||
# (c) 2016 Red Hat Inc.
|
|
||||||
# (c) 2019 Cisco Systems Inc.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import missing_required_lib
|
|
||||||
|
|
||||||
UCSMSDK_IMP_ERR = None
|
|
||||||
try:
|
|
||||||
import ucsmsdk
|
|
||||||
HAS_UCSMSDK = True
|
|
||||||
except Exception:
|
|
||||||
UCSMSDK_IMP_ERR = traceback.format_exc()
|
|
||||||
HAS_UCSMSDK = False
|
|
||||||
|
|
||||||
ucs_argument_spec = dict(
|
|
||||||
hostname=dict(type='str', required=True),
|
|
||||||
username=dict(type='str', default='admin'),
|
|
||||||
password=dict(type='str', required=True, no_log=True),
|
|
||||||
port=dict(type='int', default=None),
|
|
||||||
use_ssl=dict(type='bool', default=True),
|
|
||||||
use_proxy=dict(type='bool', default=True),
|
|
||||||
proxy=dict(type='str', default=None),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class UCSModule():
|
|
||||||
|
|
||||||
def __init__(self, module):
|
|
||||||
self.module = module
|
|
||||||
self.result = {}
|
|
||||||
if not HAS_UCSMSDK:
|
|
||||||
self.module.fail_json(msg=missing_required_lib('ucsmsdk'), exception=UCSMSDK_IMP_ERR)
|
|
||||||
self.login()
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
self.logout()
|
|
||||||
|
|
||||||
def login(self):
|
|
||||||
from ucsmsdk.ucshandle import UcsHandle
|
|
||||||
|
|
||||||
# use_proxy=yes (default) and proxy=None (default) should be using the system defined proxy
|
|
||||||
# use_proxy=yes (default) and proxy=value should use the provided proxy
|
|
||||||
# use_proxy=no (user) should not be using a proxy
|
|
||||||
if self.module.params['use_proxy']:
|
|
||||||
proxy = self.module.params['proxy']
|
|
||||||
else:
|
|
||||||
# force no proxy to be used. Note that proxy=None in UcsHandle will
|
|
||||||
# use the system proxy so we must set to something else
|
|
||||||
proxy = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
handle = UcsHandle(
|
|
||||||
ip=self.module.params['hostname'],
|
|
||||||
username=self.module.params['username'],
|
|
||||||
password=self.module.params['password'],
|
|
||||||
port=self.module.params['port'],
|
|
||||||
secure=self.module.params['use_ssl'],
|
|
||||||
proxy=proxy
|
|
||||||
)
|
|
||||||
handle.login()
|
|
||||||
except Exception as e:
|
|
||||||
self.result['msg'] = str(e)
|
|
||||||
self.module.fail_json(**self.result)
|
|
||||||
self.login_handle = handle
|
|
||||||
|
|
||||||
def logout(self):
|
|
||||||
if hasattr(self, 'login_handle'):
|
|
||||||
self.login_handle.logout()
|
|
||||||
return True
|
|
||||||
return False
|
|
@ -1,422 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_disk_group_policy
|
|
||||||
short_description: Configures disk group policies on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures disk group policies on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- Desired state of the disk group policy.
|
|
||||||
- If C(present), will verify that the disk group policy is present and will create if needed.
|
|
||||||
- If C(absent), will verify that the disk group policy is absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the disk group policy.
|
|
||||||
This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the policy is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- The user-defined description of the storage profile.
|
|
||||||
Enter up to 256 characters.
|
|
||||||
"You can use any characters or spaces except the following:"
|
|
||||||
"` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
raid_level:
|
|
||||||
description:
|
|
||||||
- "The RAID level for the disk group policy. This can be one of the following:"
|
|
||||||
- "stripe - UCS Manager shows RAID 0 Striped"
|
|
||||||
- "mirror - RAID 1 Mirrored"
|
|
||||||
- "mirror-stripe - RAID 10 Mirrored and Striped"
|
|
||||||
- "stripe-parity - RAID 5 Striped Parity"
|
|
||||||
- "stripe-dual-parity - RAID 6 Striped Dual Parity"
|
|
||||||
- "stripe-parity-stripe - RAID 50 Striped Parity and Striped"
|
|
||||||
- "stripe-dual-parity-stripe - RAID 60 Striped Dual Parity and Striped"
|
|
||||||
choices: [stripe, mirror, mirror-stripe, stripe-parity, stripe-dual-parity, stripe-parity-stripe, stripe-dual-parity-stripe]
|
|
||||||
default: stripe
|
|
||||||
configuration_mode:
|
|
||||||
description:
|
|
||||||
- "Disk group configuration mode. Choose one of the following:"
|
|
||||||
- "automatic - Automatically configures the disks in the disk group."
|
|
||||||
- "manual - Enables you to manually configure the disks in the disk group."
|
|
||||||
choices: [automatic, manual]
|
|
||||||
default: automatic
|
|
||||||
num_drives:
|
|
||||||
description:
|
|
||||||
- Specify the number of drives for the disk group.
|
|
||||||
- This can be from 0 to 24.
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
default: 1
|
|
||||||
drive_type:
|
|
||||||
description:
|
|
||||||
- Specify the drive type to use in the drive group.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "unspecified — Selects the first available drive type, and applies that to all drives in the group."
|
|
||||||
- "HDD — Hard disk drive"
|
|
||||||
- "SSD — Solid state drive"
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
choices: [unspecified, HDD, SSD]
|
|
||||||
default: unspecified
|
|
||||||
num_ded_hot_spares:
|
|
||||||
description:
|
|
||||||
- Specify the number of hot spares for the disk group.
|
|
||||||
- This can be from 0 to 24.
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
default: unspecified
|
|
||||||
num_glob_hot_spares:
|
|
||||||
description:
|
|
||||||
- Specify the number of global hot spares for the disk group.
|
|
||||||
- This can be from 0 to 24.
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
default: unspecified
|
|
||||||
min_drive_size:
|
|
||||||
description:
|
|
||||||
- Specify the minimum drive size or unspecified to allow all drive sizes.
|
|
||||||
- This can be from 0 to 10240 GB.
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
default: 'unspecified'
|
|
||||||
use_remaining_disks:
|
|
||||||
description:
|
|
||||||
- Specifies whether you can use all the remaining disks in the disk group or not.
|
|
||||||
- Option only applies when configuration mode is automatic.
|
|
||||||
choices: ['yes', 'no']
|
|
||||||
default: 'no'
|
|
||||||
manual_disks:
|
|
||||||
description:
|
|
||||||
- List of manually configured disks.
|
|
||||||
- Options are only used when you choose manual configuration_mode.
|
|
||||||
suboptions:
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the local LUN.
|
|
||||||
required: yes
|
|
||||||
slot_num:
|
|
||||||
description:
|
|
||||||
- The slot number of the specific disk.
|
|
||||||
role:
|
|
||||||
description:
|
|
||||||
- "The role of the disk. This can be one of the following:"
|
|
||||||
- "normal - Normal"
|
|
||||||
- "ded-hot-spare - Dedicated Hot Spare"
|
|
||||||
- "glob-hot-spare - Glob Hot Spare"
|
|
||||||
span_id:
|
|
||||||
description:
|
|
||||||
- The Span ID of the specific disk.
|
|
||||||
default: 'unspecified'
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify disk slot is configured within policy.
|
|
||||||
If C(absent), will verify disk slot is absent from policy.
|
|
||||||
choices: [ present, absent ]
|
|
||||||
default: present
|
|
||||||
virtual_drive:
|
|
||||||
description:
|
|
||||||
- Configuration of virtual drive options.
|
|
||||||
suboptions:
|
|
||||||
access_policy:
|
|
||||||
description:
|
|
||||||
- Configure access policy to virtual drive.
|
|
||||||
choices: [blocked, hidden, platform-default, read-only, read-write, transport-ready]
|
|
||||||
default: platform-default
|
|
||||||
drive_cache:
|
|
||||||
description:
|
|
||||||
- Configure drive caching.
|
|
||||||
choices: [disable, enable, no-change, platform-default]
|
|
||||||
default: platform-default
|
|
||||||
io_policy:
|
|
||||||
description:
|
|
||||||
- Direct or Cached IO path.
|
|
||||||
choices: [cached, direct, platform-default]
|
|
||||||
default: platform-default
|
|
||||||
read_policy:
|
|
||||||
description:
|
|
||||||
- Read access policy to virtual drive.
|
|
||||||
choices: [normal, platform-default, read-ahead]
|
|
||||||
default: platform-default
|
|
||||||
strip_size:
|
|
||||||
description:
|
|
||||||
- Virtual drive strip size.
|
|
||||||
choices: [ present, absent ]
|
|
||||||
default: platform-default
|
|
||||||
write_cache_policy:
|
|
||||||
description:
|
|
||||||
- Write back cache policy.
|
|
||||||
choices: [always-write-back, platform-default, write-back-good-bbu, write-through]
|
|
||||||
default: platform-default
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- The distinguished name (dn) of the organization where the resource is assigned.
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- Sindhu Sudhir (@sisudhir)
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
- Brett Johnson (@sdbrett)
|
|
||||||
version_added: '2.8'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure Disk Group Policy
|
|
||||||
ucs_disk_group_policy:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-DG
|
|
||||||
raid_level: mirror
|
|
||||||
configuration_mode: manual
|
|
||||||
manual_disks:
|
|
||||||
- slot_num: '1'
|
|
||||||
role: normal
|
|
||||||
- slot_num: '2'
|
|
||||||
role: normal
|
|
||||||
|
|
||||||
- name: Remove Disk Group Policy
|
|
||||||
ucs_disk_group_policy:
|
|
||||||
name: DEE-DG
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove Disk from Policy
|
|
||||||
ucs_disk_group_policy:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-DG
|
|
||||||
description: Testing Ansible
|
|
||||||
raid_level: stripe
|
|
||||||
configuration_mode: manual
|
|
||||||
manual_disks:
|
|
||||||
- slot_num: '1'
|
|
||||||
role: normal
|
|
||||||
- slot_num: '2'
|
|
||||||
role: normal
|
|
||||||
state: absent
|
|
||||||
virtual_drive:
|
|
||||||
access_policy: platform-default
|
|
||||||
io_policy: direct
|
|
||||||
strip_size: 64KB
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def configure_disk_policy(ucs, module, dn):
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageDiskGroupConfigPolicy import LstorageDiskGroupConfigPolicy
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageDiskGroupQualifier import LstorageDiskGroupQualifier
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageLocalDiskConfigRef import LstorageLocalDiskConfigRef
|
|
||||||
|
|
||||||
if not module.check_mode:
|
|
||||||
try:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = LstorageDiskGroupConfigPolicy(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
raid_level=module.params['raid_level'],
|
|
||||||
)
|
|
||||||
if module.params['configuration_mode'] == 'automatic':
|
|
||||||
LstorageDiskGroupQualifier(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
num_drives=module.params['num_drives'],
|
|
||||||
drive_type=module.params['drive_type'],
|
|
||||||
use_remaining_disks=module.params['use_remaining_disks'],
|
|
||||||
num_ded_hot_spares=module.params['num_ded_hot_spares'],
|
|
||||||
num_glob_hot_spares=module.params['num_glob_hot_spares'],
|
|
||||||
min_drive_size=module.params['min_drive_size'],
|
|
||||||
)
|
|
||||||
else: # configuration_mode == 'manual'
|
|
||||||
for disk in module.params['manual_disks']:
|
|
||||||
if disk['state'] == 'absent':
|
|
||||||
child_dn = dn + '/slot-' + disk['slot_num']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
ucs.login_handle.remove_mo(mo_1)
|
|
||||||
else: # state == 'present'
|
|
||||||
LstorageLocalDiskConfigRef(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
slot_num=disk['slot_num'],
|
|
||||||
role=disk['role'],
|
|
||||||
span_id=disk['span_id'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['virtual_drive']:
|
|
||||||
_configure_virtual_drive(module, mo)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
except Exception as e: # generic Exception handling because SDK can throw a variety
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
|
|
||||||
def check_disk_policy_props(ucs, module, mo, dn):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
kwargs['raid_level'] = module.params['raid_level']
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if module.params['configuration_mode'] == 'automatic':
|
|
||||||
child_dn = dn + '/disk-group-qual'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(num_drives=module.params['num_drives'])
|
|
||||||
kwargs['drive_type'] = module.params['drive_type']
|
|
||||||
kwargs['use_remaining_disks'] = module.params['use_remaining_disks']
|
|
||||||
kwargs['num_ded_hot_spares'] = module.params['num_ded_hot_spares']
|
|
||||||
kwargs['num_glob_hot_spares'] = module.params['num_glob_hot_spares']
|
|
||||||
kwargs['min_drive_size'] = module.params['min_drive_size']
|
|
||||||
props_match = mo_1.check_prop_match(**kwargs)
|
|
||||||
|
|
||||||
else: # configuration_mode == 'manual'
|
|
||||||
for disk in module.params['manual_disks']:
|
|
||||||
child_dn = dn + '/slot-' + disk['slot_num']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
if disk['state'] == 'absent':
|
|
||||||
props_match = False
|
|
||||||
else: # state == 'present'
|
|
||||||
kwargs = dict(slot_num=disk['slot_num'])
|
|
||||||
kwargs['role'] = disk['role']
|
|
||||||
kwargs['span_id'] = disk['span_id']
|
|
||||||
if not mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
if props_match:
|
|
||||||
if module.params['virtual_drive']:
|
|
||||||
props_match = check_virtual_drive_props(ucs, module, dn)
|
|
||||||
else:
|
|
||||||
props_match = False
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_virtual_drive_props(ucs, module, dn):
|
|
||||||
child_dn = dn + '/virtual-drive-def'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
return mo_1.check_prop_match(**module.params['virtual_drive'])
|
|
||||||
|
|
||||||
|
|
||||||
def _configure_virtual_drive(module, mo):
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageVirtualDriveDef import LstorageVirtualDriveDef
|
|
||||||
LstorageVirtualDriveDef(parent_mo_or_dn=mo, **module.params['virtual_drive'])
|
|
||||||
|
|
||||||
|
|
||||||
def _virtual_drive_argument_spec():
|
|
||||||
return dict(
|
|
||||||
access_policy=dict(type='str', default='platform-default',
|
|
||||||
choices=["blocked", "hidden", "platform-default", "read-only", "read-write",
|
|
||||||
"transport-ready"]),
|
|
||||||
drive_cache=dict(type='str', default='platform-default',
|
|
||||||
choices=["disable", "enable", "no-change", "platform-default"]),
|
|
||||||
io_policy=dict(type='str', default='platform-default',
|
|
||||||
choices=["cached", "direct", "platform-default"]),
|
|
||||||
read_policy=dict(type='str', default='platform-default',
|
|
||||||
choices=["normal", "platform-default", "read-ahead"]),
|
|
||||||
strip_size=dict(type='str', default='platform-default',
|
|
||||||
choices=["1024KB", "128KB", "16KB", "256KB", "32KB", "512KB", "64KB", "8KB",
|
|
||||||
"platform-default"]),
|
|
||||||
write_cache_policy=dict(type='str', default='platform-default',
|
|
||||||
choices=["always-write-back", "platform-default", "write-back-good-bbu",
|
|
||||||
"write-through"]),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
manual_disk = dict(
|
|
||||||
slot_num=dict(type='str', required=True),
|
|
||||||
role=dict(type='str', default='normal', choices=['normal', 'ded-hot-spare', 'glob-hot-spare']),
|
|
||||||
span_id=dict(type='str', default='unspecified'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
raid_level=dict(
|
|
||||||
type='str',
|
|
||||||
default='stripe',
|
|
||||||
choices=[
|
|
||||||
'stripe',
|
|
||||||
'mirror',
|
|
||||||
'mirror-stripe',
|
|
||||||
'stripe-parity',
|
|
||||||
'stripe-dual-parity',
|
|
||||||
'stripe-parity-stripe',
|
|
||||||
'stripe-dual-parity-stripe',
|
|
||||||
],
|
|
||||||
),
|
|
||||||
num_drives=dict(type='str', default='1'),
|
|
||||||
configuration_mode=dict(type='str', default='automatic', choices=['automatic', 'manual']),
|
|
||||||
num_ded_hot_spares=dict(type='str', default='unspecified'),
|
|
||||||
num_glob_hot_spares=dict(type='str', default='unspecified'),
|
|
||||||
drive_type=dict(type='str', default='unspecified', choices=['unspecified', 'HDD', 'SSD']),
|
|
||||||
use_remaining_disks=dict(type='str', default='no', choices=['yes', 'no']),
|
|
||||||
min_drive_size=dict(type='str', default='unspecified'),
|
|
||||||
manual_disks=dict(type='list', elements='dict', options=manual_disk),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
virtual_drive=dict(type='dict', options=_virtual_drive_argument_spec()),
|
|
||||||
)
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Additional imports are done below or in called functions.
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/disk-group-config-<name>
|
|
||||||
dn = module.params['org_dn'] + '/disk-group-config-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else: # state == 'present'
|
|
||||||
props_match = check_disk_policy_props(ucs, module, mo, dn)
|
|
||||||
|
|
||||||
if module.params['state'] == 'present' and not props_match:
|
|
||||||
configure_disk_policy(ucs, module, dn)
|
|
||||||
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,168 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_dns_server
|
|
||||||
|
|
||||||
short_description: Configure DNS servers on Cisco UCS Manager
|
|
||||||
|
|
||||||
extends_documentation_fragment:
|
|
||||||
- ucs
|
|
||||||
|
|
||||||
description:
|
|
||||||
- Configure DNS servers on Cisco UCS Manager.
|
|
||||||
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(absent), will remove a DNS server.
|
|
||||||
- If C(present), will add or update a DNS server.
|
|
||||||
choices: [absent, present]
|
|
||||||
default: present
|
|
||||||
type: str
|
|
||||||
|
|
||||||
dns_server:
|
|
||||||
description:
|
|
||||||
- DNS server IP address.
|
|
||||||
- Enter a valid IPV4 Address.
|
|
||||||
- UCS Manager supports up to 4 DNS Servers
|
|
||||||
aliases: [ name ]
|
|
||||||
type: str
|
|
||||||
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the DNS server.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
type: str
|
|
||||||
|
|
||||||
delegate_to:
|
|
||||||
description:
|
|
||||||
- Where the module will be run
|
|
||||||
default: localhost
|
|
||||||
type: str
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
|
|
||||||
author:
|
|
||||||
- John McDonough (@movinalot)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
|
|
||||||
version_added: "2.8"
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure DNS server
|
|
||||||
ucs_dns_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
dns_server: 10.10.10.10
|
|
||||||
description: DNS Server IP address
|
|
||||||
state: present
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Remove DNS server
|
|
||||||
ucs_dns_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
dns_server: 10.10.10.10
|
|
||||||
state: absent
|
|
||||||
delegate_to: localhost
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def run_module():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
dns_server=dict(type='str', aliases=['name']),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
delegate_to=dict(type='str', default='localhost'),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['state', 'present', ['dns_server']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Imports are below for UCS object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
from ucsmsdk.mometa.comm.CommDnsProvider import CommDnsProvider
|
|
||||||
|
|
||||||
err = False
|
|
||||||
changed = False
|
|
||||||
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
dn = 'sys/svc-ext/dns-svc/dns-' + module.params['dns_server']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# update/add mo
|
|
||||||
mo = CommDnsProvider(parent_mo_or_dn='sys/svc-ext/dns-svc',
|
|
||||||
name=module.params['dns_server'],
|
|
||||||
descr=module.params['description'])
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
run_module()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,296 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_ip_pool
|
|
||||||
short_description: Configures IP address pools on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures IP address pools and blocks of IP addresses on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify IP pool is present and will create if needed.
|
|
||||||
- If C(absent), will verify IP pool is absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the IP address pool.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the IP address pool is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- The user-defined description of the IP address pool.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr, descrption ]
|
|
||||||
order:
|
|
||||||
description:
|
|
||||||
- The Assignment Order field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "default - Cisco UCS Manager selects a random identity from the pool."
|
|
||||||
- "sequential - Cisco UCS Manager selects the lowest available identity from the pool."
|
|
||||||
choices: [default, sequential]
|
|
||||||
default: default
|
|
||||||
first_addr:
|
|
||||||
description:
|
|
||||||
- The first IPv4 address in the IPv4 addresses block.
|
|
||||||
- This is the From field in the UCS Manager Add IPv4 Blocks menu.
|
|
||||||
last_addr:
|
|
||||||
description:
|
|
||||||
- The last IPv4 address in the IPv4 addresses block.
|
|
||||||
- This is the To field in the UCS Manager Add IPv4 Blocks menu.
|
|
||||||
subnet_mask:
|
|
||||||
description:
|
|
||||||
- The subnet mask associated with the IPv4 addresses in the block.
|
|
||||||
default: 255.255.255.0
|
|
||||||
default_gw:
|
|
||||||
description:
|
|
||||||
- The default gateway associated with the IPv4 addresses in the block.
|
|
||||||
default: 0.0.0.0
|
|
||||||
primary_dns:
|
|
||||||
description:
|
|
||||||
- The primary DNS server that this block of IPv4 addresses should access.
|
|
||||||
default: 0.0.0.0
|
|
||||||
secondary_dns:
|
|
||||||
description:
|
|
||||||
- The secondary DNS server that this block of IPv4 addresses should access.
|
|
||||||
default: 0.0.0.0
|
|
||||||
ipv6_first_addr:
|
|
||||||
description:
|
|
||||||
- The first IPv6 address in the IPv6 addresses block.
|
|
||||||
- This is the From field in the UCS Manager Add IPv6 Blocks menu.
|
|
||||||
ipv6_last_addr:
|
|
||||||
description:
|
|
||||||
- The last IPv6 address in the IPv6 addresses block.
|
|
||||||
- This is the To field in the UCS Manager Add IPv6 Blocks menu.
|
|
||||||
ipv6_prefix:
|
|
||||||
description:
|
|
||||||
- The network address prefix associated with the IPv6 addresses in the block.
|
|
||||||
default: '64'
|
|
||||||
ipv6_default_gw:
|
|
||||||
description:
|
|
||||||
- The default gateway associated with the IPv6 addresses in the block.
|
|
||||||
default: '::'
|
|
||||||
ipv6_primary_dns:
|
|
||||||
description:
|
|
||||||
- The primary DNS server that this block of IPv6 addresses should access.
|
|
||||||
default: '::'
|
|
||||||
ipv6_secondary_dns:
|
|
||||||
description:
|
|
||||||
- The secondary DNS server that this block of IPv6 addresses should access.
|
|
||||||
default: '::'
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure IPv4 address pools
|
|
||||||
ucs_ip_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: ip-A
|
|
||||||
order: sequential
|
|
||||||
first_addr: 192.168.0.10
|
|
||||||
last_addr: 192.168.0.19
|
|
||||||
subnet_mask: 255.255.255.0
|
|
||||||
default_gw: 192.168.0.1
|
|
||||||
primary_dns: 172.16.143.136
|
|
||||||
- name: Configure IPv6 address pools
|
|
||||||
ucs_ip_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: ipv6-B
|
|
||||||
ipv6_first_addr: fe80::1cae:7992:d7a1:ed07
|
|
||||||
ipv6_last_addr: fe80::1cae:7992:d7a1:edfe
|
|
||||||
ipv6_default_gw: fe80::1cae:7992:d7a1:ecff
|
|
||||||
|
|
||||||
- name: Remove IPv4 address pools
|
|
||||||
ucs_ip_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: ip-A
|
|
||||||
state: absent
|
|
||||||
- name: Remove IPv6 address pools
|
|
||||||
ucs_ip_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: ipv6-B
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
descr=dict(type='str', default='', aliases=['descrption', 'description']),
|
|
||||||
order=dict(type='str', default='default', choices=['default', 'sequential']),
|
|
||||||
first_addr=dict(type='str'),
|
|
||||||
last_addr=dict(type='str'),
|
|
||||||
subnet_mask=dict(type='str', default='255.255.255.0'),
|
|
||||||
default_gw=dict(type='str', default='0.0.0.0'),
|
|
||||||
primary_dns=dict(type='str', default='0.0.0.0'),
|
|
||||||
secondary_dns=dict(type='str', default='0.0.0.0'),
|
|
||||||
ipv6_first_addr=dict(type='str'),
|
|
||||||
ipv6_last_addr=dict(type='str'),
|
|
||||||
ipv6_prefix=dict(type='str', default='64'),
|
|
||||||
ipv6_default_gw=dict(type='str', default='::'),
|
|
||||||
ipv6_primary_dns=dict(type='str', default='::'),
|
|
||||||
ipv6_secondary_dns=dict(type='str', default='::'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.ippool.IppoolPool import IppoolPool
|
|
||||||
from ucsmsdk.mometa.ippool.IppoolBlock import IppoolBlock
|
|
||||||
from ucsmsdk.mometa.ippool.IppoolIpV6Block import IppoolIpV6Block
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/ip-pool-<name>
|
|
||||||
dn = module.params['org_dn'] + '/ip-pool-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(assignment_order=module.params['order'])
|
|
||||||
kwargs['descr'] = module.params['descr']
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if module.params['last_addr'] and module.params['first_addr']:
|
|
||||||
# ipv4 block specified, check properties
|
|
||||||
block_dn = dn + '/block-' + module.params['first_addr'] + '-' + module.params['last_addr']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(block_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(subnet=module.params['subnet_mask'])
|
|
||||||
kwargs['def_gw'] = module.params['default_gw']
|
|
||||||
kwargs['prim_dns'] = module.params['primary_dns']
|
|
||||||
kwargs['sec_dns'] = module.params['secondary_dns']
|
|
||||||
if (mo_1.check_prop_match(**kwargs)):
|
|
||||||
# ipv4 block exists and properties match
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# no ipv4 block specified, but top-level props matched
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
# only check ipv6 props if the top-level and ipv4 props matched
|
|
||||||
if props_match and module.params['ipv6_last_addr'] and module.params['ipv6_first_addr']:
|
|
||||||
# ipv6 block specified, check properties
|
|
||||||
block_dn = dn + '/v6block-' + module.params['ipv6_first_addr'].lower() + '-' + module.params['ipv6_last_addr'].lower()
|
|
||||||
mo_1 = ucs.login_handle.query_dn(block_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(prefix=module.params['ipv6_prefix'])
|
|
||||||
kwargs['def_gw'] = module.params['ipv6_default_gw']
|
|
||||||
kwargs['prim_dns'] = module.params['ipv6_primary_dns']
|
|
||||||
kwargs['sec_dns'] = module.params['ipv6_secondary_dns']
|
|
||||||
if (mo_1.check_prop_match(**kwargs)):
|
|
||||||
# ipv6 block exists and properties match
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# no ipv6 block specified, but previous checks matched
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = IppoolPool(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['descr'],
|
|
||||||
assignment_order=module.params['order'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['last_addr'] and module.params['first_addr']:
|
|
||||||
mo_1 = IppoolBlock(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
to=module.params['last_addr'],
|
|
||||||
r_from=module.params['first_addr'],
|
|
||||||
subnet=module.params['subnet_mask'],
|
|
||||||
def_gw=module.params['default_gw'],
|
|
||||||
prim_dns=module.params['primary_dns'],
|
|
||||||
sec_dns=module.params['secondary_dns'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['ipv6_last_addr'] and module.params['ipv6_first_addr']:
|
|
||||||
mo_1 = IppoolIpV6Block(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
to=module.params['ipv6_last_addr'],
|
|
||||||
r_from=module.params['ipv6_first_addr'],
|
|
||||||
prefix=module.params['ipv6_prefix'],
|
|
||||||
def_gw=module.params['ipv6_default_gw'],
|
|
||||||
prim_dns=module.params['ipv6_primary_dns'],
|
|
||||||
sec_dns=module.params['ipv6_secondary_dns'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,354 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_lan_connectivity
|
|
||||||
short_description: Configures LAN Connectivity Policies on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures LAN Connectivity Policies on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify LAN Connectivity Policies are present and will create if needed.
|
|
||||||
- If C(absent), will verify LAN Connectivity Policies are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the LAN Connectivity Policy.
|
|
||||||
- This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the policy is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A description of the LAN Connectivity Policy.
|
|
||||||
- Cisco recommends including information about where and when to use the policy.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
vnic_list:
|
|
||||||
description:
|
|
||||||
- List of vNICs used by the LAN Connectivity Policy.
|
|
||||||
- vNICs used by the LAN Connectivity Policy must be created from a vNIC template.
|
|
||||||
suboptions:
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the vNIC.
|
|
||||||
required: yes
|
|
||||||
vnic_template:
|
|
||||||
description:
|
|
||||||
- The name of the vNIC template.
|
|
||||||
required: yes
|
|
||||||
adapter_policy:
|
|
||||||
description:
|
|
||||||
- The name of the Ethernet adapter policy.
|
|
||||||
- A user defined policy can be used, or one of the system defined policies.
|
|
||||||
order:
|
|
||||||
description:
|
|
||||||
- String specifying the vNIC assignment order (e.g., '1', '2').
|
|
||||||
default: 'unspecified'
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify vnic is configured within policy.
|
|
||||||
If C(absent), will verify vnic is absent from policy.
|
|
||||||
choices: [ present, absent ]
|
|
||||||
default: present
|
|
||||||
version_added: '2.8'
|
|
||||||
iscsi_vnic_list:
|
|
||||||
description:
|
|
||||||
- List of iSCSI vNICs used by the LAN Connectivity Policy.
|
|
||||||
suboptions:
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the iSCSI vNIC.
|
|
||||||
required: yes
|
|
||||||
overlay_vnic:
|
|
||||||
description:
|
|
||||||
- The LAN vNIC associated with this iSCSI vNIC.
|
|
||||||
iscsi_adapter_policy:
|
|
||||||
description:
|
|
||||||
- The iSCSI adapter policy associated with this iSCSI vNIC.
|
|
||||||
mac_address:
|
|
||||||
description:
|
|
||||||
- The MAC address associated with this iSCSI vNIC.
|
|
||||||
- If the MAC address is not set, Cisco UCS Manager uses a derived MAC address.
|
|
||||||
default: derived
|
|
||||||
vlan_name:
|
|
||||||
description:
|
|
||||||
- The VLAN used for the iSCSI vNIC.
|
|
||||||
default: default
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify iscsi vnic is configured within policy.
|
|
||||||
If C(absent), will verify iscsi vnic is absent from policy.
|
|
||||||
choices: [ present, absent ]
|
|
||||||
default: present
|
|
||||||
version_added: '2.8'
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure LAN Connectivity Policy
|
|
||||||
ucs_lan_connectivity:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
vnic_list:
|
|
||||||
- name: eno1
|
|
||||||
vnic_template: Cntr-Template
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno2
|
|
||||||
vnic_template: Container-NFS-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno3
|
|
||||||
vnic_template: Container-NFS-B
|
|
||||||
adapter_policy: Linux
|
|
||||||
iscsi_vnic_list:
|
|
||||||
- name: iSCSIa
|
|
||||||
overlay_vnic: eno1
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-MGMT-VLAN
|
|
||||||
- name: iSCSIb
|
|
||||||
overlay_vnic: eno3
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-TNT-A-NFS
|
|
||||||
|
|
||||||
- name: Remove LAN Connectivity Policy
|
|
||||||
ucs_lan_connectivity:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def configure_lan_connectivity(ucs, module, dn):
|
|
||||||
from ucsmsdk.mometa.vnic.VnicLanConnPolicy import VnicLanConnPolicy
|
|
||||||
from ucsmsdk.mometa.vnic.VnicEther import VnicEther
|
|
||||||
from ucsmsdk.mometa.vnic.VnicIScsiLCP import VnicIScsiLCP
|
|
||||||
from ucsmsdk.mometa.vnic.VnicVlan import VnicVlan
|
|
||||||
|
|
||||||
if not module.check_mode:
|
|
||||||
try:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = VnicLanConnPolicy(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params.get('vnic_list'):
|
|
||||||
for vnic in module.params['vnic_list']:
|
|
||||||
if vnic['state'] == 'absent':
|
|
||||||
child_dn = dn + '/ether-' + vnic['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
ucs.login_handle.remove_mo(mo_1)
|
|
||||||
else: # state == 'present'
|
|
||||||
mo_1 = VnicEther(
|
|
||||||
addr='derived',
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=vnic['name'],
|
|
||||||
adaptor_profile_name=vnic['adapter_policy'],
|
|
||||||
nw_templ_name=vnic['vnic_template'],
|
|
||||||
order=vnic['order'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params.get('iscsi_vnic_list'):
|
|
||||||
for iscsi_vnic in module.params['iscsi_vnic_list']:
|
|
||||||
if iscsi_vnic['state'] == 'absent':
|
|
||||||
child_dn = dn + '/iscsi-' + iscsi_vnic['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
ucs.login_handle.remove_mo(mo_1)
|
|
||||||
else: # state == 'present'
|
|
||||||
mo_1 = VnicIScsiLCP(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=iscsi_vnic['name'],
|
|
||||||
adaptor_profile_name=iscsi_vnic['iscsi_adapter_policy'],
|
|
||||||
vnic_name=iscsi_vnic['overlay_vnic'],
|
|
||||||
addr=iscsi_vnic['mac_address'],
|
|
||||||
)
|
|
||||||
VnicVlan(
|
|
||||||
parent_mo_or_dn=mo_1,
|
|
||||||
vlan_name=iscsi_vnic['vlan_name'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
except Exception as e: # generic Exception handling because SDK can throw a variety of exceptions
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
|
|
||||||
def check_vnic_props(ucs, module, dn):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if module.params.get('vnic_list'):
|
|
||||||
# check vnicEther props
|
|
||||||
for vnic in module.params['vnic_list']:
|
|
||||||
child_dn = dn + '/ether-' + vnic['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
if vnic['state'] == 'absent':
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else: # state == 'present'
|
|
||||||
kwargs = dict(adaptor_profile_name=vnic['adapter_policy'])
|
|
||||||
kwargs['order'] = vnic['order']
|
|
||||||
kwargs['nw_templ_name'] = vnic['vnic_template']
|
|
||||||
if not (mo_1.check_prop_match(**kwargs)):
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else: # mo_1 did not exist
|
|
||||||
if vnic['state'] == 'present':
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_iscsi_vnic_props(ucs, module, dn):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if module.params.get('iscsi_vnic_list'):
|
|
||||||
# check vnicIScsiLCP props
|
|
||||||
for iscsi_vnic in module.params['iscsi_vnic_list']:
|
|
||||||
child_dn = dn + '/iscsi-' + iscsi_vnic['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
if iscsi_vnic['state'] == 'absent':
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else: # state == 'present'
|
|
||||||
kwargs = dict(vnic_name=iscsi_vnic['overlay_vnic'])
|
|
||||||
kwargs['adaptor_profile_name'] = iscsi_vnic['iscsi_adapter_policy']
|
|
||||||
kwargs['addr'] = iscsi_vnic['mac_address']
|
|
||||||
if (mo_1.check_prop_match(**kwargs)):
|
|
||||||
# check vlan
|
|
||||||
child_dn = child_dn + '/vlan'
|
|
||||||
mo_2 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_2:
|
|
||||||
kwargs = dict(vlan_name=iscsi_vnic['vlan_name'])
|
|
||||||
if not (mo_2.check_prop_match(**kwargs)):
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else: # mo_1 props did not match
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else: # mo_1 did not exist
|
|
||||||
if iscsi_vnic['state'] == 'present':
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_lan_connecivity_props(ucs, module, mo, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
# check vnic 1st
|
|
||||||
props_match = check_vnic_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_iscsi_vnic_props(ucs, module, dn)
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
vnic = dict(
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
vnic_template=dict(type='str', required=True),
|
|
||||||
adapter_policy=dict(type='str', default=''),
|
|
||||||
order=dict(type='str', default='unspecified'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
iscsi_vnic = dict(
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
overlay_vnic=dict(type='str', default=''),
|
|
||||||
iscsi_adapter_policy=dict(type='str', default=''),
|
|
||||||
mac_address=dict(type='str', default='derived'),
|
|
||||||
vlan_name=dict(type='str', default='default'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
vnic_list=dict(type='list', elements='dict', options=vnic),
|
|
||||||
iscsi_vnic_list=dict(type='list', elements='dict', options=iscsi_vnic),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Additional imports are done below or in called functions.
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/lan-conn-pol-<name>
|
|
||||||
dn = module.params['org_dn'] + '/lan-conn-pol-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else: # state == 'present'
|
|
||||||
props_match = check_lan_connecivity_props(ucs, module, mo, dn)
|
|
||||||
|
|
||||||
if module.params['state'] == 'present' and not props_match:
|
|
||||||
configure_lan_connectivity(ucs, module, dn)
|
|
||||||
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,185 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_mac_pool
|
|
||||||
short_description: Configures MAC address pools on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures MAC address pools and MAC address blocks on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify MAC pool is present and will create if needed.
|
|
||||||
- If C(absent), will verify MAC pool is absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the MAC pool.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the MAC pool is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A description of the MAC pool.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr, descrption ]
|
|
||||||
order:
|
|
||||||
description:
|
|
||||||
- The Assignment Order field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "default - Cisco UCS Manager selects a random identity from the pool."
|
|
||||||
- "sequential - Cisco UCS Manager selects the lowest available identity from the pool."
|
|
||||||
choices: [default, sequential]
|
|
||||||
default: default
|
|
||||||
first_addr:
|
|
||||||
description:
|
|
||||||
- The first MAC address in the block of addresses.
|
|
||||||
- This is the From field in the UCS Manager MAC Blocks menu.
|
|
||||||
last_addr:
|
|
||||||
description:
|
|
||||||
- The last MAC address in the block of addresses.
|
|
||||||
- This is the To field in the UCS Manager Add MAC Blocks menu.
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- The distinguished name (dn) of the organization where the resource is assigned.
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure MAC address pool
|
|
||||||
ucs_mac_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: mac-A
|
|
||||||
first_addr: 00:25:B5:00:66:00
|
|
||||||
last_addr: 00:25:B5:00:67:F3
|
|
||||||
order: sequential
|
|
||||||
|
|
||||||
- name: Remove MAC address pool
|
|
||||||
ucs_mac_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: mac-A
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
descr=dict(type='str', default='', aliases=['description', 'descrption']),
|
|
||||||
order=dict(type='str', default='default', choices=['default', 'sequential']),
|
|
||||||
first_addr=dict(type='str'),
|
|
||||||
last_addr=dict(type='str'),
|
|
||||||
state=dict(default='present', choices=['present', 'absent'], type='str'),
|
|
||||||
)
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.macpool.MacpoolPool import MacpoolPool
|
|
||||||
from ucsmsdk.mometa.macpool.MacpoolBlock import MacpoolBlock
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/mac-pool-<name>
|
|
||||||
dn = module.params['org_dn'] + '/mac-pool-' + module.params['name']
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(assignment_order=module.params['order'])
|
|
||||||
kwargs['descr'] = module.params['descr']
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if module.params['last_addr'] and module.params['first_addr']:
|
|
||||||
# mac address block specified, check properties
|
|
||||||
block_dn = dn + '/block-' + module.params['first_addr'].upper() + '-' + module.params['last_addr'].upper()
|
|
||||||
mo_1 = ucs.login_handle.query_dn(block_dn)
|
|
||||||
if mo_1:
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# no MAC address block specified, but top-level props matched
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = MacpoolPool(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['descr'],
|
|
||||||
assignment_order=module.params['order'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['last_addr'] and module.params['first_addr']:
|
|
||||||
mo_1 = MacpoolBlock(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
to=module.params['last_addr'],
|
|
||||||
r_from=module.params['first_addr'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,263 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_managed_objects
|
|
||||||
short_description: Configures Managed Objects on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures Managed Objects on Cisco UCS Manager.
|
|
||||||
- The Python SDK module, Python class within the module (UCSM Class), and all properties must be directly specified.
|
|
||||||
- More information on the UCSM Python SDK and how to directly configure Managed Objects is available at L(UCSM Python SDK,http://ucsmsdk.readthedocs.io/).
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify that the Managed Objects are present and will create if needed.
|
|
||||||
- If C(absent), will verify that the Managed Objects are absent and will delete if needed.
|
|
||||||
choices: [ absent, present ]
|
|
||||||
default: present
|
|
||||||
objects:
|
|
||||||
description:
|
|
||||||
- List of managed objects to configure. Each managed object has suboptions the specify the Python SDK module, class, and properties to configure.
|
|
||||||
suboptions:
|
|
||||||
module:
|
|
||||||
description:
|
|
||||||
- Name of the Python SDK module implementing the required class.
|
|
||||||
required: yes
|
|
||||||
class_name:
|
|
||||||
description:
|
|
||||||
- Name of the Python class that will be used to configure the Managed Object.
|
|
||||||
required: yes
|
|
||||||
properties:
|
|
||||||
description:
|
|
||||||
- List of properties to configure on the Managed Object. See the UCSM Python SDK for information on properties for each class.
|
|
||||||
required: yes
|
|
||||||
children:
|
|
||||||
description:
|
|
||||||
- Optional list of child objects. Each child has its own module, class, and properties suboptions.
|
|
||||||
- The parent_mo_or_dn property for child objects is automatically set as the list of children is configured.
|
|
||||||
required: yes
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.8'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure Network Control Policy
|
|
||||||
ucs_managed_objects:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
objects:
|
|
||||||
- module: ucsmsdk.mometa.nwctrl.NwctrlDefinition
|
|
||||||
class: NwctrlDefinition
|
|
||||||
properties:
|
|
||||||
parent_mo_or_dn: org-root
|
|
||||||
cdp: enabled
|
|
||||||
descr: ''
|
|
||||||
lldp_receive: enabled
|
|
||||||
lldp_transmit: enabled
|
|
||||||
name: Enable-CDP-LLDP
|
|
||||||
|
|
||||||
- name: Remove Network Control Policy
|
|
||||||
ucs_managed_objects:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
objects:
|
|
||||||
- module: ucsmsdk.mometa.nwctrl.NwctrlDefinition
|
|
||||||
class: NwctrlDefinition
|
|
||||||
properties:
|
|
||||||
parent_mo_or_dn: org-root
|
|
||||||
name: Enable-CDP-LLDP
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Configure Boot Policy Using JSON objects list with children
|
|
||||||
ucs_managed_objects:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
objects:
|
|
||||||
- {
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootPolicy",
|
|
||||||
"class": "LsbootPolicy",
|
|
||||||
"properties": {
|
|
||||||
"parent_mo_or_dn": "org-root",
|
|
||||||
"name": "Python_SDS",
|
|
||||||
"enforce_vnic_name": "yes",
|
|
||||||
"boot_mode": "legacy",
|
|
||||||
"reboot_on_update": "no"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootVirtualMedia",
|
|
||||||
"class": "LsbootVirtualMedia",
|
|
||||||
"properties": {
|
|
||||||
"access": "read-only-local",
|
|
||||||
"lun_id": "0",
|
|
||||||
"order": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootStorage",
|
|
||||||
"class": "LsbootStorage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootLocalStorage",
|
|
||||||
"class": "LsbootLocalStorage",
|
|
||||||
"properties": {},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootDefaultLocalImage",
|
|
||||||
"class": "LsbootDefaultLocalImage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Remove Boot Policy Using JSON objects list
|
|
||||||
ucs_managed_objects:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
objects:
|
|
||||||
- {
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootPolicy",
|
|
||||||
"class": "LsbootPolicy",
|
|
||||||
"properties": {
|
|
||||||
"parent_mo_or_dn": "org-root",
|
|
||||||
"name": "Python_SDS"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
IMPORT_IMP_ERR = None
|
|
||||||
try:
|
|
||||||
from importlib import import_module
|
|
||||||
HAS_IMPORT_MODULE = True
|
|
||||||
except Exception:
|
|
||||||
IMPORT_IMP_ERR = traceback.format_exc()
|
|
||||||
HAS_IMPORT_MODULE = False
|
|
||||||
|
|
||||||
from copy import deepcopy
|
|
||||||
import json
|
|
||||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def traverse_objects(module, ucs, managed_object, mo=''):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
mo_module = import_module(managed_object['module'])
|
|
||||||
mo_class = getattr(mo_module, managed_object['class'])
|
|
||||||
|
|
||||||
if not managed_object['properties'].get('parent_mo_or_dn'):
|
|
||||||
managed_object['properties']['parent_mo_or_dn'] = mo
|
|
||||||
|
|
||||||
mo = mo_class(**managed_object['properties'])
|
|
||||||
|
|
||||||
existing_mo = ucs.login_handle.query_dn(mo.dn)
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist, but all properties do not have to match
|
|
||||||
if existing_mo:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(existing_mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else:
|
|
||||||
if existing_mo:
|
|
||||||
# check mo props
|
|
||||||
kwargs = dict(managed_object['properties'])
|
|
||||||
# remove parent info and passwords because those aren't presented in the actual props
|
|
||||||
kwargs.pop('parent_mo_or_dn', None)
|
|
||||||
kwargs.pop('pwd', None)
|
|
||||||
kwargs.pop('password', None)
|
|
||||||
if existing_mo.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
try:
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
except Exception as e:
|
|
||||||
ucs.result['err'] = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
if managed_object.get('children'):
|
|
||||||
for child in managed_object['children']:
|
|
||||||
# explicit deep copy of child object since traverse_objects may modify parent mo information
|
|
||||||
copy_of_child = deepcopy(child)
|
|
||||||
traverse_objects(module, ucs, copy_of_child, mo)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
object_dict = dict(
|
|
||||||
module=dict(type='str', required=True),
|
|
||||||
class_name=dict(type='str', aliases=['class'], required=True),
|
|
||||||
properties=dict(type='dict', required=True),
|
|
||||||
children=dict(type='list'),
|
|
||||||
)
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
objects=dict(type='list', elements='dict', options=object_dict, required=True),
|
|
||||||
state=dict(type='str', choices=['present', 'absent'], default='present'),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
if not HAS_IMPORT_MODULE:
|
|
||||||
module.fail_json(msg=missing_required_lib('importlib'), exception=IMPORT_IMP_ERR)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
ucs.result['err'] = False
|
|
||||||
# note that all objects specified in the object list report a single result (including a single changed).
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
|
|
||||||
for managed_object in module.params['objects']:
|
|
||||||
traverse_objects(module, ucs, managed_object)
|
|
||||||
|
|
||||||
if ucs.result['err']:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,169 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_ntp_server
|
|
||||||
short_description: Configures NTP server on Cisco UCS Manager
|
|
||||||
extends_documentation_fragment:
|
|
||||||
- ucs
|
|
||||||
description:
|
|
||||||
- Configures NTP server on Cisco UCS Manager.
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(absent), will remove an NTP server.
|
|
||||||
- If C(present), will add or update an NTP server.
|
|
||||||
choices: [absent, present]
|
|
||||||
default: present
|
|
||||||
|
|
||||||
ntp_server:
|
|
||||||
description:
|
|
||||||
- NTP server IP address or hostname.
|
|
||||||
- Enter up to 63 characters that form a valid hostname.
|
|
||||||
- Enter a valid IPV4 Address.
|
|
||||||
aliases: [ name ]
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the NTP server.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- John McDonough (@movinalot)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: "2.7"
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure NTP server
|
|
||||||
ucs_ntp_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
ntp_server: 10.10.10.10
|
|
||||||
description: Internal NTP Server by IP address
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Configure NTP server
|
|
||||||
ucs_ntp_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
ntp_server: pool.ntp.org
|
|
||||||
description: External NTP Server by hostname
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Remove NTP server
|
|
||||||
ucs_ntp_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
ntp_server: 10.10.10.10
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove NTP server
|
|
||||||
ucs_ntp_server:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
ntp_server: pool.ntp.org
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def run_module():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
ntp_server=dict(type='str', aliases=['name']),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['state', 'present', ['ntp_server']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.comm.CommNtpProvider import CommNtpProvider
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
dn = 'sys/svc-ext/datetime-svc/ntp-' + module.params['ntp_server']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# update/add mo
|
|
||||||
mo = CommNtpProvider(parent_mo_or_dn='sys/svc-ext/datetime-svc',
|
|
||||||
name=module.params['ntp_server'],
|
|
||||||
descr=module.params['description'])
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
run_module()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,225 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_org
|
|
||||||
|
|
||||||
short_description: Manages UCS Organizations for UCS Manager
|
|
||||||
|
|
||||||
description:
|
|
||||||
- Manages UCS Organizations for UCS Manager.
|
|
||||||
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(absent), will remove organization.
|
|
||||||
- If C(present), will create or update organization.
|
|
||||||
choices: [absent, present]
|
|
||||||
default: present
|
|
||||||
type: str
|
|
||||||
|
|
||||||
org_name:
|
|
||||||
description:
|
|
||||||
- The name of the organization.
|
|
||||||
- Enter up to 16 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ name ]
|
|
||||||
type: str
|
|
||||||
|
|
||||||
parent_org_path:
|
|
||||||
description:
|
|
||||||
- A forward slash / separated hierarchical path from the root organization to the parent of the organization to be added or updated.
|
|
||||||
- UCS Manager supports a hierarchical structure of organizations up to five levels deep not including the root organization.
|
|
||||||
- For example the parent_org_path for an organization named level5 could be root/level1/level2/level3/level4/level5
|
|
||||||
default: root
|
|
||||||
type: str
|
|
||||||
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the organization.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
type: str
|
|
||||||
|
|
||||||
delegate_to:
|
|
||||||
description:
|
|
||||||
- Where the module will be run
|
|
||||||
default: localhost
|
|
||||||
type: str
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
|
|
||||||
author:
|
|
||||||
- John McDonough (@movinalot)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: "2.8"
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Add UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: test
|
|
||||||
description: testing org
|
|
||||||
state: present
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Update UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: test
|
|
||||||
description: Testing org
|
|
||||||
state: present
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Add UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: level1
|
|
||||||
parent_org_path: root
|
|
||||||
description: level1 org
|
|
||||||
state: present
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Add UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: level2
|
|
||||||
parent_org_path: root/level1
|
|
||||||
description: level2 org
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Add UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: level3
|
|
||||||
parent_org_path: root/level1/level2
|
|
||||||
description: level3 org
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Remove UCS Organization
|
|
||||||
ucs_org:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
org_name: level2
|
|
||||||
parent_org_path: root/level1/
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_name=dict(type='str', aliases=['name']),
|
|
||||||
parent_org_path=dict(type='str', default='root'),
|
|
||||||
description=dict(type='str', aliases=['descr']),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
delegate_to=dict(type='str', default='localhost'),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['state', 'present', ['org_name']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Imports are below for UCS object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
from ucsmsdk.mometa.org.OrgOrg import OrgOrg
|
|
||||||
|
|
||||||
err = False
|
|
||||||
changed = False
|
|
||||||
requested_state = module.params['state']
|
|
||||||
|
|
||||||
kwargs = dict()
|
|
||||||
|
|
||||||
if module.params['description'] is not None:
|
|
||||||
kwargs['descr'] = module.params['description']
|
|
||||||
|
|
||||||
try:
|
|
||||||
parent_org_dn = 'org-' + module.params['parent_org_path'].replace('/', '/org-')
|
|
||||||
dn = parent_org_dn + '/org-' + module.params['org_name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
|
|
||||||
# Determine state change
|
|
||||||
if mo:
|
|
||||||
# Object exists, if it should exist has anything changed?
|
|
||||||
if requested_state == 'present':
|
|
||||||
# Do some or all Object properties not match, that is a change
|
|
||||||
if not mo.check_prop_match(**kwargs):
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
# Object does not exist but should, that is a change
|
|
||||||
else:
|
|
||||||
if requested_state == 'present':
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
# Object exists but should not, that is a change
|
|
||||||
if mo and requested_state == 'absent':
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
# Apply state if not check_mode
|
|
||||||
if changed and not module.check_mode:
|
|
||||||
if requested_state == 'absent':
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
else:
|
|
||||||
kwargs['parent_mo_or_dn'] = parent_org_dn
|
|
||||||
kwargs['name'] = module.params['org_name']
|
|
||||||
if module.params['description'] is not None:
|
|
||||||
kwargs['descr'] = module.params['description']
|
|
||||||
|
|
||||||
mo = OrgOrg(**kwargs)
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,171 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_query
|
|
||||||
|
|
||||||
short_description: Queries UCS Manager objects by class or distinguished name
|
|
||||||
|
|
||||||
description:
|
|
||||||
-Queries UCS Manager objects by class or distinguished name.
|
|
||||||
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
|
|
||||||
options:
|
|
||||||
class_ids:
|
|
||||||
description:
|
|
||||||
- One or more UCS Manager Class IDs to query.
|
|
||||||
- As a comma separated list
|
|
||||||
type: str
|
|
||||||
|
|
||||||
distinguished_names:
|
|
||||||
description:
|
|
||||||
- One or more UCS Manager Distinguished Names to query.
|
|
||||||
- As a comma separated list
|
|
||||||
type: str
|
|
||||||
|
|
||||||
delegate_to:
|
|
||||||
description:
|
|
||||||
- Where the module will be run
|
|
||||||
default: localhost
|
|
||||||
type: str
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
|
|
||||||
author:
|
|
||||||
- John McDonough (@movinalot)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: "2.10"
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Query UCS Class ID
|
|
||||||
ucs_query:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
class_ids: computeBlade
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Query UCS Class IDs
|
|
||||||
ucs_query:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
class_ids: computeBlade, fabricVlan
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Query UCS Distinguished Name
|
|
||||||
ucs_query:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
distinguished_names: org-root
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
- name: Query UCS Distinguished Names
|
|
||||||
ucs_query:
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
distinguished_names: org-root, sys/rack-unit-1, sys/chassis-1/blade-2
|
|
||||||
delegate_to: localhost
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def retrieve_class_id(class_id, ucs):
|
|
||||||
return ucs.login_handle.query_classid(class_id)
|
|
||||||
|
|
||||||
|
|
||||||
def retrieve_distinguished_name(distinguished_name, ucs):
|
|
||||||
return ucs.login_handle.query_dn(distinguished_name)
|
|
||||||
|
|
||||||
|
|
||||||
def make_mo_dict(ucs_mo):
|
|
||||||
obj_dict = {}
|
|
||||||
for mo_property in ucs_mo.prop_map.values():
|
|
||||||
obj_dict[mo_property] = getattr(ucs_mo, mo_property)
|
|
||||||
return obj_dict
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
class_ids=dict(type='str'),
|
|
||||||
distinguished_names=dict(type='str'),
|
|
||||||
delegate_to=dict(type='str', default='localhost'),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=False,
|
|
||||||
mutually_exclusive=[
|
|
||||||
['class_ids', 'distinguished_names'],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Imports are below for UCS object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
err = False
|
|
||||||
query_result = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
if module.params['class_ids']:
|
|
||||||
class_ids = [
|
|
||||||
x.strip() for x in module.params['class_ids'].split(',')
|
|
||||||
]
|
|
||||||
for class_id in class_ids:
|
|
||||||
query_result[class_id] = []
|
|
||||||
ucs_mos = retrieve_class_id(class_id, ucs)
|
|
||||||
if ucs_mos:
|
|
||||||
for ucs_mo in ucs_mos:
|
|
||||||
query_result[class_id].append(make_mo_dict(ucs_mo))
|
|
||||||
|
|
||||||
ucs.result['objects'] = query_result
|
|
||||||
|
|
||||||
elif module.params['distinguished_names']:
|
|
||||||
distinguished_names = [
|
|
||||||
x.strip()
|
|
||||||
for x in module.params['distinguished_names'].split(',')
|
|
||||||
]
|
|
||||||
for distinguished_name in distinguished_names:
|
|
||||||
query_result[distinguished_name] = {}
|
|
||||||
ucs_mo = retrieve_distinguished_name(distinguished_name, ucs)
|
|
||||||
|
|
||||||
if ucs_mo:
|
|
||||||
query_result[distinguished_name] = make_mo_dict(ucs_mo)
|
|
||||||
|
|
||||||
ucs.result['objects'] = query_result
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,247 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_san_connectivity
|
|
||||||
short_description: Configures SAN Connectivity Policies on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures SAN Connectivity Policies on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify SAN Connectivity Policies are present and will create if needed.
|
|
||||||
- If C(absent), will verify SAN Connectivity Policies are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the SAN Connectivity Policy.
|
|
||||||
- This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the policy is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A description of the policy.
|
|
||||||
- Cisco recommends including information about where and when to use the policy.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
wwnn_pool:
|
|
||||||
description:
|
|
||||||
- Name of the WWNN pool to use for WWNN assignment.
|
|
||||||
default: default
|
|
||||||
vhba_list:
|
|
||||||
description:
|
|
||||||
- List of vHBAs used by the SAN Connectivity Policy.
|
|
||||||
- vHBAs used by the SAN Connectivity Policy must be created from a vHBA template.
|
|
||||||
- "Each list element has the following suboptions:"
|
|
||||||
- "= name"
|
|
||||||
- " The name of the virtual HBA (required)."
|
|
||||||
- "= vhba_template"
|
|
||||||
- " The name of the virtual HBA template (required)."
|
|
||||||
- "- adapter_policy"
|
|
||||||
- " The name of the Fibre Channel adapter policy."
|
|
||||||
- " A user defined policy can be used, or one of the system defined policies (default, Linux, Solaris, VMware, Windows, WindowsBoot)"
|
|
||||||
- " [Default: default]"
|
|
||||||
- "- order"
|
|
||||||
- " String specifying the vHBA assignment order (e.g., '1', '2')."
|
|
||||||
- " [Default: unspecified]"
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure SAN Connectivity Policy
|
|
||||||
ucs_san_connectivity:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
wwnn_pool: WWNN-Pool
|
|
||||||
vhba_list:
|
|
||||||
- name: Fabric-A
|
|
||||||
vhba_template: vHBA-Template-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: Fabric-B
|
|
||||||
vhba_template: vHBA-Template-B
|
|
||||||
adapter_policy: Linux
|
|
||||||
|
|
||||||
- name: Remove SAN Connectivity Policy
|
|
||||||
ucs_san_connectivity:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str'),
|
|
||||||
descr=dict(type='str'),
|
|
||||||
wwnn_pool=dict(type='str', default='default'),
|
|
||||||
vhba_list=dict(type='list'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
san_connectivity_list=dict(type='list'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Note that use of san_connectivity_list is an experimental feature which allows multiple resource updates with a single UCSM connection.
|
|
||||||
# Support for san_connectivity_list may change or be removed once persistent UCS connections are supported.
|
|
||||||
# Either san_connectivity_list or name is required (user can specify either a list or single resource).
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_one_of=[
|
|
||||||
['san_connectivity_list', 'name'],
|
|
||||||
],
|
|
||||||
mutually_exclusive=[
|
|
||||||
['san_connectivity_list', 'name'],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.vnic.VnicSanConnPolicy import VnicSanConnPolicy
|
|
||||||
from ucsmsdk.mometa.vnic.VnicFcNode import VnicFcNode
|
|
||||||
from ucsmsdk.mometa.vnic.VnicFc import VnicFc
|
|
||||||
from ucsmsdk.mometa.vnic.VnicFcIf import VnicFcIf
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
# Only documented use is a single resource, but to also support experimental
|
|
||||||
# feature allowing multiple updates all params are converted to a san_connectivity_list below.
|
|
||||||
|
|
||||||
if module.params['san_connectivity_list']:
|
|
||||||
# directly use the list (single resource and list are mutually exclusive
|
|
||||||
san_connectivity_list = module.params['san_connectivity_list']
|
|
||||||
else:
|
|
||||||
# single resource specified, create list from the current params
|
|
||||||
san_connectivity_list = [module.params]
|
|
||||||
for san_connectivity in san_connectivity_list:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# set default params. Done here to set values for lists which can't be done in the argument_spec
|
|
||||||
if not san_connectivity.get('descr'):
|
|
||||||
san_connectivity['descr'] = ''
|
|
||||||
if not san_connectivity.get('wwnn_pool'):
|
|
||||||
san_connectivity['wwnn_pool'] = 'default'
|
|
||||||
if san_connectivity.get('vhba_list'):
|
|
||||||
for vhba in san_connectivity['vhba_list']:
|
|
||||||
if not vhba.get('adapter_policy'):
|
|
||||||
vhba['adapter_policy'] = ''
|
|
||||||
if not vhba.get('order'):
|
|
||||||
vhba['order'] = 'unspecified'
|
|
||||||
# dn is <org_dn>/san-conn-pol-<name>
|
|
||||||
dn = module.params['org_dn'] + '/san-conn-pol-' + san_connectivity['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=san_connectivity['descr'])
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
# vnicFcNode object
|
|
||||||
child_dn = dn + '/fc-node'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(ident_pool_name=san_connectivity['wwnn_pool'])
|
|
||||||
if (mo_1.check_prop_match(**kwargs)):
|
|
||||||
if not san_connectivity.get('vhba_list'):
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# check vnicFc props
|
|
||||||
for vhba in san_connectivity['vhba_list']:
|
|
||||||
child_dn = dn + '/fc-' + vhba['name']
|
|
||||||
mo_2 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
kwargs = {}
|
|
||||||
kwargs['adaptor_profile_name'] = vhba['adapter_policy']
|
|
||||||
kwargs['order'] = vhba['order']
|
|
||||||
kwargs['nw_templ_name'] = vhba['vhba_template']
|
|
||||||
if (mo_2.check_prop_match(**kwargs)):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = VnicSanConnPolicy(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=san_connectivity['name'],
|
|
||||||
descr=san_connectivity['descr'],
|
|
||||||
)
|
|
||||||
mo_1 = VnicFcNode(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
ident_pool_name=san_connectivity['wwnn_pool'],
|
|
||||||
addr='pool-derived',
|
|
||||||
)
|
|
||||||
if san_connectivity.get('vhba_list'):
|
|
||||||
for vhba in san_connectivity['vhba_list']:
|
|
||||||
mo_2 = VnicFc(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=vhba['name'],
|
|
||||||
adaptor_profile_name=vhba['adapter_policy'],
|
|
||||||
nw_templ_name=vhba['vhba_template'],
|
|
||||||
order=vhba['order'],
|
|
||||||
)
|
|
||||||
mo_2_1 = VnicFcIf(
|
|
||||||
parent_mo_or_dn=mo_2,
|
|
||||||
name='default',
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,516 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_service_profile_template
|
|
||||||
short_description: Configures Service Profile Templates on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures Service Profile Templates on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify Service Profile Templates are present and will create if needed.
|
|
||||||
- If C(absent), will verify Service Profile Templates are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the service profile template.
|
|
||||||
- This name can be between 2 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- This name must be unique across all service profiles and service profile templates within the same organization.
|
|
||||||
required: yes
|
|
||||||
template_type:
|
|
||||||
description:
|
|
||||||
- "The template type field which can be one of the following:"
|
|
||||||
- "initial-template — Any service profiles created from this template are not updated if the template changes."
|
|
||||||
- "updating-template — Any service profiles created from this template are updated if the template changes."
|
|
||||||
choices: [initial-template, updating-template]
|
|
||||||
default: initial-template
|
|
||||||
uuid_pool:
|
|
||||||
description:
|
|
||||||
- Specifies how the UUID will be set on a server associated with a service profile created from this template.
|
|
||||||
- "The uuid_pool option can be the name of the UUID pool to use or '' (the empty string)."
|
|
||||||
- An empty string will use the UUID assigned to the server by the manufacturer, and the
|
|
||||||
- UUID remains unassigned until a service profile created from this template is associated with a server. At that point,
|
|
||||||
- the UUID is set to the UUID value assigned to the server by the manufacturer. If the service profile is later moved to
|
|
||||||
- a different server, the UUID is changed to match the new server."
|
|
||||||
default: default
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the service profile template.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
storage_profile:
|
|
||||||
description:
|
|
||||||
- The name of the storage profile you want to associate with service profiles created from this template
|
|
||||||
local_disk_policy:
|
|
||||||
description:
|
|
||||||
- The name of the local disk policy you want to associate with service profiles created from this template.
|
|
||||||
lan_connectivity_policy:
|
|
||||||
description:
|
|
||||||
- The name of the LAN connectivity policy you want to associate with service profiles created from this template.
|
|
||||||
iqn_pool:
|
|
||||||
description:
|
|
||||||
- The name of the IQN pool (initiator) you want to apply to all iSCSI vNICs for service profiles created from this template.
|
|
||||||
san_connectivity_policy:
|
|
||||||
description:
|
|
||||||
- The name of the SAN connectivity policy you want to associate with service profiles created from this template.
|
|
||||||
vmedia_policy:
|
|
||||||
description:
|
|
||||||
- The name of the vMedia policy you want to associate with service profiles created from this template.
|
|
||||||
boot_policy:
|
|
||||||
description:
|
|
||||||
- The name of the boot order policy you want to associate with service profiles created from this template.
|
|
||||||
default: default
|
|
||||||
maintenance_policy:
|
|
||||||
description:
|
|
||||||
- The name of the maintenance policy you want to associate with service profiles created from this template.
|
|
||||||
server_pool:
|
|
||||||
description:
|
|
||||||
- The name of the server pool you want to associate with this service profile template.
|
|
||||||
server_pool_qualification:
|
|
||||||
description:
|
|
||||||
- The name of the server pool policy qualification you want to use for this service profile template.
|
|
||||||
power_state:
|
|
||||||
description:
|
|
||||||
- The power state to be applied when a service profile created from this template is associated with a server.
|
|
||||||
choices: [up, down]
|
|
||||||
default: up
|
|
||||||
host_firmware_package:
|
|
||||||
description:
|
|
||||||
- The name of the host firmware package you want to associate with service profiles created from this template.
|
|
||||||
bios_policy:
|
|
||||||
description:
|
|
||||||
- The name of the BIOS policy you want to associate with service profiles created from this template.
|
|
||||||
ipmi_access_profile:
|
|
||||||
description:
|
|
||||||
- The name of the IPMI access profile you want to associate with service profiles created from this template.
|
|
||||||
sol_policy:
|
|
||||||
description:
|
|
||||||
- The name of the Serial over LAN (SoL) policy you want to associate with service profiles created from this template.
|
|
||||||
mgmt_ip_pool:
|
|
||||||
description:
|
|
||||||
- The name of the management IP pool you want to use with service profiles created from this template.
|
|
||||||
default: ext-mgmt
|
|
||||||
power_control_policy:
|
|
||||||
description:
|
|
||||||
- The name of the power control policy you want to associate with service profiles created from this template.
|
|
||||||
default: default
|
|
||||||
power_sync_policy:
|
|
||||||
description:
|
|
||||||
- The name of the power sync policy you want to associate with service profiles created from this template.
|
|
||||||
scrub_policy:
|
|
||||||
description:
|
|
||||||
- The name of the scrub policy you want to associate with service profiles created from this template.
|
|
||||||
kvm_mgmt_policy:
|
|
||||||
description:
|
|
||||||
- The name of the KVM management policy you want to associate with service profiles created from this template.
|
|
||||||
graphics_card_policy:
|
|
||||||
description:
|
|
||||||
- The name of the graphics card policy you want to associate with service profiles created from this template.
|
|
||||||
threshold_policy:
|
|
||||||
description:
|
|
||||||
- The name of the threshold policy you want to associate with service profiles created from this template.
|
|
||||||
default: default
|
|
||||||
user_label:
|
|
||||||
description:
|
|
||||||
- The User Label you want to assign to service profiles created from this template.
|
|
||||||
mgmt_interface_mode:
|
|
||||||
description:
|
|
||||||
- The Management Interface you want to assign to service profiles created from this template.
|
|
||||||
choices: ['', in-band]
|
|
||||||
mgmt_vnet_name:
|
|
||||||
description:
|
|
||||||
- A VLAN selected from the associated VLAN group.
|
|
||||||
mgmt_inband_pool_name:
|
|
||||||
description:
|
|
||||||
- How the inband management IPv4 address is derived for the server associated with this service profile.
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.8'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure Service Profile Template with LAN/SAN Connectivity and all other options defaulted
|
|
||||||
ucs_service_profile_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-Ctrl
|
|
||||||
template_type: updating-template
|
|
||||||
uuid_pool: UUID-Pool
|
|
||||||
storage_profile: DEE-StgProf
|
|
||||||
lan_connectivity_policy: Cntr-FC-Boot
|
|
||||||
iqn_pool: iSCSI-Boot-A
|
|
||||||
san_connectivity_policy: Cntr-FC-Boot
|
|
||||||
boot_policy: DEE-vMedia
|
|
||||||
maintenance_policy: default
|
|
||||||
server_pool: Container-Pool
|
|
||||||
host_firmware_package: 3.1.2b
|
|
||||||
bios_policy: Docker
|
|
||||||
|
|
||||||
- name: Remove Service Profile Template
|
|
||||||
ucs_service_profile_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-Ctrl
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def configure_service_profile_template(ucs, module):
|
|
||||||
from ucsmsdk.mometa.ls.LsServer import LsServer
|
|
||||||
from ucsmsdk.mometa.vnic.VnicConnDef import VnicConnDef
|
|
||||||
from ucsmsdk.mometa.vnic.VnicIScsiNode import VnicIScsiNode
|
|
||||||
from ucsmsdk.mometa.ls.LsRequirement import LsRequirement
|
|
||||||
from ucsmsdk.mometa.ls.LsPower import LsPower
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageProfileBinding import LstorageProfileBinding
|
|
||||||
from ucsmsdk.mometa.mgmt.MgmtInterface import MgmtInterface
|
|
||||||
from ucsmsdk.mometa.mgmt.MgmtVnet import MgmtVnet
|
|
||||||
from ucsmsdk.mometa.vnic.VnicIpV4MgmtPooledAddr import VnicIpV4MgmtPooledAddr
|
|
||||||
|
|
||||||
if not module.check_mode:
|
|
||||||
try:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = LsServer(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
bios_profile_name=module.params['bios_policy'],
|
|
||||||
boot_policy_name=module.params['boot_policy'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
ext_ip_state='pooled',
|
|
||||||
ext_ip_pool_name=module.params['mgmt_ip_pool'],
|
|
||||||
# graphics_card_policy_name=module.params['graphics_card_policy'],
|
|
||||||
host_fw_policy_name=module.params['host_firmware_package'],
|
|
||||||
ident_pool_name=module.params['uuid_pool'],
|
|
||||||
kvm_mgmt_policy_name=module.params['kvm_mgmt_policy'],
|
|
||||||
local_disk_policy_name=module.params['local_disk_policy'],
|
|
||||||
maint_policy_name=module.params['maintenance_policy'],
|
|
||||||
mgmt_access_policy_name=module.params['ipmi_access_profile'],
|
|
||||||
name=module.params['name'],
|
|
||||||
power_policy_name=module.params['power_control_policy'],
|
|
||||||
power_sync_policy_name=module.params['power_sync_policy'],
|
|
||||||
scrub_policy_name=module.params['scrub_policy'],
|
|
||||||
sol_policy_name=module.params['sol_policy'],
|
|
||||||
stats_policy_name=module.params['threshold_policy'],
|
|
||||||
type=module.params['template_type'],
|
|
||||||
usr_lbl=module.params['user_label'],
|
|
||||||
vmedia_policy_name=module.params['vmedia_policy'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['storage_profile']:
|
|
||||||
# Storage profile
|
|
||||||
mo_1 = LstorageProfileBinding(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
storage_profile_name=module.params['storage_profile'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['mgmt_interface_mode']:
|
|
||||||
# Management Interface
|
|
||||||
mo_1 = MgmtInterface(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
mode=module.params['mgmt_interface_mode'],
|
|
||||||
ip_v4_state='pooled',
|
|
||||||
)
|
|
||||||
mo_2 = MgmtVnet(
|
|
||||||
parent_mo_or_dn=mo_1,
|
|
||||||
id='1',
|
|
||||||
name=module.params['mgmt_vnet_name'],
|
|
||||||
)
|
|
||||||
VnicIpV4MgmtPooledAddr(
|
|
||||||
parent_mo_or_dn=mo_2,
|
|
||||||
name=module.params['mgmt_inband_pool_name'],
|
|
||||||
)
|
|
||||||
|
|
||||||
# LAN/SAN connectivity policy
|
|
||||||
mo_1 = VnicConnDef(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
lan_conn_policy_name=module.params['lan_connectivity_policy'],
|
|
||||||
san_conn_policy_name=module.params['san_connectivity_policy'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['iqn_pool']:
|
|
||||||
# IQN pool
|
|
||||||
mo_1 = VnicIScsiNode(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
iqn_ident_pool_name=module.params['iqn_pool']
|
|
||||||
)
|
|
||||||
|
|
||||||
# power state
|
|
||||||
admin_state = 'admin-' + module.params['power_state']
|
|
||||||
mo_1 = LsPower(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
state=admin_state,
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['server_pool']:
|
|
||||||
# server pool
|
|
||||||
mo_1 = LsRequirement(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=module.params['server_pool'],
|
|
||||||
qualifier=module.params['server_pool_qualification'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
except Exception as e: # generic Exception handling because SDK can throw a variety of exceptions
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
|
|
||||||
def check_storage_profile_props(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/profile-binding'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(storage_profile_name=module.params['storage_profile'])
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['storage_profile']:
|
|
||||||
# no storage profile mo or desired state
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_connectivity_policy_props(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/conn-def'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(lan_conn_policy_name=module.params['lan_connectivity_policy'])
|
|
||||||
kwargs['san_conn_policy_name'] = module.params['san_connectivity_policy']
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['lan_connectivity_policy'] and not module.params['san_connectivity_policy']:
|
|
||||||
# no mo and no desired state
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_iqn_pool_props(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/iscsi-node'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(iqn_ident_pool_name=module.params['iqn_pool'])
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['iqn_pool']:
|
|
||||||
# no mo and no desired state
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_inband_management_props(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/iface-in-band'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(mode=module.params['mgmt_interface_mode'])
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
child_dn = child_dn + '/network'
|
|
||||||
mo_2 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_2:
|
|
||||||
kwargs = dict(name=module.params['mgmt_vnet_name'])
|
|
||||||
if mo_2.check_prop_match(**kwargs):
|
|
||||||
child_dn = child_dn + '/ipv4-pooled-addr'
|
|
||||||
mo_3 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_3:
|
|
||||||
kwargs = dict(name=module.params['mgmt_inband_pool_name'])
|
|
||||||
if mo_3.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['mgmt_interface_mode']:
|
|
||||||
# no mo and no desired state
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_power_props(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/power'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(state=module.params['power_state'])
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['power_state']:
|
|
||||||
# no mo and no desired state
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_server_pool(ucs, module, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
child_dn = dn + '/pn-req'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(name=module.params['server_pool'])
|
|
||||||
kwargs['qualifier'] = module.params['server_pool_qualification']
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
elif not module.params['server_pool']:
|
|
||||||
# no pn-req object and no server pool name provided
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def check_serivce_profile_templates_props(ucs, module, mo, dn):
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(bios_profile_name=module.params['bios_policy'])
|
|
||||||
kwargs['boot_policy_name'] = module.params['boot_policy']
|
|
||||||
kwargs['descr'] = module.params['description']
|
|
||||||
kwargs['ext_ip_pool_name'] = module.params['mgmt_ip_pool']
|
|
||||||
# kwargs['graphics_card_policy_name'] = module.params['graphics_card_policy']
|
|
||||||
kwargs['host_fw_policy_name'] = module.params['host_firmware_package']
|
|
||||||
kwargs['ident_pool_name'] = module.params['uuid_pool']
|
|
||||||
kwargs['kvm_mgmt_policy_name'] = module.params['kvm_mgmt_policy']
|
|
||||||
kwargs['local_disk_policy_name'] = module.params['local_disk_policy']
|
|
||||||
kwargs['maint_policy_name'] = module.params['maintenance_policy']
|
|
||||||
kwargs['mgmt_access_policy_name'] = module.params['ipmi_access_profile']
|
|
||||||
kwargs['power_policy_name'] = module.params['power_control_policy']
|
|
||||||
kwargs['power_sync_policy_name'] = module.params['power_sync_policy']
|
|
||||||
kwargs['scrub_policy_name'] = module.params['scrub_policy']
|
|
||||||
kwargs['sol_policy_name'] = module.params['sol_policy']
|
|
||||||
kwargs['stats_policy_name'] = module.params['threshold_policy']
|
|
||||||
kwargs['type'] = module.params['template_type']
|
|
||||||
kwargs['usr_lbl'] = module.params['user_label']
|
|
||||||
kwargs['vmedia_policy_name'] = module.params['vmedia_policy']
|
|
||||||
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
# code below should discontinue checks once any mismatch is found
|
|
||||||
|
|
||||||
# check storage profile 1st
|
|
||||||
props_match = check_storage_profile_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_connectivity_policy_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_iqn_pool_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_inband_management_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_power_props(ucs, module, dn)
|
|
||||||
|
|
||||||
if props_match:
|
|
||||||
props_match = check_server_pool(ucs, module, dn)
|
|
||||||
|
|
||||||
return props_match
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
bios_policy=dict(type='str', default=''),
|
|
||||||
boot_policy=dict(type='str', default='default'),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
mgmt_ip_pool=dict(type='str', default='ext-mgmt'),
|
|
||||||
graphics_card_policy=dict(type='str', default=''),
|
|
||||||
host_firmware_package=dict(type='str', default=''),
|
|
||||||
uuid_pool=dict(type='str', default='default'),
|
|
||||||
kvm_mgmt_policy=dict(type='str', default=''),
|
|
||||||
local_disk_policy=dict(type='str', default=''),
|
|
||||||
maintenance_policy=dict(type='str', default=''),
|
|
||||||
ipmi_access_profile=dict(type='str', default=''),
|
|
||||||
power_control_policy=dict(type='str', default='default'),
|
|
||||||
power_sync_policy=dict(type='str', default=''),
|
|
||||||
scrub_policy=dict(type='str', default=''),
|
|
||||||
sol_policy=dict(type='str', default=''),
|
|
||||||
threshold_policy=dict(type='str', default='default'),
|
|
||||||
template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']),
|
|
||||||
user_label=dict(type='str', default=''),
|
|
||||||
vmedia_policy=dict(type='str', default=''),
|
|
||||||
storage_profile=dict(type='str', default=''),
|
|
||||||
lan_connectivity_policy=dict(type='str', default=''),
|
|
||||||
iqn_pool=dict(type='str', default=''),
|
|
||||||
san_connectivity_policy=dict(type='str', default=''),
|
|
||||||
server_pool=dict(type='str', default=''),
|
|
||||||
server_pool_qualification=dict(type='str', default=''),
|
|
||||||
power_state=dict(type='str', default='up', choices=['up', 'down']),
|
|
||||||
mgmt_interface_mode=dict(type='str', default='', choices=['', 'in-band']),
|
|
||||||
mgmt_vnet_name=dict(type='str', default=''),
|
|
||||||
mgmt_inband_pool_name=dict(type='str', default=''),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure.
|
|
||||||
# Additional imports are done below or in called functions.
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/ls-<name>
|
|
||||||
dn = module.params['org_dn'] + '/ls-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else: # state == 'present'
|
|
||||||
props_match = check_serivce_profile_templates_props(ucs, module, mo, dn)
|
|
||||||
|
|
||||||
if module.params['state'] == 'present' and not props_match:
|
|
||||||
configure_service_profile_template(ucs, module)
|
|
||||||
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,253 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_storage_profile
|
|
||||||
short_description: Configures storage profiles on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures storage profiles on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify that the storage profile is present and will create if needed.
|
|
||||||
- If C(absent), will verify that the storage profile is absent and will delete if needed.
|
|
||||||
choices: [ absent, present ]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the storage profile.
|
|
||||||
- This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after profile is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- The user-defined description of the storage profile.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
local_luns:
|
|
||||||
description:
|
|
||||||
- List of Local LUNs used by the storage profile.
|
|
||||||
suboptions:
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the local LUN.
|
|
||||||
required: yes
|
|
||||||
size:
|
|
||||||
description:
|
|
||||||
- Size of this LUN in GB.
|
|
||||||
- The size can range from 1 to 10240 GB.
|
|
||||||
default: '1'
|
|
||||||
auto_deploy:
|
|
||||||
description:
|
|
||||||
- Whether the local LUN should be automatically deployed or not.
|
|
||||||
choices: [ auto-deploy, no-auto-deploy ]
|
|
||||||
default: auto-deploy
|
|
||||||
expand_to_avail:
|
|
||||||
description:
|
|
||||||
- Specifies that this LUN can be expanded to use the entire available disk group.
|
|
||||||
- For each service profile, only one LUN can use this option.
|
|
||||||
- Expand To Available option is not supported for already deployed LUN.
|
|
||||||
type: bool
|
|
||||||
default: 'no'
|
|
||||||
fractional_size:
|
|
||||||
description:
|
|
||||||
- Fractional size of this LUN in MB.
|
|
||||||
default: '0'
|
|
||||||
disk_policy_name:
|
|
||||||
description:
|
|
||||||
- The disk group configuration policy to be applied to this local LUN.
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify local LUN is present on profile.
|
|
||||||
If C(absent), will verify local LUN is absent on profile.
|
|
||||||
choices: [ absent, present ]
|
|
||||||
default: present
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- The distinguished name (dn) of the organization where the resource is assigned.
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- Sindhu Sudhir (@sisudhir)
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.7'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure Storage Profile
|
|
||||||
ucs_storage_profile:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-StgProf
|
|
||||||
local_luns:
|
|
||||||
- name: Boot-LUN
|
|
||||||
size: '60'
|
|
||||||
disk_policy_name: DEE-DG
|
|
||||||
- name: Data-LUN
|
|
||||||
size: '200'
|
|
||||||
disk_policy_name: DEE-DG
|
|
||||||
|
|
||||||
- name: Remove Storage Profile
|
|
||||||
ucs_storage_profile:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-StgProf
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove Local LUN from Storage Profile
|
|
||||||
ucs_storage_profile:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: DEE-StgProf
|
|
||||||
local_luns:
|
|
||||||
- name: Data-LUN
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
local_lun = dict(
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
size=dict(type='str', default='1'),
|
|
||||||
auto_deploy=dict(type='str', default='auto-deploy', choices=['auto-deploy', 'no-auto-deploy']),
|
|
||||||
expand_to_avail=dict(type='str', default='no', choices=['no', 'yes']),
|
|
||||||
fractional_size=dict(type='str', default='0'),
|
|
||||||
disk_policy_name=dict(type='str', default=''),
|
|
||||||
)
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
local_luns=dict(type='list', elements='dict', options=local_lun),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure. Additional imports are done below.
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageProfile import LstorageProfile
|
|
||||||
from ucsmsdk.mometa.lstorage.LstorageDasScsiLun import LstorageDasScsiLun
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/profile-<name>
|
|
||||||
dn = module.params['org_dn'] + '/profile-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if not module.params.get('local_luns'):
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# check local lun props
|
|
||||||
for lun in module.params['local_luns']:
|
|
||||||
child_dn = dn + '/das-scsi-lun-' + lun['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if lun['state'] == 'absent':
|
|
||||||
if mo_1:
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(size=str(lun['size']))
|
|
||||||
kwargs['auto_deploy'] = lun['auto_deploy']
|
|
||||||
kwargs['expand_to_avail'] = lun['expand_to_avail']
|
|
||||||
kwargs['fractional_size'] = str(lun['fractional_size'])
|
|
||||||
kwargs['local_disk_policy_name'] = lun['disk_policy_name']
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = LstorageProfile(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params.get('local_luns'):
|
|
||||||
for lun in module.params['local_luns']:
|
|
||||||
if lun['state'] == 'absent':
|
|
||||||
child_dn = dn + '/das-scsi-lun-' + lun['name']
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
ucs.login_handle.remove_mo(mo_1)
|
|
||||||
else:
|
|
||||||
mo_1 = LstorageDasScsiLun(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=lun['name'],
|
|
||||||
size=str(lun['size']),
|
|
||||||
auto_deploy=lun['auto_deploy'],
|
|
||||||
expand_to_avail=lun['expand_to_avail'],
|
|
||||||
fractional_size=str(lun['fractional_size']),
|
|
||||||
local_disk_policy_name=lun['disk_policy_name'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,164 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_timezone
|
|
||||||
short_description: Configures timezone on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures timezone on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(absent), will unset timezone.
|
|
||||||
- If C(present), will set or update timezone.
|
|
||||||
choices: [absent, present]
|
|
||||||
default: present
|
|
||||||
|
|
||||||
admin_state:
|
|
||||||
description:
|
|
||||||
- The admin_state setting
|
|
||||||
- The enabled admin_state indicates the timezone configuration is utilized by UCS Manager.
|
|
||||||
- The disabled admin_state indicates the timezone configuration is ignored by UCS Manager.
|
|
||||||
choices: [disabled, enabled]
|
|
||||||
default: enabled
|
|
||||||
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the timezone.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
timezone:
|
|
||||||
description:
|
|
||||||
- The timezone name.
|
|
||||||
- Time zone names are from the L(tz database,https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
|
|
||||||
- The timezone name is case sensitive.
|
|
||||||
- The timezone name can be between 0 and 510 alphanumeric characters.
|
|
||||||
- You cannot use spaces or any special characters other than
|
|
||||||
- "\"-\" (hyphen), \"_\" (underscore), \"/\" (backslash)."
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- John McDonough (@movinalot)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.7'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure Time Zone
|
|
||||||
ucs_timezone:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
state: present
|
|
||||||
admin_state: enabled
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
description: 'Time Zone for Los Angeles'
|
|
||||||
|
|
||||||
- name: Unconfigure Time Zone
|
|
||||||
ucs_timezone:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
state: absent
|
|
||||||
admin_state: disabled
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def run_module():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
timezone=dict(type='str'),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
admin_state=dict(type='str', default='enabled', choices=['disabled', 'enabled']),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['state', 'present', ['timezone']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
|
|
||||||
dn = 'sys/svc-ext/datetime-svc'
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
mo.timezone = ""
|
|
||||||
mo.descr = ""
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
kwargs['timezone'] = module.params['timezone']
|
|
||||||
kwargs['admin_state'] = module.params['admin_state']
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# update mo, timezone mo always exists
|
|
||||||
mo.timezone = module.params['timezone']
|
|
||||||
mo.descr = module.params['description']
|
|
||||||
mo.admin_state = module.params['admin_state']
|
|
||||||
ucs.login_handle.add_mo(mo, modify_present=True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
run_module()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,196 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_uuid_pool
|
|
||||||
short_description: Configures server UUID pools on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures server UUID pools and UUID blocks on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify UUID pool is present and will create if needed.
|
|
||||||
- If C(absent), will verify UUID pool is absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the UUID pool.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the UUID pool is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- "The user-defined description of the UUID pool."
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
prefix:
|
|
||||||
description:
|
|
||||||
- UUID prefix used for the range of server UUIDs.
|
|
||||||
- "If no value is provided, the system derived prefix will be used (equivalent to selecting 'derived' option in UI)."
|
|
||||||
- "If the user provides a value, the user provided prefix will be used (equivalent to selecting 'other' option in UI)."
|
|
||||||
- A user provided value should be in the format XXXXXXXX-XXXX-XXXX.
|
|
||||||
order:
|
|
||||||
description:
|
|
||||||
- The Assignment Order field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "default - Cisco UCS Manager selects a random identity from the pool."
|
|
||||||
- "sequential - Cisco UCS Manager selects the lowest available identity from the pool."
|
|
||||||
choices: [default, sequential]
|
|
||||||
default: default
|
|
||||||
first_uuid:
|
|
||||||
description:
|
|
||||||
- The first UUID in the block of UUIDs.
|
|
||||||
- This is the From field in the UCS Manager UUID Blocks menu.
|
|
||||||
last_uuid:
|
|
||||||
description:
|
|
||||||
- The last UUID in the block of UUIDs.
|
|
||||||
- This is the To field in the UCS Manager Add UUID Blocks menu.
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- The distinguished name (dn) of the organization where the resource is assigned.
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.7'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure UUID address pool
|
|
||||||
ucs_uuid_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: UUID-Pool
|
|
||||||
order: sequential
|
|
||||||
first_uuid: 0000-000000000001
|
|
||||||
last_uuid: 0000-000000000078
|
|
||||||
|
|
||||||
- name: Remove UUID address pool
|
|
||||||
ucs_uuid_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: UUID-Pool
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
order=dict(type='str', default='default', choices=['default', 'sequential']),
|
|
||||||
prefix=dict(type='str', default=''),
|
|
||||||
first_uuid=dict(type='str'),
|
|
||||||
last_uuid=dict(type='str'),
|
|
||||||
state=dict(default='present', choices=['present', 'absent'], type='str'),
|
|
||||||
)
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
)
|
|
||||||
# UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation.
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.uuidpool.UuidpoolPool import UuidpoolPool
|
|
||||||
from ucsmsdk.mometa.uuidpool.UuidpoolBlock import UuidpoolBlock
|
|
||||||
|
|
||||||
ucs.result['changed'] = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/uuid-pool-<name>
|
|
||||||
dn = module.params['org_dn'] + '/uuid-pool-' + module.params['name']
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(assignment_order=module.params['order'])
|
|
||||||
kwargs['descr'] = module.params['description']
|
|
||||||
if module.params['prefix']:
|
|
||||||
kwargs['prefix'] = module.params['prefix']
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if module.params['last_uuid'] and module.params['first_uuid']:
|
|
||||||
# uuid address block specified, check properties
|
|
||||||
block_dn = dn + '/block-from-' + module.params['first_uuid'].upper() + '-to-' + module.params['last_uuid'].upper()
|
|
||||||
mo_1 = ucs.login_handle.query_dn(block_dn)
|
|
||||||
if mo_1:
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# no UUID address block specified, but top-level props matched
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
if not module.params['prefix']:
|
|
||||||
module.params['prefix'] = 'derived'
|
|
||||||
mo = UuidpoolPool(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
assignment_order=module.params['order'],
|
|
||||||
prefix=module.params['prefix']
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params['last_uuid'] and module.params['first_uuid']:
|
|
||||||
mo_1 = UuidpoolBlock(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
to=module.params['last_uuid'],
|
|
||||||
r_from=module.params['first_uuid'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
ucs.result['changed'] = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,273 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_vhba_template
|
|
||||||
short_description: Configures vHBA templates on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures vHBA templates on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify vHBA templates are present and will create if needed.
|
|
||||||
- If C(absent), will verify vHBA templates are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the virtual HBA template.
|
|
||||||
- This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the template is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the template.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
fabric:
|
|
||||||
description:
|
|
||||||
- The Fabric ID field.
|
|
||||||
- The name of the fabric interconnect that vHBAs created with this template are associated with.
|
|
||||||
choices: [A, B]
|
|
||||||
default: A
|
|
||||||
redundancy_type:
|
|
||||||
description:
|
|
||||||
- The Redundancy Type used for template pairing from the Primary or Secondary redundancy template.
|
|
||||||
- "primary — Creates configurations that can be shared with the Secondary template."
|
|
||||||
- Any other shared changes on the Primary template are automatically synchronized to the Secondary template.
|
|
||||||
- "secondary — All shared configurations are inherited from the Primary template."
|
|
||||||
- "none - Legacy vHBA template behavior. Select this option if you do not want to use redundancy."
|
|
||||||
choices: [none, primary, secondary]
|
|
||||||
default: none
|
|
||||||
vsan:
|
|
||||||
description:
|
|
||||||
- The VSAN to associate with vHBAs created from this template.
|
|
||||||
default: default
|
|
||||||
template_type:
|
|
||||||
description:
|
|
||||||
- The Template Type field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "initial-template — vHBAs created from this template are not updated if the template changes."
|
|
||||||
- "updating-template - vHBAs created from this template are updated if the template changes."
|
|
||||||
choices: [initial-template, updating-template]
|
|
||||||
default: initial-template
|
|
||||||
max_data:
|
|
||||||
description:
|
|
||||||
- The Max Data Field Size field.
|
|
||||||
- The maximum size of the Fibre Channel frame payload bytes that the vHBA supports.
|
|
||||||
- Enter an string between '256' and '2112'.
|
|
||||||
default: '2048'
|
|
||||||
wwpn_pool:
|
|
||||||
description:
|
|
||||||
- The WWPN pool that a vHBA created from this template uses to derive its WWPN address.
|
|
||||||
default: default
|
|
||||||
qos_policy:
|
|
||||||
description:
|
|
||||||
- The QoS policy that is associated with vHBAs created from this template.
|
|
||||||
pin_group:
|
|
||||||
description:
|
|
||||||
- The SAN pin group that is associated with vHBAs created from this template.
|
|
||||||
stats_policy:
|
|
||||||
description:
|
|
||||||
- The statistics collection policy that is associated with vHBAs created from this template.
|
|
||||||
default: default
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure vHBA template
|
|
||||||
ucs_vhba_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vHBA-A
|
|
||||||
fabric: A
|
|
||||||
vsan: VSAN-A
|
|
||||||
wwpn_pool: WWPN-Pool-A
|
|
||||||
|
|
||||||
- name: Remote vHBA template
|
|
||||||
ucs_vhba_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vHBA-A
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str'),
|
|
||||||
descr=dict(type='str'),
|
|
||||||
fabric=dict(type='str', default='A', choices=['A', 'B']),
|
|
||||||
redundancy_type=dict(type='str', default='none', choices=['none', 'primary', 'secondary']),
|
|
||||||
vsan=dict(type='str', default='default'),
|
|
||||||
template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']),
|
|
||||||
max_data=dict(type='str', default='2048'),
|
|
||||||
wwpn_pool=dict(type='str', default='default'),
|
|
||||||
qos_policy=dict(type='str'),
|
|
||||||
pin_group=dict(type='str'),
|
|
||||||
stats_policy=dict(type='str', default='default'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
vhba_template_list=dict(type='list'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Note that use of vhba_template_list is an experimental feature which allows multiple resource updates with a single UCSM connection.
|
|
||||||
# Support for vhba_template_list may change or be removed once persistent UCS connections are supported.
|
|
||||||
# Either vhba_template_list or name is required (user can specify either a list of single resource).
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_one_of=[
|
|
||||||
['vhba_template_list', 'name']
|
|
||||||
],
|
|
||||||
mutually_exclusive=[
|
|
||||||
['vhba_template_list', 'name']
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.vnic.VnicSanConnTempl import VnicSanConnTempl
|
|
||||||
from ucsmsdk.mometa.vnic.VnicFcIf import VnicFcIf
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
# Only documented use is a single resource, but to also support experimental
|
|
||||||
# feature allowing multiple updates all params are converted to a vhba_template_list below.
|
|
||||||
|
|
||||||
if module.params['vhba_template_list']:
|
|
||||||
# directly use the list (single resource and list are mutually exclusive
|
|
||||||
vhba_template_list = module.params['vhba_template_list']
|
|
||||||
else:
|
|
||||||
# single resource specified, create list from the current params
|
|
||||||
vhba_template_list = [module.params]
|
|
||||||
for vhba_template in vhba_template_list:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# set default params. Done here to set values for lists which can't be done in the argument_spec
|
|
||||||
if not vhba_template.get('descr'):
|
|
||||||
vhba_template['descr'] = ''
|
|
||||||
if not vhba_template.get('fabric'):
|
|
||||||
vhba_template['fabric'] = 'A'
|
|
||||||
if not vhba_template.get('redundancy_type'):
|
|
||||||
vhba_template['redundancy_type'] = 'none'
|
|
||||||
if not vhba_template.get('vsan'):
|
|
||||||
vhba_template['vsan'] = 'default'
|
|
||||||
if not vhba_template.get('template_type'):
|
|
||||||
vhba_template['template_type'] = 'initial-template'
|
|
||||||
if not vhba_template.get('max_data'):
|
|
||||||
vhba_template['max_data'] = '2048'
|
|
||||||
if not vhba_template.get('wwpn_pool'):
|
|
||||||
vhba_template['wwpn_pool'] = 'default'
|
|
||||||
if not vhba_template.get('qos_policy'):
|
|
||||||
vhba_template['qos_policy'] = ''
|
|
||||||
if not vhba_template.get('pin_group'):
|
|
||||||
vhba_template['pin_group'] = ''
|
|
||||||
if not vhba_template.get('stats_policy'):
|
|
||||||
vhba_template['stats_policy'] = 'default'
|
|
||||||
# dn is <org_dn>/san-conn-templ-<name>
|
|
||||||
dn = module.params['org_dn'] + '/san-conn-templ-' + vhba_template['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=vhba_template['descr'])
|
|
||||||
kwargs['switch_id'] = vhba_template['fabric']
|
|
||||||
kwargs['redundancy_pair_type'] = vhba_template['redundancy_type']
|
|
||||||
kwargs['templ_type'] = vhba_template['template_type']
|
|
||||||
kwargs['max_data_field_size'] = vhba_template['max_data']
|
|
||||||
kwargs['ident_pool_name'] = vhba_template['wwpn_pool']
|
|
||||||
kwargs['qos_policy_name'] = vhba_template['qos_policy']
|
|
||||||
kwargs['pin_to_group_name'] = vhba_template['pin_group']
|
|
||||||
kwargs['stats_policy_name'] = vhba_template['stats_policy']
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
child_dn = dn + '/if-default'
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(name=vhba_template['vsan'])
|
|
||||||
if (mo_1.check_prop_match(**kwargs)):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = VnicSanConnTempl(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=vhba_template['name'],
|
|
||||||
descr=vhba_template['descr'],
|
|
||||||
switch_id=vhba_template['fabric'],
|
|
||||||
redundancy_pair_type=vhba_template['redundancy_type'],
|
|
||||||
templ_type=vhba_template['template_type'],
|
|
||||||
max_data_field_size=vhba_template['max_data'],
|
|
||||||
ident_pool_name=vhba_template['wwpn_pool'],
|
|
||||||
qos_policy_name=vhba_template['qos_policy'],
|
|
||||||
pin_to_group_name=vhba_template['pin_group'],
|
|
||||||
stats_policy_name=vhba_template['stats_policy'],
|
|
||||||
)
|
|
||||||
|
|
||||||
mo_1 = VnicFcIf(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=vhba_template['vsan'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,121 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'community'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_vlan_find
|
|
||||||
short_description: Find VLANs on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Find VLANs on Cisco UCS Manager based on different criteria.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
pattern:
|
|
||||||
description:
|
|
||||||
- Regex pattern to find within the name property of the fabricVlan class.
|
|
||||||
- This is required if C(vlanid) parameter is not supplied.
|
|
||||||
type: str
|
|
||||||
fabric:
|
|
||||||
description:
|
|
||||||
- "The fabric configuration of the VLAN. This can be one of the following:"
|
|
||||||
- "common - The VLAN applies to both fabrics and uses the same configuration parameters in both cases."
|
|
||||||
- "A — The VLAN only applies to fabric A."
|
|
||||||
- "B — The VLAN only applies to fabric B."
|
|
||||||
choices: [common, A, B]
|
|
||||||
default: common
|
|
||||||
type: str
|
|
||||||
vlanid:
|
|
||||||
description:
|
|
||||||
- The unique string identifier assigned to the VLAN.
|
|
||||||
- A VLAN ID can be between '1' and '3967', or between '4048' and '4093'.
|
|
||||||
- This is required if C(pattern) parameter is not supplied.
|
|
||||||
type: str
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Martinez (@dx0xm)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.9'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Get all vlans in fabric A
|
|
||||||
ucs_vlan_find:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
fabric: 'A'
|
|
||||||
pattern: '.'
|
|
||||||
- name: Confirm if vlan 15 is present
|
|
||||||
ucs_vlan_find:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
vlanid: '15'
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
vlan_list:
|
|
||||||
description: basic details of vlans found
|
|
||||||
returned: on success
|
|
||||||
type: list
|
|
||||||
sample: [
|
|
||||||
{
|
|
||||||
"id": "0",
|
|
||||||
"name": "vlcloud1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
fabric=dict(type='str', default='common', choices=['common', 'A', 'B']),
|
|
||||||
pattern=dict(type='str'),
|
|
||||||
vlanid=dict(type='str')
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec=argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_one_of=[['pattern', 'vlanid']]
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
filtls = ['(cloud,"ethlan")']
|
|
||||||
if module.params['fabric'] != 'common':
|
|
||||||
filtls.append('(switch_id,"' + module.params['fabric'] + '")')
|
|
||||||
if module.params['vlanid']:
|
|
||||||
filtls.append('(id,"' + module.params['vlanid'] + '")')
|
|
||||||
else:
|
|
||||||
filtls.append('(name,"' + module.params['pattern'] + '")')
|
|
||||||
|
|
||||||
object_dict = ucs.login_handle.query_classid("fabricVlan", filter_str=' and '.join(filtls))
|
|
||||||
|
|
||||||
if object_dict is None:
|
|
||||||
module.fail_json(msg="Failed to query vlan objects")
|
|
||||||
|
|
||||||
vlnlist = []
|
|
||||||
for ob in object_dict:
|
|
||||||
vlnlist.append(dict(name=ob.name, id=ob.id))
|
|
||||||
|
|
||||||
module.exit_json(changed=False,
|
|
||||||
vlan_list=vlnlist)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,192 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_vlans
|
|
||||||
short_description: Configures VLANs on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures VLANs on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify VLANs are present and will create if needed.
|
|
||||||
- If C(absent), will verify VLANs are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name assigned to the VLAN.
|
|
||||||
- The VLAN name is case sensitive.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the VLAN is created.
|
|
||||||
required: yes
|
|
||||||
multicast_policy:
|
|
||||||
description:
|
|
||||||
- The multicast policy associated with this VLAN.
|
|
||||||
- This option is only valid if the Sharing Type field is set to None or Primary.
|
|
||||||
default: ''
|
|
||||||
fabric:
|
|
||||||
description:
|
|
||||||
- "The fabric configuration of the VLAN. This can be one of the following:"
|
|
||||||
- "common - The VLAN applies to both fabrics and uses the same configuration parameters in both cases."
|
|
||||||
- "A — The VLAN only applies to fabric A."
|
|
||||||
- "B — The VLAN only applies to fabric B."
|
|
||||||
- For upstream disjoint L2 networks, Cisco recommends that you choose common to create VLANs that apply to both fabrics.
|
|
||||||
choices: [common, A, B]
|
|
||||||
default: common
|
|
||||||
id:
|
|
||||||
description:
|
|
||||||
- The unique string identifier assigned to the VLAN.
|
|
||||||
- A VLAN ID can be between '1' and '3967', or between '4048' and '4093'.
|
|
||||||
- You cannot create VLANs with IDs from 4030 to 4047. This range of VLAN IDs is reserved.
|
|
||||||
- The VLAN IDs you specify must also be supported on the switch that you are using.
|
|
||||||
- VLANs in the LAN cloud and FCoE VLANs in the SAN cloud must have different IDs.
|
|
||||||
- Optional if state is absent.
|
|
||||||
required: yes
|
|
||||||
sharing:
|
|
||||||
description:
|
|
||||||
- The Sharing Type field.
|
|
||||||
- "Whether this VLAN is subdivided into private or secondary VLANs. This can be one of the following:"
|
|
||||||
- "none - This VLAN does not have any secondary or private VLANs. This is a regular VLAN."
|
|
||||||
- "primary - This VLAN can have one or more secondary VLANs, as shown in the Secondary VLANs area. This VLAN is a primary VLAN in the private VLAN domain."
|
|
||||||
- "isolated - This is a private VLAN associated with a primary VLAN. This VLAN is an Isolated VLAN."
|
|
||||||
- "community - This VLAN can communicate with other ports on the same community VLAN as well as the promiscuous port. This VLAN is a Community VLAN."
|
|
||||||
choices: [none, primary, isolated, community]
|
|
||||||
default: none
|
|
||||||
native:
|
|
||||||
description:
|
|
||||||
- Designates the VLAN as a native VLAN.
|
|
||||||
choices: ['yes', 'no']
|
|
||||||
default: 'no'
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure VLAN
|
|
||||||
ucs_vlans:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vlan2
|
|
||||||
id: '2'
|
|
||||||
native: 'yes'
|
|
||||||
|
|
||||||
- name: Remove VLAN
|
|
||||||
ucs_vlans:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vlan2
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
multicast_policy=dict(type='str', default=''),
|
|
||||||
fabric=dict(type='str', default='common', choices=['common', 'A', 'B']),
|
|
||||||
id=dict(type='str'),
|
|
||||||
sharing=dict(type='str', default='none', choices=['none', 'primary', 'isolated', 'community']),
|
|
||||||
native=dict(type='str', default='no', choices=['yes', 'no']),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['state', 'present', ['id']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure, so additional imports are done below.
|
|
||||||
from ucsmsdk.mometa.fabric.FabricVlan import FabricVlan
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is fabric/lan/net-<name> for common vlans or fabric/lan/[A or B]/net-<name> for A or B
|
|
||||||
dn_base = 'fabric/lan'
|
|
||||||
if module.params['fabric'] != 'common':
|
|
||||||
dn_base += '/' + module.params['fabric']
|
|
||||||
dn = dn_base + '/net-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(id=module.params['id'])
|
|
||||||
kwargs['default_net'] = module.params['native']
|
|
||||||
kwargs['sharing'] = module.params['sharing']
|
|
||||||
kwargs['mcast_policy_name'] = module.params['multicast_policy']
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = FabricVlan(
|
|
||||||
parent_mo_or_dn=dn_base,
|
|
||||||
name=module.params['name'],
|
|
||||||
id=module.params['id'],
|
|
||||||
default_net=module.params['native'],
|
|
||||||
sharing=module.params['sharing'],
|
|
||||||
mcast_policy_name=module.params['multicast_policy'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,376 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_vnic_template
|
|
||||||
short_description: Configures vNIC templates on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures vNIC templates on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify vNIC templates are present and will create if needed.
|
|
||||||
- If C(absent), will verify vNIC templates are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the vNIC template.
|
|
||||||
- This name can be between 1 and 16 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the template is created.
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A user-defined description of the vNIC template.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
fabric:
|
|
||||||
description:
|
|
||||||
- The Fabric ID field specifying the fabric interconnect associated with vNICs created from this template.
|
|
||||||
- If you want fabric failover enabled on vNICs created from this template, use of of the following:"
|
|
||||||
- "A-B to use Fabric A by default with failover enabled."
|
|
||||||
- "B-A to use Fabric B by default with failover enabled."
|
|
||||||
- "Do not enable vNIC fabric failover under the following circumstances:"
|
|
||||||
- "- If the Cisco UCS domain is running in Ethernet switch mode. vNIC fabric failover is not supported in that mode."
|
|
||||||
- "- If you plan to associate one or more vNICs created from this template to a server with an adapter that does not support fabric failover."
|
|
||||||
choices: [A, B, A-B, B-A]
|
|
||||||
default: A
|
|
||||||
redundancy_type:
|
|
||||||
description:
|
|
||||||
- The Redundancy Type used for vNIC redundancy pairs during fabric failover.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "primary — Creates configurations that can be shared with the Secondary template."
|
|
||||||
- "secondary — All shared configurations are inherited from the Primary template."
|
|
||||||
- "none - Legacy vNIC template behavior. Select this option if you do not want to use redundancy."
|
|
||||||
choices: [none, primary, secondary]
|
|
||||||
default: none
|
|
||||||
peer_redundancy_template:
|
|
||||||
description:
|
|
||||||
- The Peer Redundancy Template.
|
|
||||||
- The name of the vNIC template sharing a configuration with this template.
|
|
||||||
- If the redundancy_type is primary, the name of the secondary template should be provided.
|
|
||||||
- If the redundancy_type is secondary, the name of the primary template should be provided.
|
|
||||||
- Secondary templates can only configure non-shared properties (name, description, and mac_pool).
|
|
||||||
aliases: [ peer_redundancy_templ ]
|
|
||||||
target:
|
|
||||||
description:
|
|
||||||
- The possible target for vNICs created from this template.
|
|
||||||
- The target determines whether or not Cisco UCS Manager automatically creates a VM-FEX port profile with the appropriate settings for the vNIC template.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "adapter — The vNICs apply to all adapters. No VM-FEX port profile is created if you choose this option."
|
|
||||||
- "vm - The vNICs apply to all virtual machines. A VM-FEX port profile is created if you choose this option."
|
|
||||||
default: adapter
|
|
||||||
template_type:
|
|
||||||
description:
|
|
||||||
- The Template Type field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "initial-template — vNICs created from this template are not updated if the template changes."
|
|
||||||
- "updating-template - vNICs created from this template are updated if the template changes."
|
|
||||||
choices: [initial-template, updating-template]
|
|
||||||
default: initial-template
|
|
||||||
vlans_list:
|
|
||||||
description:
|
|
||||||
- List of VLANs used by the vNIC template.
|
|
||||||
- "Each list element has the following suboptions:"
|
|
||||||
- "= name"
|
|
||||||
- " The name of the VLAN (required)."
|
|
||||||
- "- native"
|
|
||||||
- " Designates the VLAN as a native VLAN. Only one VLAN in the list can be a native VLAN."
|
|
||||||
- " [choices: 'no', 'yes']"
|
|
||||||
- " [Default: 'no']"
|
|
||||||
- "- state"
|
|
||||||
- " If present, will verify VLAN is present on template."
|
|
||||||
- " If absent, will verify VLAN is absent on template."
|
|
||||||
- " choices: [present, absent]"
|
|
||||||
- " default: present"
|
|
||||||
cdn_source:
|
|
||||||
description:
|
|
||||||
- CDN Source field.
|
|
||||||
- "This can be one of the following options:"
|
|
||||||
- "vnic-name - Uses the vNIC template name of the vNIC instance as the CDN name. This is the default option."
|
|
||||||
- "user-defined - Uses a user-defined CDN name for the vNIC template. If this option is chosen, cdn_name must also be provided."
|
|
||||||
choices: [vnic-name, user-defined]
|
|
||||||
default: vnic-name
|
|
||||||
cdn_name:
|
|
||||||
description:
|
|
||||||
- CDN Name used when cdn_source is set to user-defined.
|
|
||||||
mtu:
|
|
||||||
description:
|
|
||||||
- The MTU field.
|
|
||||||
- The maximum transmission unit, or packet size, that vNICs created from this vNIC template should use.
|
|
||||||
- Enter a string between '1500' and '9000'.
|
|
||||||
- If the vNIC template has an associated QoS policy, the MTU specified here must be equal to or less than the MTU specified in the QoS system class.
|
|
||||||
default: '1500'
|
|
||||||
mac_pool:
|
|
||||||
description:
|
|
||||||
- The MAC address pool that vNICs created from this vNIC template should use.
|
|
||||||
qos_policy:
|
|
||||||
description:
|
|
||||||
- The quality of service (QoS) policy that vNICs created from this vNIC template should use.
|
|
||||||
network_control_policy:
|
|
||||||
description:
|
|
||||||
- The network control policy that vNICs created from this vNIC template should use.
|
|
||||||
pin_group:
|
|
||||||
description:
|
|
||||||
- The LAN pin group that vNICs created from this vNIC template should use.
|
|
||||||
stats_policy:
|
|
||||||
description:
|
|
||||||
- The statistics collection policy that vNICs created from this vNIC template should use.
|
|
||||||
default: default
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure vNIC template
|
|
||||||
ucs_vnic_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vNIC-A
|
|
||||||
fabric: A
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
|
|
||||||
- name: Configure vNIC template with failover
|
|
||||||
ucs_vnic_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vNIC-A-B
|
|
||||||
fabric: A-B
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Remove vNIC template
|
|
||||||
ucs_vnic_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vNIC-A
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove another vNIC template
|
|
||||||
ucs_vnic_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vNIC-A-B
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove VLAN from template
|
|
||||||
ucs_vnic_template:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vNIC-A-B
|
|
||||||
fabric: A-B
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str', required=True),
|
|
||||||
description=dict(type='str', aliases=['descr'], default=''),
|
|
||||||
fabric=dict(type='str', default='A', choices=['A', 'B', 'A-B', 'B-A']),
|
|
||||||
redundancy_type=dict(type='str', default='none', choices=['none', 'primary', 'secondary']),
|
|
||||||
peer_redundancy_template=dict(type='str', aliases=['peer_redundancy_templ'], default=''),
|
|
||||||
target=dict(type='str', default='adapter', choices=['adapter', 'vm']),
|
|
||||||
template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']),
|
|
||||||
vlans_list=dict(type='list'),
|
|
||||||
cdn_source=dict(type='str', default='vnic-name', choices=['vnic-name', 'user-defined']),
|
|
||||||
cdn_name=dict(type='str', default=''),
|
|
||||||
mtu=dict(type='str', default='1500'),
|
|
||||||
mac_pool=dict(type='str', default=''),
|
|
||||||
qos_policy=dict(type='str', default=''),
|
|
||||||
network_control_policy=dict(type='str', default=''),
|
|
||||||
pin_group=dict(type='str', default=''),
|
|
||||||
stats_policy=dict(type='str', default='default'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
)
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_if=[
|
|
||||||
['cdn_source', 'user-defined', ['cdn_name']],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
# UCSModule creation above verifies ucsmsdk is present and exits on failure. Additional imports are done below.
|
|
||||||
from ucsmsdk.mometa.vnic.VnicLanConnTempl import VnicLanConnTempl
|
|
||||||
from ucsmsdk.mometa.vnic.VnicEtherIf import VnicEtherIf
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# dn is <org_dn>/lan-conn-templ-<name>
|
|
||||||
dn = module.params['org_dn'] + '/lan-conn-templ-' + module.params['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
# set default params for lists which can't be done in the argument_spec
|
|
||||||
if module.params.get('vlans_list'):
|
|
||||||
for vlan in module.params['vlans_list']:
|
|
||||||
if not vlan.get('native'):
|
|
||||||
vlan['native'] = 'no'
|
|
||||||
if not vlan.get('state'):
|
|
||||||
vlan['state'] = 'present'
|
|
||||||
# for target 'adapter', change to internal UCS Manager spelling 'adaptor'
|
|
||||||
if module.params['target'] == 'adapter':
|
|
||||||
module.params['target'] = 'adaptor'
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(descr=module.params['description'])
|
|
||||||
kwargs['switch_id'] = module.params['fabric']
|
|
||||||
kwargs['redundancy_pair_type'] = module.params['redundancy_type']
|
|
||||||
kwargs['peer_redundancy_templ_name'] = module.params['peer_redundancy_template']
|
|
||||||
kwargs['ident_pool_name'] = module.params['mac_pool']
|
|
||||||
# do not check shared props if this is a secondary template
|
|
||||||
if module.params['redundancy_type'] != 'secondary':
|
|
||||||
kwargs['target'] = module.params['target']
|
|
||||||
kwargs['templ_type'] = module.params['template_type']
|
|
||||||
kwargs['cdn_source'] = module.params['cdn_source']
|
|
||||||
kwargs['admin_cdn_name'] = module.params['cdn_name']
|
|
||||||
kwargs['mtu'] = module.params['mtu']
|
|
||||||
kwargs['qos_policy_name'] = module.params['qos_policy']
|
|
||||||
kwargs['nw_ctrl_policy_name'] = module.params['network_control_policy']
|
|
||||||
kwargs['pin_to_group_name'] = module.params['pin_group']
|
|
||||||
kwargs['stats_policy_name'] = module.params['stats_policy']
|
|
||||||
if mo.check_prop_match(**kwargs):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if not module.params.get('vlans_list'):
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
# check vlan props
|
|
||||||
for vlan in module.params['vlans_list']:
|
|
||||||
child_dn = dn + '/if-' + str(vlan['name'])
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
if vlan['state'] == 'absent':
|
|
||||||
if mo_1:
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
if mo_1:
|
|
||||||
kwargs = dict(default_net=vlan['native'])
|
|
||||||
if mo_1.check_prop_match(**kwargs):
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
props_match = False
|
|
||||||
break
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
# secondary template only sets non shared props
|
|
||||||
if module.params['redundancy_type'] == 'secondary':
|
|
||||||
mo = VnicLanConnTempl(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
switch_id=module.params['fabric'],
|
|
||||||
redundancy_pair_type=module.params['redundancy_type'],
|
|
||||||
peer_redundancy_templ_name=module.params['peer_redundancy_template'],
|
|
||||||
ident_pool_name=module.params['mac_pool'],
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
mo = VnicLanConnTempl(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=module.params['name'],
|
|
||||||
descr=module.params['description'],
|
|
||||||
switch_id=module.params['fabric'],
|
|
||||||
redundancy_pair_type=module.params['redundancy_type'],
|
|
||||||
peer_redundancy_templ_name=module.params['peer_redundancy_template'],
|
|
||||||
target=module.params['target'],
|
|
||||||
templ_type=module.params['template_type'],
|
|
||||||
cdn_source=module.params['cdn_source'],
|
|
||||||
admin_cdn_name=module.params['cdn_name'],
|
|
||||||
mtu=module.params['mtu'],
|
|
||||||
ident_pool_name=module.params['mac_pool'],
|
|
||||||
qos_policy_name=module.params['qos_policy'],
|
|
||||||
nw_ctrl_policy_name=module.params['network_control_policy'],
|
|
||||||
pin_to_group_name=module.params['pin_group'],
|
|
||||||
stats_policy_name=module.params['stats_policy'],
|
|
||||||
)
|
|
||||||
|
|
||||||
if module.params.get('vlans_list'):
|
|
||||||
for vlan in module.params['vlans_list']:
|
|
||||||
if vlan['state'] == 'absent':
|
|
||||||
child_dn = dn + '/if-' + str(vlan['name'])
|
|
||||||
mo_1 = ucs.login_handle.query_dn(child_dn)
|
|
||||||
ucs.login_handle.remove_mo(mo_1)
|
|
||||||
else:
|
|
||||||
mo_1 = VnicEtherIf(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
name=str(vlan['name']),
|
|
||||||
default_net=vlan['native'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,201 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_vsans
|
|
||||||
short_description: Configures VSANs on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures VSANs on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify VSANs are present and will create if needed.
|
|
||||||
- If C(absent), will verify VSANs are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name assigned to the VSAN.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the VSAN is created.
|
|
||||||
required: yes
|
|
||||||
vsan_id:
|
|
||||||
description:
|
|
||||||
- The unique identifier assigned to the VSAN.
|
|
||||||
- The ID can be a string between '1' and '4078', or between '4080' and '4093'. '4079' is a reserved VSAN ID.
|
|
||||||
- In addition, if you plan to use FC end-host mode, the range between '3840' to '4079' is also a reserved VSAN ID range.
|
|
||||||
- Optional if state is absent.
|
|
||||||
required: yes
|
|
||||||
vlan_id:
|
|
||||||
description:
|
|
||||||
- The unique string identifier assigned to the VLAN used for Fibre Channel connections.
|
|
||||||
- Note that Cisco UCS Manager uses VLAN '4048'. See the UCS Manager configuration guide if you want to assign '4048' to a VLAN.
|
|
||||||
- Optional if state is absent.
|
|
||||||
required: yes
|
|
||||||
fc_zoning:
|
|
||||||
description:
|
|
||||||
- Fibre Channel zoning configuration for the Cisco UCS domain.
|
|
||||||
- "Fibre Channel zoning can be set to one of the following values:"
|
|
||||||
- "disabled — The upstream switch handles Fibre Channel zoning, or Fibre Channel zoning is not implemented for the Cisco UCS domain."
|
|
||||||
- "enabled — Cisco UCS Manager configures and controls Fibre Channel zoning for the Cisco UCS domain."
|
|
||||||
- If you enable Fibre Channel zoning, do not configure the upstream switch with any VSANs that are being used for Fibre Channel zoning.
|
|
||||||
choices: [disabled, enabled]
|
|
||||||
default: disabled
|
|
||||||
fabric:
|
|
||||||
description:
|
|
||||||
- "The fabric configuration of the VSAN. This can be one of the following:"
|
|
||||||
- "common - The VSAN maps to the same VSAN ID in all available fabrics."
|
|
||||||
- "A - The VSAN maps to the a VSAN ID that exists only in fabric A."
|
|
||||||
- "B - The VSAN maps to the a VSAN ID that exists only in fabric B."
|
|
||||||
choices: [common, A, B]
|
|
||||||
default: common
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure VSAN
|
|
||||||
ucs_vsans:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vsan110
|
|
||||||
vsan_id: '110'
|
|
||||||
vlan_id: '110'
|
|
||||||
|
|
||||||
- name: Remove VSAN
|
|
||||||
ucs_vsans:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: vsan110
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
name=dict(type='str'),
|
|
||||||
vsan_id=dict(type='str'),
|
|
||||||
vlan_id=dict(type='str'),
|
|
||||||
fc_zoning=dict(type='str', default='disabled', choices=['disabled', 'enabled']),
|
|
||||||
fabric=dict(type='str', default='common', choices=['common', 'A', 'B']),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
vsan_list=dict(type='list'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Note that use of vsan_list is an experimental feature which allows multiple resource updates with a single UCSM connection.
|
|
||||||
# Support for vsan_list may change or be removed once persistent UCS connections are supported.
|
|
||||||
# Either vsan_list or name/vsan_id/vlan_id is required (user can specify either a list or single resource).
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_one_of=[
|
|
||||||
['vsan_list', 'name']
|
|
||||||
],
|
|
||||||
mutually_exclusive=[
|
|
||||||
['vsan_list', 'name']
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.fabric.FabricVsan import FabricVsan
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
# Only documented use is a single resource, but to also support experimental
|
|
||||||
# feature allowing multiple updates all params are converted to a vsan_list below.
|
|
||||||
|
|
||||||
if module.params['vsan_list']:
|
|
||||||
# directly use the list (single resource and list are mutually exclusive
|
|
||||||
vsan_list = module.params['vsan_list']
|
|
||||||
else:
|
|
||||||
# single resource specified, create list from the current params
|
|
||||||
vsan_list = [module.params]
|
|
||||||
for vsan in vsan_list:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# set default params. Done here to set values for lists which can't be done in the argument_spec
|
|
||||||
if not vsan.get('fc_zoning'):
|
|
||||||
vsan['fc_zoning'] = 'disabled'
|
|
||||||
if not vsan.get('fabric'):
|
|
||||||
vsan['fabric'] = 'common'
|
|
||||||
# dn is fabric/san/net-<name> for common vsans or fabric/san/[A or B]/net-<name> for A or B
|
|
||||||
dn_base = 'fabric/san'
|
|
||||||
if vsan['fabric'] != 'common':
|
|
||||||
dn_base += '/' + vsan['fabric']
|
|
||||||
dn = dn_base + '/net-' + vsan['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
# mo must exist but all properties do not have to match
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(id=vsan['vsan_id'])
|
|
||||||
kwargs['fcoe_vlan'] = vsan['vlan_id']
|
|
||||||
kwargs['zoning_state'] = vsan['fc_zoning']
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = FabricVsan(
|
|
||||||
parent_mo_or_dn=dn_base,
|
|
||||||
name=vsan['name'],
|
|
||||||
id=vsan['vsan_id'],
|
|
||||||
fcoe_vlan=vsan['vlan_id'],
|
|
||||||
zoning_state=vsan['fc_zoning'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,238 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
||||||
'status': ['preview'],
|
|
||||||
'supported_by': 'certified'}
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
|
||||||
---
|
|
||||||
module: ucs_wwn_pool
|
|
||||||
short_description: Configures WWNN or WWPN pools on Cisco UCS Manager
|
|
||||||
description:
|
|
||||||
- Configures WWNNs or WWPN pools on Cisco UCS Manager.
|
|
||||||
extends_documentation_fragment: ucs
|
|
||||||
options:
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- If C(present), will verify WWNNs/WWPNs are present and will create if needed.
|
|
||||||
- If C(absent), will verify WWNNs/WWPNs are absent and will delete if needed.
|
|
||||||
choices: [present, absent]
|
|
||||||
default: present
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- The name of the World Wide Node Name (WWNN) or World Wide Port Name (WWPN) pool.
|
|
||||||
- This name can be between 1 and 32 alphanumeric characters.
|
|
||||||
- "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)."
|
|
||||||
- You cannot change this name after the WWNN or WWPN pool is created.
|
|
||||||
required: yes
|
|
||||||
purpose:
|
|
||||||
description:
|
|
||||||
- Specify whether this is a node (WWNN) or port (WWPN) pool.
|
|
||||||
- Optional if state is absent.
|
|
||||||
choices: [node, port]
|
|
||||||
required: yes
|
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- A description of the WWNN or WWPN pool.
|
|
||||||
- Enter up to 256 characters.
|
|
||||||
- "You can use any characters or spaces except the following:"
|
|
||||||
- "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)."
|
|
||||||
aliases: [ descr ]
|
|
||||||
order:
|
|
||||||
description:
|
|
||||||
- The Assignment Order field.
|
|
||||||
- "This can be one of the following:"
|
|
||||||
- "default - Cisco UCS Manager selects a random identity from the pool."
|
|
||||||
- "sequential - Cisco UCS Manager selects the lowest available identity from the pool."
|
|
||||||
choices: [default, sequential]
|
|
||||||
default: default
|
|
||||||
first_addr:
|
|
||||||
description:
|
|
||||||
- The first initiator in the World Wide Name (WWN) block.
|
|
||||||
- This is the From field in the UCS Manager Add WWN Blocks menu.
|
|
||||||
last_addr:
|
|
||||||
description:
|
|
||||||
- The last initiator in the World Wide Name (WWN) block.
|
|
||||||
- This is the To field in the UCS Manager Add WWN Blocks menu.
|
|
||||||
- For WWxN pools, the pool size must be a multiple of ports-per-node + 1.
|
|
||||||
- For example, if there are 7 ports per node, the pool size must be a multiple of 8.
|
|
||||||
- If there are 63 ports per node, the pool size must be a multiple of 64.
|
|
||||||
org_dn:
|
|
||||||
description:
|
|
||||||
- Org dn (distinguished name)
|
|
||||||
default: org-root
|
|
||||||
requirements:
|
|
||||||
- ucsmsdk
|
|
||||||
author:
|
|
||||||
- David Soper (@dsoper2)
|
|
||||||
- CiscoUcs (@CiscoUcs)
|
|
||||||
version_added: '2.5'
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = r'''
|
|
||||||
- name: Configure WWNN/WWPN pools
|
|
||||||
ucs_wwn_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: WWNN-Pool
|
|
||||||
purpose: node
|
|
||||||
first_addr: 20:00:00:25:B5:48:00:00
|
|
||||||
last_addr: 20:00:00:25:B5:48:00:0F
|
|
||||||
- ucs_wwn_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: WWPN-Pool-A
|
|
||||||
purpose: port
|
|
||||||
order: sequential
|
|
||||||
first_addr: 20:00:00:25:B5:48:0A:00
|
|
||||||
last_addr: 20:00:00:25:B5:48:0A:0F
|
|
||||||
|
|
||||||
- name: Remove WWNN/WWPN pools
|
|
||||||
ucs_wwn_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: WWNN-Pool
|
|
||||||
state: absent
|
|
||||||
- ucs_wwn_pool:
|
|
||||||
hostname: 172.16.143.150
|
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
name: WWPN-Pool-A
|
|
||||||
state: absent
|
|
||||||
'''
|
|
||||||
|
|
||||||
RETURN = r'''
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = ucs_argument_spec
|
|
||||||
argument_spec.update(
|
|
||||||
org_dn=dict(type='str', default='org-root'),
|
|
||||||
name=dict(type='str'),
|
|
||||||
purpose=dict(type='str', choices=['node', 'port']),
|
|
||||||
descr=dict(type='str'),
|
|
||||||
order=dict(type='str', default='default', choices=['default', 'sequential']),
|
|
||||||
first_addr=dict(type='str'),
|
|
||||||
last_addr=dict(type='str'),
|
|
||||||
state=dict(type='str', default='present', choices=['present', 'absent']),
|
|
||||||
wwn_list=dict(type='list'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Note that use of wwn_list is an experimental feature which allows multiple resource updates with a single UCSM connection.
|
|
||||||
# Support for wwn_list may change or be removed once persistent UCS connections are supported.
|
|
||||||
# Either wwn_list or name is required (user can specify either a list or single resource).
|
|
||||||
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec,
|
|
||||||
supports_check_mode=True,
|
|
||||||
required_one_of=[
|
|
||||||
['wwn_list', 'name']
|
|
||||||
],
|
|
||||||
mutually_exclusive=[
|
|
||||||
['wwn_list', 'name']
|
|
||||||
],
|
|
||||||
)
|
|
||||||
ucs = UCSModule(module)
|
|
||||||
|
|
||||||
err = False
|
|
||||||
|
|
||||||
from ucsmsdk.mometa.fcpool.FcpoolInitiators import FcpoolInitiators
|
|
||||||
from ucsmsdk.mometa.fcpool.FcpoolBlock import FcpoolBlock
|
|
||||||
|
|
||||||
changed = False
|
|
||||||
try:
|
|
||||||
# Only documented use is a single resource, but to also support experimental
|
|
||||||
# feature allowing multiple updates all params are converted to a wwn_list below.
|
|
||||||
|
|
||||||
if module.params['wwn_list']:
|
|
||||||
# directly use the list (single resource and list are mutually exclusive
|
|
||||||
wwn_list = module.params['wwn_list']
|
|
||||||
else:
|
|
||||||
# single resource specified, create list from the current params
|
|
||||||
wwn_list = [module.params]
|
|
||||||
for wwn in wwn_list:
|
|
||||||
mo_exists = False
|
|
||||||
props_match = False
|
|
||||||
# set default params. Done here to set values for lists which can't be done in the argument_spec
|
|
||||||
if not wwn.get('descr'):
|
|
||||||
wwn['descr'] = ''
|
|
||||||
if not wwn.get('order'):
|
|
||||||
wwn['order'] = 'default'
|
|
||||||
# dn is <org_dn>/wwn-pool-<name> for WWNN or WWPN
|
|
||||||
dn = module.params['org_dn'] + '/wwn-pool-' + wwn['name']
|
|
||||||
|
|
||||||
mo = ucs.login_handle.query_dn(dn)
|
|
||||||
if mo:
|
|
||||||
mo_exists = True
|
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
|
||||||
if mo_exists:
|
|
||||||
if not module.check_mode:
|
|
||||||
ucs.login_handle.remove_mo(mo)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
else:
|
|
||||||
# append purpose param with suffix used by UCSM
|
|
||||||
purpose_param = wwn['purpose'] + '-wwn-assignment'
|
|
||||||
if mo_exists:
|
|
||||||
# check top-level mo props
|
|
||||||
kwargs = dict(assignment_order=wwn['order'])
|
|
||||||
kwargs['descr'] = wwn['descr']
|
|
||||||
kwargs['purpose'] = purpose_param
|
|
||||||
if (mo.check_prop_match(**kwargs)):
|
|
||||||
# top-level props match, check next level mo/props
|
|
||||||
if 'last_addr' in wwn and 'first_addr' in wwn:
|
|
||||||
block_dn = dn + '/block-' + wwn['first_addr'].upper() + '-' + wwn['last_addr'].upper()
|
|
||||||
mo_1 = ucs.login_handle.query_dn(block_dn)
|
|
||||||
if mo_1:
|
|
||||||
props_match = True
|
|
||||||
else:
|
|
||||||
props_match = True
|
|
||||||
|
|
||||||
if not props_match:
|
|
||||||
if not module.check_mode:
|
|
||||||
# create if mo does not already exist
|
|
||||||
mo = FcpoolInitiators(
|
|
||||||
parent_mo_or_dn=module.params['org_dn'],
|
|
||||||
name=wwn['name'],
|
|
||||||
descr=wwn['descr'],
|
|
||||||
assignment_order=wwn['order'],
|
|
||||||
purpose=purpose_param,
|
|
||||||
)
|
|
||||||
if 'last_addr' in wwn and 'first_addr' in wwn:
|
|
||||||
mo_1 = FcpoolBlock(
|
|
||||||
parent_mo_or_dn=mo,
|
|
||||||
to=wwn['last_addr'],
|
|
||||||
r_from=wwn['first_addr'],
|
|
||||||
)
|
|
||||||
|
|
||||||
ucs.login_handle.add_mo(mo, True)
|
|
||||||
ucs.login_handle.commit()
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
err = True
|
|
||||||
ucs.result['msg'] = "setup error: %s " % str(e)
|
|
||||||
|
|
||||||
ucs.result['changed'] = changed
|
|
||||||
if err:
|
|
||||||
module.fail_json(**ucs.result)
|
|
||||||
module.exit_json(**ucs.result)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,73 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# This code is part of Ansible, but is an independent component.
|
|
||||||
# This particular file snippet, and this file snippet only, is BSD licensed.
|
|
||||||
# Modules you write using this snippet, which is embedded dynamically by Ansible
|
|
||||||
# still belong to the author of the module, and may assign their own license
|
|
||||||
# to the complete work.
|
|
||||||
#
|
|
||||||
# (c) 2016 Red Hat Inc.
|
|
||||||
# (c) 2020 Cisco Systems Inc.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class ModuleDocFragment(object):
|
|
||||||
# Cisco UCS doc fragment
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
notes:
|
|
||||||
- Examples can be used with the L(UCS Platform Emulator, https://cs.co/ucspe).
|
|
||||||
options:
|
|
||||||
hostname:
|
|
||||||
description:
|
|
||||||
- IP address or hostname of Cisco UCS Manager.
|
|
||||||
type: str
|
|
||||||
required: yes
|
|
||||||
username:
|
|
||||||
description:
|
|
||||||
- Username for Cisco UCS Manager authentication.
|
|
||||||
type: str
|
|
||||||
default: admin
|
|
||||||
password:
|
|
||||||
description:
|
|
||||||
- Password for Cisco UCS Manager authentication.
|
|
||||||
type: str
|
|
||||||
required: yes
|
|
||||||
port:
|
|
||||||
description:
|
|
||||||
- Port number to be used during connection (by default uses 443 for https and 80 for http connection).
|
|
||||||
type: int
|
|
||||||
use_ssl:
|
|
||||||
description:
|
|
||||||
- If C(no), an HTTP connection will be used instead of the default HTTPS connection.
|
|
||||||
type: bool
|
|
||||||
default: yes
|
|
||||||
use_proxy:
|
|
||||||
description:
|
|
||||||
- If C(no), will not use the proxy as defined by system environment variable.
|
|
||||||
type: bool
|
|
||||||
default: yes
|
|
||||||
proxy:
|
|
||||||
description:
|
|
||||||
- If use_proxy is no, specfies proxy to be used for connection.
|
|
||||||
e.g. 'http://proxy.xy.z:8080'
|
|
||||||
type: str
|
|
||||||
'''
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,193 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Disk Group Policy absent
|
|
||||||
ucs_disk_group_policy: &disk_group_policy_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-DG
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Disk Group Policy present (check_mode)
|
|
||||||
ucs_disk_group_policy: &disk_group_policy_present
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-DG
|
|
||||||
raid_level: mirror
|
|
||||||
configuration_mode: manual
|
|
||||||
manual_disks:
|
|
||||||
- slot_num: '1'
|
|
||||||
role: normal
|
|
||||||
- slot_num: '2'
|
|
||||||
role: normal
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Disk Group Policy present (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_present
|
|
||||||
register: nm_disk_group_policy_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Disk Group Policy present again (check_mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Disk Group Policy present again (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_present
|
|
||||||
register: nm_disk_group_policy_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Disk Group Policy present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_disk_group_policy_present.changed == nm_disk_group_policy_present.changed == true
|
|
||||||
- cm_disk_group_policy_present_again.changed == nm_disk_group_policy_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Disk Group Policy change (check_mode)
|
|
||||||
ucs_disk_group_policy: &disk_group_policy_change
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-DG
|
|
||||||
description: Testing Ansible
|
|
||||||
raid_level: stripe
|
|
||||||
configuration_mode: manual
|
|
||||||
manual_disks:
|
|
||||||
- slot_num: '1'
|
|
||||||
role: normal
|
|
||||||
- slot_num: '2'
|
|
||||||
role: normal
|
|
||||||
state: absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Disk Group Policy change (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_change
|
|
||||||
register: nm_disk_group_policy_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Disk Group Policy again (check_mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Disk Group Policy change again (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_change
|
|
||||||
register: nm_disk_group_policy_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Disk Group Policy change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_disk_group_policy_change.changed == nm_disk_group_policy_change.changed == true
|
|
||||||
- cm_disk_group_policy_change_again.changed == nm_disk_group_policy_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Clean environment for next tests
|
|
||||||
- name: Disk Group Policy absent for automatic testing
|
|
||||||
ucs_disk_group_policy: &disk_group_policy_absent_auto
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-DG
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test automatic configuration mode (check_mode)
|
|
||||||
- name: Disk Group Policy automatic (check_mode)
|
|
||||||
ucs_disk_group_policy: &disk_group_policy_auto
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-DG
|
|
||||||
raid_level: mirror
|
|
||||||
configuration_mode: automatic
|
|
||||||
drive_type: SSD
|
|
||||||
num_drives: 2
|
|
||||||
virtual_drive:
|
|
||||||
access_policy: platform-default
|
|
||||||
io_policy: direct
|
|
||||||
strip_size: 64KB
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_auto
|
|
||||||
|
|
||||||
|
|
||||||
# Automatic configuration (normal mode)
|
|
||||||
- name: Disk Group Policy automatic (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_auto
|
|
||||||
register: nm_disk_group_policy_auto
|
|
||||||
|
|
||||||
|
|
||||||
# Test automatic configuration again (idempotent)
|
|
||||||
- name: Disk Group Policy automatic again (check_mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_auto
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_auto_again
|
|
||||||
|
|
||||||
|
|
||||||
# Automatic configuration again (normal mode)
|
|
||||||
- name: Disk Group Policy automatic again (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_auto
|
|
||||||
register: nm_disk_group_policy_auto_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy Automatic configuration
|
|
||||||
- name: Verify Disk Group Policy automatic results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_disk_group_policy_auto.changed == nm_disk_group_policy_auto.changed == true
|
|
||||||
- cm_disk_group_policy_auto_again.changed == nm_disk_group_policy_auto_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Disk Group Policy absent (check_mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Disk Group Policy absent (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_absent
|
|
||||||
register: nm_disk_group_policy_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Disk Group Policy absent again (check_mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_disk_group_policy_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Disk Group Policy absent again (normal mode)
|
|
||||||
ucs_disk_group_policy: *disk_group_policy_absent
|
|
||||||
register: nm_disk_group_policy_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Disk Group Policy absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_disk_group_policy_absent.changed == nm_disk_group_policy_absent.changed == true
|
|
||||||
- cm_disk_group_policy_absent_again.changed == nm_disk_group_policy_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 10.10.10.10
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,110 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, John McDonough (@movinalot)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password.
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: DNS Server absent
|
|
||||||
ucs_dns_server: &dns_server_absent
|
|
||||||
<<: *login_info
|
|
||||||
dns_server: 10.10.10.10
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: DNS Server present (check_mode)
|
|
||||||
ucs_dns_server: &dns_server_present
|
|
||||||
<<: *login_info
|
|
||||||
dns_server: 10.10.10.10
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_server_present
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: DNS Server present (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_present
|
|
||||||
register: nm_dns_server_present
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: DNS Server present again (check_mode)
|
|
||||||
ucs_dns_server: *dns_server_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_server_present_again
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: DNS Server present again (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_present
|
|
||||||
register: nm_dns_server_present_again
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify DNS Server present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_dns_server_present.changed == nm_dns_server_present.changed == true
|
|
||||||
- cm_dns_server_present_again.changed == nm_dns_server_present_again.changed == false
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: DNS DNS Server change (check_mode)
|
|
||||||
ucs_dns_server: &dns_server_change
|
|
||||||
<<: *dns_server_present
|
|
||||||
dns_server: 10.10.10.10
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_dns_server_change
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: DNS DNS Server change (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_change
|
|
||||||
register: nm_dns_dns_server_change
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: DNS DNS Server change again (check_mode)
|
|
||||||
ucs_dns_server: *dns_server_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_dns_server_change_again
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: DNS DNS Server change again (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_change
|
|
||||||
register: nm_dns_dns_server_change_again
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify DNS DNS Server change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_dns_dns_server_change.changed == nm_dns_dns_server_change.changed == true
|
|
||||||
- cm_dns_dns_server_change_again.changed == nm_dns_dns_server_change_again.changed == false
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: DNS Server absent (check_mode)
|
|
||||||
ucs_dns_server: *dns_server_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_server_absent
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: DNS Server absent (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_absent
|
|
||||||
register: nm_dns_server_absent
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: DNS Server absent again (check_mode)
|
|
||||||
ucs_dns_server: *dns_server_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_dns_server_absent_again
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: DNS Server absent again (normal mode)
|
|
||||||
ucs_dns_server: *dns_server_absent
|
|
||||||
register: nm_dns_server_absent_again
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify DNS Server absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_dns_server_absent.changed == nm_dns_server_absent.changed == true
|
|
||||||
- cm_dns_server_absent_again.changed == nm_dns_server_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,203 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: IPv4 Pools absent
|
|
||||||
ucs_ip_pool: &ipv4_pool_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: ip-A
|
|
||||||
state: absent
|
|
||||||
- name: IPv6 Pools absent
|
|
||||||
ucs_ip_pool: &ipv6_pool_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: ipv6-B
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: IPv4 Pools present (check_mode)
|
|
||||||
ucs_ip_pool: &ipv4_pool_present
|
|
||||||
<<: *login_info
|
|
||||||
name: ip-A
|
|
||||||
order: sequential
|
|
||||||
first_addr: 192.168.0.10
|
|
||||||
last_addr: 192.168.0.19
|
|
||||||
subnet_mask: 255.255.255.0
|
|
||||||
default_gw: 192.168.0.1
|
|
||||||
primary_dns: 172.16.143.136
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_present
|
|
||||||
|
|
||||||
- name: IPv6 Pools present (check_mode)
|
|
||||||
ucs_ip_pool: &ipv6_pool_present
|
|
||||||
<<: *login_info
|
|
||||||
name: ipv6-B
|
|
||||||
ipv6_first_addr: fe80::1cae:7992:d7a1:ed07
|
|
||||||
ipv6_last_addr: fe80::1cae:7992:d7a1:edfe
|
|
||||||
ipv6_default_gw: fe80::1cae:7992:d7a1:ecff
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: IPv4 Pools present (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_present
|
|
||||||
register: nm_ipv4_pool_present
|
|
||||||
|
|
||||||
- name: IPv6 Pools present (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_present
|
|
||||||
register: nm_ipv6_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: IPv4 Pools present again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_present_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools present again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: IPv4 Pools present again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_present
|
|
||||||
register: nm_ipv4_pool_present_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools present again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_present
|
|
||||||
register: nm_ipv6_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify IPv4/IPv6 Pools present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ipv4_pool_present.changed == nm_ipv4_pool_present.changed == true
|
|
||||||
- cm_ipv6_pool_present.changed == nm_ipv6_pool_present.changed == true
|
|
||||||
- cm_ipv4_pool_present_again.changed == nm_ipv4_pool_present_again.changed == false
|
|
||||||
- cm_ipv6_pool_present_again.changed == nm_ipv6_pool_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: IPv4 Pools description change (check_mode)
|
|
||||||
ucs_ip_pool: &ipv4_pool_change
|
|
||||||
<<: *ipv4_pool_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_descr_change
|
|
||||||
|
|
||||||
- name: IPv6 Pools description change (check_mode)
|
|
||||||
ucs_ip_pool: &ipv6_pool_change
|
|
||||||
<<: *ipv6_pool_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: IPv4 Pools description change (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_change
|
|
||||||
register: nm_ipv4_pool_descr_change
|
|
||||||
|
|
||||||
- name: IPv6 Pools description change (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_change
|
|
||||||
register: nm_ipv6_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: IPv4 Pools description again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_descr_change_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools description again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: IPv4 Pools description change again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_change
|
|
||||||
register: nm_ipv4_pool_descr_change_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools description change again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_change
|
|
||||||
register: nm_ipv6_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify IPv4/IPv6 Pools change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ipv4_pool_descr_change.changed == nm_ipv4_pool_descr_change.changed == true
|
|
||||||
- cm_ipv4_pool_descr_change_again.changed == nm_ipv4_pool_descr_change_again.changed == false
|
|
||||||
- cm_ipv6_pool_descr_change.changed == nm_ipv6_pool_descr_change.changed == true
|
|
||||||
- cm_ipv6_pool_descr_change_again.changed == nm_ipv6_pool_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: IPv4 Pools absent (check_mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_absent
|
|
||||||
|
|
||||||
- name: IPv6 Pools absent (check_mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: IPv4 Pools absent (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_absent
|
|
||||||
register: nm_ipv4_pool_absent
|
|
||||||
|
|
||||||
- name: IPv6 Pools absent (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_absent
|
|
||||||
register: nm_ipv6_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: IPv4 Pools absent again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv4_pool_absent_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools absent again (check_mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ipv6_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: IPv4 Pools absent again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv4_pool_absent
|
|
||||||
register: nm_ipv4_pool_absent_again
|
|
||||||
|
|
||||||
- name: IPv6 Pools absent again (normal mode)
|
|
||||||
ucs_ip_pool: *ipv6_pool_absent
|
|
||||||
register: nm_ipv6_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify IPv4/IPv6 Pools absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ipv4_pool_absent.changed == nm_ipv4_pool_absent.changed == true
|
|
||||||
- cm_ipv4_pool_absent_again.changed == nm_ipv4_pool_absent_again.changed == false
|
|
||||||
- cm_ipv6_pool_absent.changed == nm_ipv6_pool_absent.changed == true
|
|
||||||
- cm_ipv6_pool_absent_again.changed == nm_ipv6_pool_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,202 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: LAN Connectivity Policies absent
|
|
||||||
ucs_lan_connectivity: &lan_connectivity_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: LAN Connectivity Policies present (check_mode)
|
|
||||||
ucs_lan_connectivity: &lan_connectivity_present
|
|
||||||
<<: *login_info
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
vnic_list:
|
|
||||||
- name: eno1
|
|
||||||
vnic_template: Cntr-Template
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno2
|
|
||||||
vnic_template: Container-NFS-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno3
|
|
||||||
vnic_template: Container-NFS-B
|
|
||||||
adapter_policy: Linux
|
|
||||||
iscsi_vnic_list:
|
|
||||||
- name: iSCSIa
|
|
||||||
overlay_vnic: eno1
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-MGMT-VLAN
|
|
||||||
- name: iSCSIb
|
|
||||||
overlay_vnic: eno3
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-TNT-A-NFS
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_present
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: LAN Connectivity Policies present (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_present
|
|
||||||
register: nm_lan_connectivity_present
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: LAN Connectivity Policies present again (check_mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_present_again
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: LAN Connectivity Policies present again (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_present
|
|
||||||
register: nm_lan_connectivity_present_again
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify LAN Connectivity Policies present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_lan_connectivity_present.changed == nm_lan_connectivity_present.changed == true
|
|
||||||
- cm_lan_connectivity_present_again.changed == nm_lan_connectivity_present_again.changed == false
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: LAN Connectivity Policies change (check_mode)
|
|
||||||
ucs_lan_connectivity: &lan_connectivity_change
|
|
||||||
<<: *login_info
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
vnic_list:
|
|
||||||
- name: eno1
|
|
||||||
vnic_template: Cntr-Template
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno2
|
|
||||||
vnic_template: Container-NFS-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno3
|
|
||||||
vnic_template: Container-NFS-B
|
|
||||||
adapter_policy: default
|
|
||||||
iscsi_vnic_list:
|
|
||||||
- name: iSCSIa
|
|
||||||
overlay_vnic: eno1
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-MGMT-VLAN
|
|
||||||
- name: iSCSIb
|
|
||||||
overlay_vnic: eno3
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-TNT-A-NFS
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_descr_change
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: LAN Connectivity Policies description change (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_change
|
|
||||||
register: nm_lan_connectivity_descr_change
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: LAN Connectivity Policies description again (check_mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_descr_change_again
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: LAN Connectivity Policies description change again (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_change
|
|
||||||
register: nm_lan_connectivity_descr_change_again
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify LAN Connectivity Policies change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_lan_connectivity_descr_change.changed == nm_lan_connectivity_descr_change.changed == true
|
|
||||||
- cm_lan_connectivity_descr_change_again.changed == nm_lan_connectivity_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test vnic and iscsi vnic removal
|
|
||||||
- name: LAN Connectivity Policies vnic removal (check_mode)
|
|
||||||
ucs_lan_connectivity: &lan_connectivity_vnic_change
|
|
||||||
<<: *login_info
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
vnic_list:
|
|
||||||
- name: eno1
|
|
||||||
vnic_template: Cntr-Template
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno2
|
|
||||||
vnic_template: Container-NFS-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: eno3
|
|
||||||
vnic_template: Container-NFS-B
|
|
||||||
adapter_policy: default
|
|
||||||
state: absent
|
|
||||||
iscsi_vnic_list:
|
|
||||||
- name: iSCSIa
|
|
||||||
overlay_vnic: eno1
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-MGMT-VLAN
|
|
||||||
state: absent
|
|
||||||
- name: iSCSIb
|
|
||||||
overlay_vnic: eno3
|
|
||||||
iscsi_adapter_policy: default
|
|
||||||
vlan_name: Container-TNT-A-NFS
|
|
||||||
state: absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_vnic_change
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: LAN Connectivity Policies vnic removal (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_vnic_change
|
|
||||||
register: nm_lan_connectivity_vnic_change
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: LAN Connectivity Policies vnic removal again (check_mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_vnic_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_vnic_change_again
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: LAN Connectivity Policies vnic removal again (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_vnic_change
|
|
||||||
register: nm_lan_connectivity_vnic_change_again
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify LAN Connectivity Policies vnic removal results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_lan_connectivity_vnic_change.changed == nm_lan_connectivity_vnic_change.changed == true
|
|
||||||
- cm_lan_connectivity_vnic_change_again.changed == nm_lan_connectivity_vnic_change_again.changed == false
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: LAN Connectivity Policies absent (check_mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_absent
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: LAN Connectivity Policies absent (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_absent
|
|
||||||
register: nm_lan_connectivity_absent
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: LAN Connectivity Policies absent again (check_mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_lan_connectivity_absent_again
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: LAN Connectivity Policies absent again (normal mode)
|
|
||||||
ucs_lan_connectivity: *lan_connectivity_absent
|
|
||||||
register: nm_lan_connectivity_absent_again
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify LAN Connectivity Policies absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_lan_connectivity_absent.changed == nm_lan_connectivity_absent.changed == true
|
|
||||||
- cm_lan_connectivity_absent_again.changed == nm_lan_connectivity_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,129 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: MAC pools absent
|
|
||||||
ucs_mac_pool: &mac_pools_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: mac-A
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: MAC pools present (check_mode)
|
|
||||||
ucs_mac_pool: &mac_pools_present
|
|
||||||
<<: *login_info
|
|
||||||
name: mac-A
|
|
||||||
first_addr: 00:25:B5:00:66:00
|
|
||||||
last_addr: 00:25:B5:00:67:F3
|
|
||||||
order: sequential
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: MAC pools present (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_present
|
|
||||||
register: nm_mac_pools_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: MAC pools present again (check_mode)
|
|
||||||
ucs_mac_pool: *mac_pools_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: MAC pools present again (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_present
|
|
||||||
register: nm_mac_pools_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify MAC present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_mac_pools_present.changed == nm_mac_pools_present.changed == true
|
|
||||||
- cm_mac_pools_present_again.changed == nm_mac_pools_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: MAC pools description change (check_mode)
|
|
||||||
ucs_mac_pool: &mac_pools_change
|
|
||||||
<<: *mac_pools_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: MAC pools description change (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_change
|
|
||||||
register: nm_mac_pools_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: MAC pools description again (check_mode)
|
|
||||||
ucs_mac_pool: *mac_pools_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: MAC pools description change again (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_change
|
|
||||||
register: nm_mac_pools_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify MAC change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_mac_pools_descr_change.changed == nm_mac_pools_descr_change.changed == true
|
|
||||||
- cm_mac_pools_descr_change_again.changed == nm_mac_pools_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: MAC pools absent (check_mode)
|
|
||||||
ucs_mac_pool: *mac_pools_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: MAC pools absent (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_absent
|
|
||||||
register: nm_mac_pools_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: MAC pools absent again (check_mode)
|
|
||||||
ucs_mac_pool: *mac_pools_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_mac_pools_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: MAC pools absent again (normal mode)
|
|
||||||
ucs_mac_pool: *mac_pools_absent
|
|
||||||
register: nm_mac_pools_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify MAC absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_mac_pools_absent.changed == nm_mac_pools_absent.changed == true
|
|
||||||
- cm_mac_pools_absent_again.changed == nm_mac_pools_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,360 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Remove Network Control Policy
|
|
||||||
ucs_managed_objects: &managed_objects_absent
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- module: ucsmsdk.mometa.nwctrl.NwctrlDefinition
|
|
||||||
class: NwctrlDefinition
|
|
||||||
properties:
|
|
||||||
parent_mo_or_dn: org-root
|
|
||||||
name: Enable-CDP-LLDP
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Configure Network Control Policy
|
|
||||||
ucs_managed_objects: &managed_objects_present
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- module: ucsmsdk.mometa.nwctrl.NwctrlDefinition
|
|
||||||
class: NwctrlDefinition
|
|
||||||
properties:
|
|
||||||
parent_mo_or_dn: org-root
|
|
||||||
cdp: enabled
|
|
||||||
descr: ''
|
|
||||||
lldp_receive: enabled
|
|
||||||
lldp_transmit: enabled
|
|
||||||
name: Enable-CDP-LLDP
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Managed Objects present (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_present
|
|
||||||
register: nm_managed_objects_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Managed Objects present again (check_mode)
|
|
||||||
ucs_managed_objects: *managed_objects_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Managed Objects present again (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_present
|
|
||||||
register: nm_managed_objects_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Managed Objects present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_managed_objects_present.changed == nm_managed_objects_present.changed == true
|
|
||||||
- cm_managed_objects_present_again.changed == nm_managed_objects_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Managed Objects change (check_mode)
|
|
||||||
ucs_managed_objects: &managed_objects_change
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- module: ucsmsdk.mometa.nwctrl.NwctrlDefinition
|
|
||||||
class: NwctrlDefinition
|
|
||||||
properties:
|
|
||||||
parent_mo_or_dn: org-root
|
|
||||||
cdp: enabled
|
|
||||||
descr: Testing Ansible
|
|
||||||
lldp_receive: enabled
|
|
||||||
lldp_transmit: enabled
|
|
||||||
name: Enable-CDP-LLDP
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Managed Objects change (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_change
|
|
||||||
register: nm_managed_objects_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Managed Objects again (check_mode)
|
|
||||||
ucs_managed_objects: *managed_objects_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Managed Objects change again (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_change
|
|
||||||
register: nm_managed_objects_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Managed Objects change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_managed_objects_change.changed == nm_managed_objects_change.changed == true
|
|
||||||
- cm_managed_objects_change_again.changed == nm_managed_objects_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Managed Objects absent (check_mode)
|
|
||||||
ucs_managed_objects: *managed_objects_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Managed Objects absent (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_absent
|
|
||||||
register: nm_managed_objects_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Managed Objects absent again (check_mode)
|
|
||||||
ucs_managed_objects: *managed_objects_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_managed_objects_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Managed Objects absent again (normal mode)
|
|
||||||
ucs_managed_objects: *managed_objects_absent
|
|
||||||
register: nm_managed_objects_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Managed Objects absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_managed_objects_absent.changed == nm_managed_objects_absent.changed == true
|
|
||||||
- cm_managed_objects_absent_again.changed == nm_managed_objects_absent_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Setup Boot Policy (clean environment)
|
|
||||||
- name: Remove Boot Policy
|
|
||||||
ucs_managed_objects: &boot_managed_objects_absent
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- {
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootPolicy",
|
|
||||||
"class": "LsbootPolicy",
|
|
||||||
"properties": {
|
|
||||||
"parent_mo_or_dn": "org-root",
|
|
||||||
"name": "Python_SDS"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Configure Boot Policy
|
|
||||||
ucs_managed_objects: &boot_managed_objects_present
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- {
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootPolicy",
|
|
||||||
"class": "LsbootPolicy",
|
|
||||||
"properties": {
|
|
||||||
"parent_mo_or_dn": "org-root",
|
|
||||||
"name": "Python_SDS",
|
|
||||||
"enforce_vnic_name": "yes",
|
|
||||||
"boot_mode": "legacy",
|
|
||||||
"reboot_on_update": "no"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootVirtualMedia",
|
|
||||||
"class": "LsbootVirtualMedia",
|
|
||||||
"properties": {
|
|
||||||
"access": "read-only-local",
|
|
||||||
"lun_id": "0",
|
|
||||||
"order": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootStorage",
|
|
||||||
"class": "LsbootStorage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootLocalStorage",
|
|
||||||
"class": "LsbootLocalStorage",
|
|
||||||
"properties": {},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootDefaultLocalImage",
|
|
||||||
"class": "LsbootDefaultLocalImage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Boot Managed Objects present (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_present
|
|
||||||
register: nm_boot_managed_objects_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Boot Managed Objects present again (check_mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Boot Managed Objects present again (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_present
|
|
||||||
register: nm_boot_managed_objects_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Boot Managed Objects present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_boot_managed_objects_present.changed == nm_boot_managed_objects_present.changed == true
|
|
||||||
- cm_boot_managed_objects_present_again.changed == nm_boot_managed_objects_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Boot Managed Objects change (check_mode)
|
|
||||||
ucs_managed_objects: &boot_managed_objects_change
|
|
||||||
<<: *login_info
|
|
||||||
objects:
|
|
||||||
- {
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootPolicy",
|
|
||||||
"class": "LsbootPolicy",
|
|
||||||
"properties": {
|
|
||||||
"parent_mo_or_dn": "org-root",
|
|
||||||
"name": "Python_SDS",
|
|
||||||
"enforce_vnic_name": "yes",
|
|
||||||
"boot_mode": "legacy",
|
|
||||||
"reboot_on_update": "yes"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootVirtualMedia",
|
|
||||||
"class": "LsbootVirtualMedia",
|
|
||||||
"properties": {
|
|
||||||
"access": "read-only-local",
|
|
||||||
"lun_id": "0",
|
|
||||||
"order": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootStorage",
|
|
||||||
"class": "LsbootStorage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootLocalStorage",
|
|
||||||
"class": "LsbootLocalStorage",
|
|
||||||
"properties": {},
|
|
||||||
"children": [
|
|
||||||
{
|
|
||||||
"module": "ucsmsdk.mometa.lsboot.LsbootDefaultLocalImage",
|
|
||||||
"class": "LsbootDefaultLocalImage",
|
|
||||||
"properties": {
|
|
||||||
"order": "1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Boot Managed Objects change (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_change
|
|
||||||
register: nm_boot_managed_objects_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Boot Managed Objects again (check_mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Boot Managed Objects change again (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_change
|
|
||||||
register: nm_boot_managed_objects_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Boot Managed Objects change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_boot_managed_objects_change.changed == nm_boot_managed_objects_change.changed == true
|
|
||||||
- cm_boot_managed_objects_change_again.changed == nm_boot_managed_objects_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Boot Managed Objects absent (check_mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Boot Managed Objects absent (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_absent
|
|
||||||
register: nm_boot_managed_objects_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Boot Managed Objects absent again (check_mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_boot_managed_objects_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Boot Managed Objects absent again (normal mode)
|
|
||||||
ucs_managed_objects: *boot_managed_objects_absent
|
|
||||||
register: nm_boot_managed_objects_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Boot Managed Objects absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_boot_managed_objects_absent.changed == nm_boot_managed_objects_absent.changed == true
|
|
||||||
- cm_boot_managed_objects_absent_again.changed == nm_boot_managed_objects_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.22.251.170
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,110 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, John McDonough (@movinalot)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: NTP Server absent
|
|
||||||
ucs_ntp_server: &ntp_server_absent
|
|
||||||
<<: *login_info
|
|
||||||
ntp_server: pool.ntp.org
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: NTP Server present (check_mode)
|
|
||||||
ucs_ntp_server: &ntp_server_present
|
|
||||||
<<: *login_info
|
|
||||||
ntp_server: pool.ntp.org
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_server_present
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: NTP Server present (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_present
|
|
||||||
register: nm_ntp_server_present
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: NTP Server present again (check_mode)
|
|
||||||
ucs_ntp_server: *ntp_server_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_server_present_again
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: NTP Server present again (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_present
|
|
||||||
register: nm_ntp_server_present_again
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify NTP Server present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ntp_server_present.changed == nm_ntp_server_present.changed == true
|
|
||||||
- cm_ntp_server_present_again.changed == nm_ntp_server_present_again.changed == false
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: NTP NTP Server change (check_mode)
|
|
||||||
ucs_ntp_server: &ntp_server_change
|
|
||||||
<<: *ntp_server_present
|
|
||||||
ntp_server: 10.10.10.10
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_ntp_server_change
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: NTP NTP Server change (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_change
|
|
||||||
register: nm_ntp_ntp_server_change
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: NTP NTP Server change again (check_mode)
|
|
||||||
ucs_ntp_server: *ntp_server_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_ntp_server_change_again
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: NTP NTP Server change again (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_change
|
|
||||||
register: nm_ntp_ntp_server_change_again
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify NTP NTP Server change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ntp_ntp_server_change.changed == nm_ntp_ntp_server_change.changed == true
|
|
||||||
- cm_ntp_ntp_server_change_again.changed == nm_ntp_ntp_server_change_again.changed == false
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: NTP Server absent (check_mode)
|
|
||||||
ucs_ntp_server: *ntp_server_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_server_absent
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: NTP Server absent (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_absent
|
|
||||||
register: nm_ntp_server_absent
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: NTP Server absent again (check_mode)
|
|
||||||
ucs_ntp_server: *ntp_server_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_ntp_server_absent_again
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: NTP Server absent again (normal mode)
|
|
||||||
ucs_ntp_server: *ntp_server_absent
|
|
||||||
register: nm_ntp_server_absent_again
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify NTP Server absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_ntp_server_absent.changed == nm_ntp_server_absent.changed == true
|
|
||||||
- cm_ntp_server_absent_again.changed == nm_ntp_server_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,123 +0,0 @@
|
|||||||
# Test code for the UCS Org module
|
|
||||||
# Copyright 2018, John McDonough (@movinalot)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
<<: *login_info
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: org absent
|
|
||||||
ucs_org: &org_absent
|
|
||||||
<<: *login_info
|
|
||||||
org_name: testorg
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: org present (check_mode)
|
|
||||||
ucs_org: &org_present
|
|
||||||
<<: *login_info
|
|
||||||
org_name: testorg
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: org present (normal mode)
|
|
||||||
ucs_org: *org_present
|
|
||||||
register: nm_org_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: org present again (check_mode)
|
|
||||||
ucs_org: *org_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: org present again (normal mode)
|
|
||||||
ucs_org: *org_present
|
|
||||||
register: nm_org_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify org present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_org_present.changed == nm_org_present.changed == true
|
|
||||||
- cm_org_present_again.changed == nm_org_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: org description change (check_mode)
|
|
||||||
ucs_org: &org_change
|
|
||||||
<<: *org_present
|
|
||||||
description: 'testorg'
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_description_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: org description change (normal mode)
|
|
||||||
ucs_org: *org_change
|
|
||||||
register: nm_org_description_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: org description change again (check_mode)
|
|
||||||
ucs_org: *org_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_description_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: org description change again (normal mode)
|
|
||||||
ucs_org: *org_change
|
|
||||||
register: nm_org_description_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify org change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_org_description_change.changed == nm_org_description_change.changed == true
|
|
||||||
- cm_org_description_change_again.changed == nm_org_description_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: org absent (check_mode)
|
|
||||||
ucs_org: *org_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: org absent (normal mode)
|
|
||||||
ucs_org: *org_absent
|
|
||||||
register: nm_org_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: org absent again (check_mode)
|
|
||||||
ucs_org: *org_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_org_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: org absent again (normal mode)
|
|
||||||
ucs_org: *org_absent
|
|
||||||
register: nm_org_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify org absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_org_absent.changed == nm_org_absent.changed == true
|
|
||||||
- cm_org_absent_again.changed == nm_org_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,42 +0,0 @@
|
|||||||
# Test code for the UCS Query module
|
|
||||||
# Copyright 2019, John McDonough (@movinalot)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
<<: *login_info
|
|
||||||
|
|
||||||
# Query for Class ID
|
|
||||||
- name: Query Class ID
|
|
||||||
ucs_query:
|
|
||||||
<<: *login_info
|
|
||||||
class_ids: computeBlade
|
|
||||||
delegate_to: localhost
|
|
||||||
register: single_class
|
|
||||||
|
|
||||||
# Query for Class IDs
|
|
||||||
- name: Query Class IDs
|
|
||||||
ucs_query:
|
|
||||||
<<: *login_info
|
|
||||||
class_ids: computeBlade, fabricVlan
|
|
||||||
delegate_to: localhost
|
|
||||||
register: multiple_classes
|
|
||||||
|
|
||||||
# Query for Dn
|
|
||||||
- name: Query Dn
|
|
||||||
ucs_query:
|
|
||||||
<<: *login_info
|
|
||||||
distinguished_names: org-root
|
|
||||||
delegate_to: localhost
|
|
||||||
register: single_dn
|
|
||||||
|
|
||||||
# Query for Dn
|
|
||||||
- name: Query Dns
|
|
||||||
ucs_query:
|
|
||||||
<<: *login_info
|
|
||||||
distinguished_names: org-root, sys/rack-unit-1, sys/chassis-1/blade-2
|
|
||||||
delegate_to: localhost
|
|
||||||
register: multiple_dns
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,132 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: SAN Connectivity Policies absent
|
|
||||||
ucs_san_connectivity: &san_connectivity_absent
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: SAN Connectivity Policies present (check_mode)
|
|
||||||
ucs_san_connectivity: &san_connectivity_present
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: Cntr-FC-Boot
|
|
||||||
wwnn_pool: WWNN-Pool
|
|
||||||
vhba_list:
|
|
||||||
- name: Fabric-A
|
|
||||||
vhba_template: vHBA-Template-A
|
|
||||||
adapter_policy: Linux
|
|
||||||
- name: Fabric-B
|
|
||||||
vhba_template: vHBA-Template-B
|
|
||||||
adapter_policy: Linux
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: SAN Connectivity Policies present (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_present
|
|
||||||
register: nm_san_connectivity_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: SAN Connectivity Policies present again (check_mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: SAN Connectivity Policies present again (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_present
|
|
||||||
register: nm_san_connectivity_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify SAN Connectivity Policies present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_san_connectivity_present.changed == nm_san_connectivity_present.changed == true
|
|
||||||
- cm_san_connectivity_present_again.changed == nm_san_connectivity_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: SAN Connectivity Policies description change (check_mode)
|
|
||||||
ucs_san_connectivity: &san_connectivity_change
|
|
||||||
<<: *san_connectivity_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: SAN Connectivity Policies description change (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_change
|
|
||||||
register: nm_san_connectivity_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: SAN Connectivity Policies description again (check_mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: SAN Connectivity Policies description change again (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_change
|
|
||||||
register: nm_san_connectivity_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify SAN Connectivity Policies change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_san_connectivity_descr_change.changed == nm_san_connectivity_descr_change.changed == true
|
|
||||||
- cm_san_connectivity_descr_change_again.changed == nm_san_connectivity_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: SAN Connectivity Policies absent (check_mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: SAN Connectivity Policies absent (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_absent
|
|
||||||
register: nm_san_connectivity_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: SAN Connectivity Policies absent again (check_mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_san_connectivity_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: SAN Connectivity Policies absent again (normal mode)
|
|
||||||
ucs_san_connectivity: *san_connectivity_absent
|
|
||||||
register: nm_san_connectivity_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify SAN Connectivity Policies absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_san_connectivity_absent.changed == nm_san_connectivity_absent.changed == true
|
|
||||||
- cm_san_connectivity_absent_again.changed == nm_san_connectivity_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,147 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Service Profile Template absent
|
|
||||||
ucs_service_profile_template: &service_profile_template_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-Ctrl
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Service Profile Template present (check_mode)
|
|
||||||
ucs_service_profile_template: &service_profile_template_present
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-Ctrl
|
|
||||||
template_type: updating-template
|
|
||||||
uuid_pool: UUID-Pool
|
|
||||||
storage_profile: DEE-StgProf
|
|
||||||
lan_connectivity_policy: Cntr-FC-Boot
|
|
||||||
iqn_pool: iSCSI-Boot-A
|
|
||||||
san_connectivity_policy: Cntr-FC-Boot
|
|
||||||
boot_policy: DEE-vMedia
|
|
||||||
maintenance_policy: default
|
|
||||||
server_pool: Container-Pool
|
|
||||||
host_firmware_package: 3.1.2b
|
|
||||||
bios_policy: Docker
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Service Profile Template present (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_present
|
|
||||||
register: nm_service_profile_template_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Service Profile Template present again (check_mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Service Profile Template present again (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_present
|
|
||||||
register: nm_service_profile_template_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Service Profile Template present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_service_profile_template_present.changed == nm_service_profile_template_present.changed == true
|
|
||||||
- cm_service_profile_template_present_again.changed == nm_service_profile_template_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Service Profile Template change (check_mode)
|
|
||||||
ucs_service_profile_template: &service_profile_template_change
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-Ctrl
|
|
||||||
template_type: updating-template
|
|
||||||
uuid_pool: UUID-Pool
|
|
||||||
storage_profile: DEE-StgProf
|
|
||||||
lan_connectivity_policy: Cntr-FC-Boot
|
|
||||||
iqn_pool: iSCSI-Boot-B
|
|
||||||
san_connectivity_policy: Cntr-FC-Boot
|
|
||||||
boot_policy: DEE-vMedia
|
|
||||||
maintenance_policy: default
|
|
||||||
server_pool: Container-Pool
|
|
||||||
host_firmware_package: 3.1.2b
|
|
||||||
bios_policy: Docker
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Service Profile Template change (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_change
|
|
||||||
register: nm_service_profile_template_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Service Profile Template again (check_mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Service Profile Template change again (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_change
|
|
||||||
register: nm_service_profile_template_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Service Profile Template change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_service_profile_template_change.changed == nm_service_profile_template_change.changed == true
|
|
||||||
- cm_service_profile_template_change_again.changed == nm_service_profile_template_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Service Profile Template absent (check_mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Service Profile Template absent (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_absent
|
|
||||||
register: nm_service_profile_template_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Service Profile Template absent again (check_mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_service_profile_template_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Service Profile Template absent again (normal mode)
|
|
||||||
ucs_service_profile_template: *service_profile_template_absent
|
|
||||||
register: nm_service_profile_template_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Service Profile Template absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_service_profile_template_absent.changed == nm_service_profile_template_absent.changed == true
|
|
||||||
- cm_service_profile_template_absent_again.changed == nm_service_profile_template_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,138 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Storage Profile absent
|
|
||||||
ucs_storage_profile: &storage_profile_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-StgProf
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Storage Profile present (check_mode)
|
|
||||||
ucs_storage_profile: &storage_profile_present
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-StgProf
|
|
||||||
local_luns:
|
|
||||||
- name: Boot-LUN
|
|
||||||
size: '60'
|
|
||||||
disk_policy_name: DEE-DG
|
|
||||||
- name: Data-LUN
|
|
||||||
size: '200'
|
|
||||||
disk_policy_name: DEE-DG
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Storage Profile present (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_present
|
|
||||||
register: nm_storage_profile_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Storage Profile present again (check_mode)
|
|
||||||
ucs_storage_profile: *storage_profile_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Storage Profile present again (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_present
|
|
||||||
register: nm_storage_profile_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Storage Profile present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_storage_profile_present.changed == nm_storage_profile_present.changed == true
|
|
||||||
- cm_storage_profile_present_again.changed == nm_storage_profile_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Storage Profile change (check_mode)
|
|
||||||
ucs_storage_profile: &storage_profile_change
|
|
||||||
<<: *login_info
|
|
||||||
name: DEE-StgProf
|
|
||||||
local_luns:
|
|
||||||
- name: Boot-LUN
|
|
||||||
size: '60'
|
|
||||||
disk_policy_name: DEE-DG
|
|
||||||
- name: Data-LUN
|
|
||||||
state: absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Storage Profile change (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_change
|
|
||||||
register: nm_storage_profile_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Storage Profile again (check_mode)
|
|
||||||
ucs_storage_profile: *storage_profile_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Storage Profile change again (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_change
|
|
||||||
register: nm_storage_profile_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Storage Profile change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_storage_profile_change.changed == nm_storage_profile_change.changed == true
|
|
||||||
- cm_storage_profile_change_again.changed == nm_storage_profile_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Storage Profile absent (check_mode)
|
|
||||||
ucs_storage_profile: *storage_profile_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Storage Profile absent (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_absent
|
|
||||||
register: nm_storage_profile_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Storage Profile absent again (check_mode)
|
|
||||||
ucs_storage_profile: *storage_profile_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_storage_profile_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Storage Profile absent again (normal mode)
|
|
||||||
ucs_storage_profile: *storage_profile_absent
|
|
||||||
register: nm_storage_profile_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Storage Profile absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_storage_profile_absent.changed == nm_storage_profile_absent.changed == true
|
|
||||||
- cm_storage_profile_absent_again.changed == nm_storage_profile_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.22.251.170
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,126 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, John McDonough (@movinalot)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Timezone absent
|
|
||||||
ucs_timezone: &timezone_absent
|
|
||||||
<<: *login_info
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Timezone present (check_mode)
|
|
||||||
ucs_timezone: &timezone_present
|
|
||||||
<<: *login_info
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
description: Timezone for America/Los_Angeles
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Timezone present (normal mode)
|
|
||||||
ucs_timezone: *timezone_present
|
|
||||||
register: nm_timezone_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Timezone present again (check_mode)
|
|
||||||
ucs_timezone: *timezone_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Timezone present again (normal mode)
|
|
||||||
ucs_timezone: *timezone_present
|
|
||||||
register: nm_timezone_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Timezone present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_timezone_present.changed == nm_timezone_present.changed == true
|
|
||||||
- cm_timezone_present_again.changed == nm_timezone_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Timezone description change (check_mode)
|
|
||||||
ucs_timezone: &timezone_change
|
|
||||||
<<: *timezone_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Timezone description change (normal mode)
|
|
||||||
ucs_timezone: *timezone_change
|
|
||||||
register: nm_timezone_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Timezone description again (check_mode)
|
|
||||||
ucs_timezone: *timezone_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Timezone description change again (normal mode)
|
|
||||||
ucs_timezone: *timezone_change
|
|
||||||
register: nm_timezone_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Timezone change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_timezone_descr_change.changed == nm_timezone_descr_change.changed == true
|
|
||||||
- cm_timezone_descr_change_again.changed == nm_timezone_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Timezone absent (check_mode)
|
|
||||||
ucs_timezone: *timezone_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Timezone absent (normal mode)
|
|
||||||
ucs_timezone: *timezone_absent
|
|
||||||
register: nm_timezone_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Timezone absent again (check_mode)
|
|
||||||
ucs_timezone: *timezone_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_timezone_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Timezone absent again (normal mode)
|
|
||||||
ucs_timezone: *timezone_absent
|
|
||||||
register: nm_timezone_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Timezone absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_timezone_absent.changed == nm_timezone_absent.changed == true
|
|
||||||
- cm_timezone_absent_again.changed == nm_timezone_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,128 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2018, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: Server UUID Pools absent
|
|
||||||
ucs_uuid_pool: &uuid_pool_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: UUID-Pool
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: Server UUID Pools present (check_mode)
|
|
||||||
ucs_uuid_pool: &uuid_pool_present
|
|
||||||
<<: *login_info
|
|
||||||
name: UUID-Pool
|
|
||||||
order: sequential
|
|
||||||
first_uuid: 0000-000000000001
|
|
||||||
last_uuid: 0000-000000000078
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: Server UUID Pools present (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_present
|
|
||||||
register: nm_uuid_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: Server UUID Pools present again (check_mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: Server UUID Pools present again (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_present
|
|
||||||
register: nm_uuid_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify Server UUID Pools present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_uuid_pool_present.changed == nm_uuid_pool_present.changed == true
|
|
||||||
- cm_uuid_pool_present_again.changed == nm_uuid_pool_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: Server UUID Pools description change (check_mode)
|
|
||||||
ucs_uuid_pool: &uuid_pool_change
|
|
||||||
<<: *uuid_pool_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: Server UUID Pools description change (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_change
|
|
||||||
register: nm_uuid_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: Server UUID Pools description again (check_mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: Server UUID Pools description change again (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_change
|
|
||||||
register: nm_uuid_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify Server UUID Pools change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_uuid_pool_descr_change.changed == nm_uuid_pool_descr_change.changed == true
|
|
||||||
- cm_uuid_pool_descr_change_again.changed == nm_uuid_pool_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: Server UUID Pools absent (check_mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: Server UUID Pools absent (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_absent
|
|
||||||
register: nm_uuid_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: Server UUID Pools absent again (check_mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_uuid_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: Server UUID Pools absent again (normal mode)
|
|
||||||
ucs_uuid_pool: *uuid_pool_absent
|
|
||||||
register: nm_uuid_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify Server UUID Pools absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_uuid_pool_absent.changed == nm_uuid_pool_absent.changed == true
|
|
||||||
- cm_uuid_pool_absent_again.changed == nm_uuid_pool_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,128 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: vHBA templates absent
|
|
||||||
ucs_vhba_template: &vhba_templates_absent
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: vHBA-A
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: vHBA templates present (check_mode)
|
|
||||||
ucs_vhba_template: &vhba_templates_present
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: vHBA-A
|
|
||||||
fabric: A
|
|
||||||
vsan: VSAN-A
|
|
||||||
wwpn_pool: WWPN-Pool-A
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: vHBA templates present (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_present
|
|
||||||
register: nm_vhba_templates_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: vHBA templates present again (check_mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: vHBA templates present again (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_present
|
|
||||||
register: nm_vhba_templates_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify vHBA templates present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vhba_templates_present.changed == nm_vhba_templates_present.changed == true
|
|
||||||
- cm_vhba_templates_present_again.changed == nm_vhba_templates_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: vHBA templates description change (check_mode)
|
|
||||||
ucs_vhba_template: &vhba_templates_change
|
|
||||||
<<: *vhba_templates_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: vHBA templates description change (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_change
|
|
||||||
register: nm_vhba_templates_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: vHBA templates description again (check_mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: vHBA templates description change again (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_change
|
|
||||||
register: nm_vhba_templates_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify vHBA templates change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vhba_templates_descr_change.changed == nm_vhba_templates_descr_change.changed == true
|
|
||||||
- cm_vhba_templates_descr_change_again.changed == nm_vhba_templates_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: vHBA templates absent (check_mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: vHBA templates absent (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_absent
|
|
||||||
register: nm_vhba_templates_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: vHBA templates absent again (check_mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vhba_templates_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: vHBA templates absent again (normal mode)
|
|
||||||
ucs_vhba_template: *vhba_templates_absent
|
|
||||||
register: nm_vhba_templates_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify vHBA templates absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vhba_templates_absent.changed == nm_vhba_templates_absent.changed == true
|
|
||||||
- cm_vhba_templates_absent_again.changed == nm_vhba_templates_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,112 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: VLANs absent
|
|
||||||
ucs_vlans: &vlans_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: vlan2
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: VLANs present (check_mode)
|
|
||||||
ucs_vlans: &vlans_present
|
|
||||||
<<: *login_info
|
|
||||||
name: vlan2
|
|
||||||
id: '2'
|
|
||||||
native: 'yes'
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_present
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: VLANs present (normal mode)
|
|
||||||
ucs_vlans: *vlans_present
|
|
||||||
register: nm_vlans_present
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: VLANs present again (check_mode)
|
|
||||||
ucs_vlans: *vlans_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_present_again
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: VLANs present again (normal mode)
|
|
||||||
ucs_vlans: *vlans_present
|
|
||||||
register: nm_vlans_present_again
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify VLANs present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vlans_present.changed == nm_vlans_present.changed == true
|
|
||||||
- cm_vlans_present_again.changed == nm_vlans_present_again.changed == false
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: VLANs VLAN change (check_mode)
|
|
||||||
ucs_vlans: &vlans_change
|
|
||||||
<<: *vlans_present
|
|
||||||
id: '20'
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_vlan_change
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: VLANs VLAN change (normal mode)
|
|
||||||
ucs_vlans: *vlans_change
|
|
||||||
register: nm_vlans_vlan_change
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: VLANs VLAN change again (check_mode)
|
|
||||||
ucs_vlans: *vlans_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_vlan_change_again
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: VLANs VLAN change again (normal mode)
|
|
||||||
ucs_vlans: *vlans_change
|
|
||||||
register: nm_vlans_vlan_change_again
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify VLANs change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vlans_vlan_change.changed == nm_vlans_vlan_change.changed == true
|
|
||||||
- cm_vlans_vlan_change_again.changed == nm_vlans_vlan_change_again.changed == false
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: VLANs absent (check_mode)
|
|
||||||
ucs_vlans: *vlans_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_absent
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: VLANs absent (normal mode)
|
|
||||||
ucs_vlans: *vlans_absent
|
|
||||||
register: nm_vlans_absent
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: VLANs absent again (check_mode)
|
|
||||||
ucs_vlans: *vlans_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vlans_absent_again
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: VLANs absent again (normal mode)
|
|
||||||
ucs_vlans: *vlans_absent
|
|
||||||
register: nm_vlans_absent_again
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify VLANs absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vlans_absent.changed == nm_vlans_absent.changed == true
|
|
||||||
- cm_vlans_absent_again.changed == nm_vlans_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,246 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
vars:
|
|
||||||
login_info: &login_info
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: vNIC template absent
|
|
||||||
ucs_vnic_template: &vnic_templates_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-A-B
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: vNIC primary template absent
|
|
||||||
ucs_vnic_template: &vnic_primary_templates_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-A
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: vNIC secondary template absent
|
|
||||||
ucs_vnic_template: &vnic_secondary_templates_absent
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-B
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: vNIC template present (check_mode)
|
|
||||||
ucs_vnic_template: &vnic_templates_present
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-A-B
|
|
||||||
fabric: A-B
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
- name: 10
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_present
|
|
||||||
|
|
||||||
- name: vNIC primary template present (check_mode)
|
|
||||||
ucs_vnic_template: &vnic_primary_templates_present
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-A
|
|
||||||
fabric: A
|
|
||||||
redundancy_type: primary
|
|
||||||
peer_redundancy_templ: vNIC-B
|
|
||||||
template_type: updating-template
|
|
||||||
mtu: '9000'
|
|
||||||
mac_pool: MAC-Pool-A
|
|
||||||
network_control_policy: Enable-CDP-LLDP
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
- name: finance
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_primary_templates_present
|
|
||||||
|
|
||||||
- name: vNIC secondary template present (check_mode)
|
|
||||||
ucs_vnic_template: &vnic_secondary_templates_present
|
|
||||||
<<: *login_info
|
|
||||||
name: vNIC-B
|
|
||||||
fabric: B
|
|
||||||
redundancy_type: secondary
|
|
||||||
peer_redundancy_templ: vNIC-A
|
|
||||||
mac_pool: MAC-Pool-B
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_secondary_templates_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: vNIC template present (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_present
|
|
||||||
register: nm_vnic_templates_present
|
|
||||||
|
|
||||||
- name: vNIC primary template present (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_present
|
|
||||||
register: nm_vnic_primary_templates_present
|
|
||||||
|
|
||||||
- name: vNIC secondary template present (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_present
|
|
||||||
register: nm_vnic_secondary_templates_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: vNIC template present again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_present_again
|
|
||||||
|
|
||||||
- name: vNIC primary template present again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_primary_templates_present_again
|
|
||||||
|
|
||||||
- name: vNIC secondary template present again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_secondary_templates_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: vNIC template present again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_present
|
|
||||||
register: nm_vnic_templates_present_again
|
|
||||||
|
|
||||||
- name: vNIC primary template present again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_present
|
|
||||||
register: nm_vnic_primary_templates_present_again
|
|
||||||
|
|
||||||
- name: vNIC secondary template present again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_present
|
|
||||||
register: nm_vnic_secondary_templates_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify vNIC template present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vnic_templates_present.changed == nm_vnic_templates_present.changed == true
|
|
||||||
- cm_vnic_templates_present_again.changed == nm_vnic_templates_present_again.changed == false
|
|
||||||
- cm_vnic_primary_templates_present.changed == nm_vnic_primary_templates_present.changed == true
|
|
||||||
- cm_vnic_primary_templates_present_again.changed == nm_vnic_primary_templates_present_again.changed == false
|
|
||||||
- cm_vnic_secondary_templates_present.changed == nm_vnic_secondary_templates_present.changed == true
|
|
||||||
- cm_vnic_secondary_templates_present_again.changed == nm_vnic_secondary_templates_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: vNIC template change (check_mode)
|
|
||||||
ucs_vnic_template: &vnic_templates_change
|
|
||||||
<<: *vnic_templates_present
|
|
||||||
vlans_list:
|
|
||||||
- name: default
|
|
||||||
native: 'yes'
|
|
||||||
- name: 10
|
|
||||||
state: absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: vNIC template change (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_change
|
|
||||||
register: nm_vnic_templates_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: vNIC template change again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: vNIC template change again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_change
|
|
||||||
register: nm_vnic_templates_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify vNIC template change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vnic_templates_change.changed == nm_vnic_templates_change.changed == true
|
|
||||||
- cm_vnic_templates_change_again.changed == nm_vnic_templates_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: vNIC template absent (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_absent
|
|
||||||
|
|
||||||
- name: vNIC primary template absent (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_primary_templates_absent
|
|
||||||
|
|
||||||
- name: vNIC secondary template absent (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_secondary_templates_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: vNIC template absent (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_absent
|
|
||||||
register: nm_vnic_templates_absent
|
|
||||||
|
|
||||||
- name: vNIC primary template absent (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_absent
|
|
||||||
register: nm_vnic_primary_templates_absent
|
|
||||||
|
|
||||||
- name: vNIC secondary template absent (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_absent
|
|
||||||
register: nm_vnic_secondary_templates_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: vNIC template absent again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_templates_absent_again
|
|
||||||
|
|
||||||
- name: vNIC primary template absent again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_primary_templates_absent_again
|
|
||||||
|
|
||||||
- name: vNIC secondary template absent again (check_mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vnic_secondary_templates_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: vNIC template absent again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_templates_absent
|
|
||||||
register: nm_vnic_templates_absent_again
|
|
||||||
|
|
||||||
- name: vNIC primary template absent again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_primary_templates_absent
|
|
||||||
register: nm_vnic_primary_templates_absent_again
|
|
||||||
|
|
||||||
- name: vNIC secondary template absent again (normal mode)
|
|
||||||
ucs_vnic_template: *vnic_secondary_templates_absent
|
|
||||||
register: nm_vnic_secondary_templates_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify vNIC template absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vnic_templates_absent.changed == nm_vnic_templates_absent.changed == true
|
|
||||||
- cm_vnic_templates_absent_again.changed == nm_vnic_templates_absent_again.changed == false
|
|
||||||
- cm_vnic_primary_templates_absent.changed == nm_vnic_primary_templates_absent.changed == true
|
|
||||||
- cm_vnic_primary_templates_absent_again.changed == nm_vnic_primary_templates_absent_again.changed == false
|
|
||||||
- cm_vnic_secondary_templates_absent.changed == nm_vnic_secondary_templates_absent.changed == true
|
|
||||||
- cm_vnic_secondary_templates_absent_again.changed == nm_vnic_secondary_templates_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,127 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: VSANs absent
|
|
||||||
ucs_vsans: &vsans_absent
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: vsan110
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: VSANs present (check_mode)
|
|
||||||
ucs_vsans: &vsans_present
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: vsan110
|
|
||||||
vsan_id: '110'
|
|
||||||
vlan_id: '110'
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: VSANs present (normal mode)
|
|
||||||
ucs_vsans: *vsans_present
|
|
||||||
register: nm_vsans_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: VSANs present again (check_mode)
|
|
||||||
ucs_vsans: *vsans_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: VSANs present again (normal mode)
|
|
||||||
ucs_vsans: *vsans_present
|
|
||||||
register: nm_vsans_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify VSANs present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vsans_present.changed == nm_vsans_present.changed == true
|
|
||||||
- cm_vsans_present_again.changed == nm_vsans_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: VSANs VLAN change (check_mode)
|
|
||||||
ucs_vsans: &vsans_change
|
|
||||||
<<: *vsans_present
|
|
||||||
vlan_id: '10'
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_vlan_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: VSANs VLAN change (normal mode)
|
|
||||||
ucs_vsans: *vsans_change
|
|
||||||
register: nm_vsans_vlan_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: VSANs VLAN change again (check_mode)
|
|
||||||
ucs_vsans: *vsans_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_vlan_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: VSANs VLAN change again (normal mode)
|
|
||||||
ucs_vsans: *vsans_change
|
|
||||||
register: nm_vsans_vlan_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify VSANs change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vsans_vlan_change.changed == nm_vsans_vlan_change.changed == true
|
|
||||||
- cm_vsans_vlan_change_again.changed == nm_vsans_vlan_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: VSANs absent (check_mode)
|
|
||||||
ucs_vsans: *vsans_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: VSANs absent (normal mode)
|
|
||||||
ucs_vsans: *vsans_absent
|
|
||||||
register: nm_vsans_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: VSANs absent again (check_mode)
|
|
||||||
ucs_vsans: *vsans_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_vsans_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: VSANs absent again (normal mode)
|
|
||||||
ucs_vsans: *vsans_absent
|
|
||||||
register: nm_vsans_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify VSANs absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_vsans_absent.changed == nm_vsans_absent.changed == true
|
|
||||||
- cm_vsans_absent_again.changed == nm_vsans_absent_again.changed == false
|
|
@ -1,7 +0,0 @@
|
|||||||
# Not enabled, but can be used with the UCS Platform Emulator or UCS hardware.
|
|
||||||
# Example integration_config.yml:
|
|
||||||
# ---
|
|
||||||
# ucs_hostname: 172.16.143.136
|
|
||||||
# ucs_username: admin
|
|
||||||
# ucs_password: password
|
|
||||||
unsupported
|
|
@ -1,129 +0,0 @@
|
|||||||
# Test code for the UCS modules
|
|
||||||
# Copyright 2017, David Soper (@dsoper2)
|
|
||||||
|
|
||||||
- name: Test that we have a UCS host, UCS username, and UCS password
|
|
||||||
fail:
|
|
||||||
msg: 'Please define the following variables: ucs_hostname, ucs_username and ucs_password.'
|
|
||||||
when: ucs_hostname is not defined or ucs_username is not defined or ucs_password is not defined
|
|
||||||
|
|
||||||
|
|
||||||
# Setup (clean environment)
|
|
||||||
- name: WWNN/WWPN Pools absent
|
|
||||||
ucs_wwn_pool: &wwn_pool_absent
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: WWPN-Pool-A
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test present (check_mode)
|
|
||||||
- name: WWNN/WWPN Pools present (check_mode)
|
|
||||||
ucs_wwn_pool: &wwn_pool_present
|
|
||||||
hostname: "{{ ucs_hostname }}"
|
|
||||||
username: "{{ ucs_username }}"
|
|
||||||
password: "{{ ucs_password }}"
|
|
||||||
name: WWPN-Pool-A
|
|
||||||
purpose: port
|
|
||||||
order: sequential
|
|
||||||
first_addr: 20:00:00:25:B5:48:0A:00
|
|
||||||
last_addr: 20:00:00:25:B5:48:0A:0F
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Present (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools present (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_present
|
|
||||||
register: nm_wwn_pool_present
|
|
||||||
|
|
||||||
|
|
||||||
# Test present again (idempotent)
|
|
||||||
- name: WWNN/WWPN Pools present again (check_mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_present
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Present again (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools present again (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_present
|
|
||||||
register: nm_wwn_pool_present_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy present
|
|
||||||
- name: Verify WWNN/WWPN Pools present results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_wwn_pool_present.changed == nm_wwn_pool_present.changed == true
|
|
||||||
- cm_wwn_pool_present_again.changed == nm_wwn_pool_present_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test change (check_mode)
|
|
||||||
- name: WWNN/WWPN Pools description change (check_mode)
|
|
||||||
ucs_wwn_pool: &wwn_pool_change
|
|
||||||
<<: *wwn_pool_present
|
|
||||||
descr: Testing Ansible
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Change (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools description change (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_change
|
|
||||||
register: nm_wwn_pool_descr_change
|
|
||||||
|
|
||||||
|
|
||||||
# Test change again (idempotent)
|
|
||||||
- name: WWNN/WWPN Pools description again (check_mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_change
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Change again (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools description change again (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_change
|
|
||||||
register: nm_wwn_pool_descr_change_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy change
|
|
||||||
- name: Verify WWNN/WWPN Pools change results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_wwn_pool_descr_change.changed == nm_wwn_pool_descr_change.changed == true
|
|
||||||
- cm_wwn_pool_descr_change_again.changed == nm_wwn_pool_descr_change_again.changed == false
|
|
||||||
|
|
||||||
|
|
||||||
# Teardown (clean environment)
|
|
||||||
- name: WWNN/WWPN Pools absent (check_mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Absent (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools absent (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_absent
|
|
||||||
register: nm_wwn_pool_absent
|
|
||||||
|
|
||||||
|
|
||||||
# Test absent again (idempotent)
|
|
||||||
- name: WWNN/WWPN Pools absent again (check_mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_absent
|
|
||||||
check_mode: yes
|
|
||||||
register: cm_wwn_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Absent again (normal mode)
|
|
||||||
- name: WWNN/WWPN Pools absent again (normal mode)
|
|
||||||
ucs_wwn_pool: *wwn_pool_absent
|
|
||||||
register: nm_wwn_pool_absent_again
|
|
||||||
|
|
||||||
|
|
||||||
# Verfiy absent
|
|
||||||
- name: Verify WWNN/WWPN Pools absent results
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- cm_wwn_pool_absent.changed == nm_wwn_pool_absent.changed == true
|
|
||||||
- cm_wwn_pool_absent_again.changed == nm_wwn_pool_absent_again.changed == false
|
|
Loading…
Reference in New Issue