
Collections are new. openstacksdk as of now doesn't support python2. We shouldn't pretend to support python2 either. If you're using ansible new enough to use collections, you can use python3. This release of openstacksdk only supports 3.6 and onwards, so set that as our min. Change-Id: I34d544ce48f25bffde8e6e0cf82cdf9a85e681c3
237 lines
7.4 KiB
Python
237 lines
7.4 KiB
Python
#!/usr/bin/python
|
|
# Copyright (c) 2016 Hewlett-Packard Enterprise
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
|
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
'status': ['preview'],
|
|
'supported_by': 'community'}
|
|
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
module: os_recordset
|
|
short_description: Manage OpenStack DNS recordsets
|
|
author: "Ricardo Carrillo Cruz (@rcarrillocruz)"
|
|
description:
|
|
- Manage OpenStack DNS recordsets. Recordsets can be created, deleted or
|
|
updated. Only the I(records), I(description), and I(ttl) values
|
|
can be updated.
|
|
options:
|
|
zone:
|
|
description:
|
|
- Zone managing the recordset
|
|
required: true
|
|
name:
|
|
description:
|
|
- Name of the recordset
|
|
required: true
|
|
recordset_type:
|
|
description:
|
|
- Recordset type
|
|
required: true
|
|
records:
|
|
description:
|
|
- List of recordset definitions
|
|
required: true
|
|
description:
|
|
description:
|
|
- Description of the recordset
|
|
ttl:
|
|
description:
|
|
- TTL (Time To Live) value in seconds
|
|
state:
|
|
description:
|
|
- Should the resource be present or absent.
|
|
choices: [present, absent]
|
|
default: present
|
|
availability_zone:
|
|
description:
|
|
- Ignored. Present for backwards compatibility
|
|
requirements:
|
|
- "python >= 3.6""
|
|
- "openstacksdk"
|
|
|
|
extends_documentation_fragment:
|
|
- openstack.cloud.openstack
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# Create a recordset named "www.example.net."
|
|
- os_recordset:
|
|
cloud: mycloud
|
|
state: present
|
|
zone: example.net.
|
|
name: www
|
|
recordset_type: primary
|
|
records: ['10.1.1.1']
|
|
description: test recordset
|
|
ttl: 3600
|
|
|
|
# Update the TTL on existing "www.example.net." recordset
|
|
- os_recordset:
|
|
cloud: mycloud
|
|
state: present
|
|
zone: example.net.
|
|
name: www
|
|
ttl: 7200
|
|
|
|
# Delete recordset named "www.example.net."
|
|
- os_recordset:
|
|
cloud: mycloud
|
|
state: absent
|
|
zone: example.net.
|
|
name: www
|
|
'''
|
|
|
|
RETURN = '''
|
|
recordset:
|
|
description: Dictionary describing the recordset.
|
|
returned: On success when I(state) is 'present'.
|
|
type: complex
|
|
contains:
|
|
id:
|
|
description: Unique recordset ID
|
|
type: str
|
|
sample: "c1c530a3-3619-46f3-b0f6-236927b2618c"
|
|
name:
|
|
description: Recordset name
|
|
type: str
|
|
sample: "www.example.net."
|
|
zone_id:
|
|
description: Zone id
|
|
type: str
|
|
sample: 9508e177-41d8-434e-962c-6fe6ca880af7
|
|
type:
|
|
description: Recordset type
|
|
type: str
|
|
sample: "A"
|
|
description:
|
|
description: Recordset description
|
|
type: str
|
|
sample: "Test description"
|
|
ttl:
|
|
description: Zone TTL value
|
|
type: int
|
|
sample: 3600
|
|
records:
|
|
description: Recordset records
|
|
type: list
|
|
sample: ['10.0.0.1']
|
|
'''
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import (openstack_full_argument_spec,
|
|
openstack_module_kwargs,
|
|
openstack_cloud_from_module)
|
|
|
|
|
|
def _system_state_change(state, records, description, ttl, zone, recordset):
|
|
if state == 'present':
|
|
if recordset is None:
|
|
return True
|
|
if records is not None and recordset['records'] != records:
|
|
return True
|
|
if description is not None and recordset['description'] != description:
|
|
return True
|
|
if ttl is not None and recordset['ttl'] != ttl:
|
|
return True
|
|
if state == 'absent' and recordset:
|
|
return True
|
|
return False
|
|
|
|
|
|
def main():
|
|
argument_spec = openstack_full_argument_spec(
|
|
zone=dict(required=True),
|
|
name=dict(required=True),
|
|
recordset_type=dict(required=False),
|
|
records=dict(required=False, type='list'),
|
|
description=dict(required=False, default=None),
|
|
ttl=dict(required=False, default=None, type='int'),
|
|
state=dict(default='present', choices=['absent', 'present']),
|
|
)
|
|
|
|
module_kwargs = openstack_module_kwargs()
|
|
module = AnsibleModule(argument_spec,
|
|
required_if=[
|
|
('state', 'present',
|
|
['recordset_type', 'records'])],
|
|
supports_check_mode=True,
|
|
**module_kwargs)
|
|
|
|
zone = module.params.get('zone')
|
|
name = module.params.get('name')
|
|
state = module.params.get('state')
|
|
|
|
sdk, cloud = openstack_cloud_from_module(module)
|
|
try:
|
|
recordset_type = module.params.get('recordset_type')
|
|
recordset_filter = {'type': recordset_type}
|
|
|
|
recordsets = cloud.search_recordsets(zone, name_or_id=name, filters=recordset_filter)
|
|
|
|
if len(recordsets) == 1:
|
|
recordset = recordsets[0]
|
|
try:
|
|
recordset_id = recordset['id']
|
|
except KeyError as e:
|
|
module.fail_json(msg=str(e))
|
|
else:
|
|
# recordsets is filtered by type and should never be more than 1 return
|
|
recordset = None
|
|
|
|
if state == 'present':
|
|
records = module.params.get('records')
|
|
description = module.params.get('description')
|
|
ttl = module.params.get('ttl')
|
|
|
|
if module.check_mode:
|
|
module.exit_json(changed=_system_state_change(state,
|
|
records, description,
|
|
ttl, zone,
|
|
recordset))
|
|
|
|
if recordset is None:
|
|
recordset = cloud.create_recordset(
|
|
zone=zone, name=name, recordset_type=recordset_type,
|
|
records=records, description=description, ttl=ttl)
|
|
changed = True
|
|
else:
|
|
if records is None:
|
|
records = []
|
|
|
|
pre_update_recordset = recordset
|
|
changed = _system_state_change(state, records,
|
|
description, ttl,
|
|
zone, pre_update_recordset)
|
|
if changed:
|
|
zone = cloud.update_recordset(
|
|
zone, recordset_id,
|
|
records=records,
|
|
description=description,
|
|
ttl=ttl)
|
|
|
|
module.exit_json(changed=changed, recordset=recordset)
|
|
|
|
elif state == 'absent':
|
|
if module.check_mode:
|
|
module.exit_json(changed=_system_state_change(state,
|
|
None, None,
|
|
None,
|
|
None, recordset))
|
|
|
|
if recordset is None:
|
|
changed = False
|
|
else:
|
|
cloud.delete_recordset(zone, recordset_id)
|
|
changed = True
|
|
module.exit_json(changed=changed)
|
|
|
|
except sdk.exceptions.OpenStackCloudException as e:
|
|
module.fail_json(msg=str(e))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|