mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 01:18:58 +00:00
Merge pull request #27548 from lomeroe/add_infoblox
Add infoblox DNS mgmt
This commit is contained in:
commit
5fed31b823
518
salt/modules/infoblox.py
Normal file
518
salt/modules/infoblox.py
Normal file
@ -0,0 +1,518 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Module for managing Infoblox
|
||||
|
||||
Will look for pillar data infoblox:server, infoblox:user, infoblox:password if not passed to functions
|
||||
|
||||
.. versionadded:: Boron
|
||||
|
||||
:depends:
|
||||
- requests
|
||||
'''
|
||||
from __future__ import absolute_import
|
||||
|
||||
# Import salt libs
|
||||
from salt.exceptions import CommandExecutionError
|
||||
from salt.exceptions import SaltInvocationError
|
||||
import logging
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
import json
|
||||
import requests
|
||||
HAS_IMPORTS = True
|
||||
except ImportError:
|
||||
HAS_IMPORTS = False
|
||||
|
||||
|
||||
def __virtual__():
|
||||
if HAS_IMPORTS:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _conn_info_check(infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None):
|
||||
'''
|
||||
get infoblox stuff from pillar if not passed
|
||||
'''
|
||||
|
||||
if infoblox_server is None:
|
||||
infoblox_server = __salt__['pillar.get']('infoblox:server', None)
|
||||
if infoblox_user is None:
|
||||
infoblox_user = __salt__['pillar.get']('infoblox:user', None)
|
||||
log.debug('Infoblox username is "{0}"'.format(infoblox_user))
|
||||
if infoblox_password is None:
|
||||
infoblox_password = __salt__['pillar.get']('infoblox:password', None)
|
||||
|
||||
return infoblox_server, infoblox_user, infoblox_password
|
||||
|
||||
|
||||
def _process_return_data(retData):
|
||||
'''
|
||||
generic return processing
|
||||
'''
|
||||
if retData.status_code == 200:
|
||||
if retData.json():
|
||||
return retData
|
||||
else:
|
||||
log.debug('no data returned from infoblox')
|
||||
return None
|
||||
else:
|
||||
msg = 'Unsuccessful error code {0} returned'.format(retData.status_code)
|
||||
log.error(msg)
|
||||
return None
|
||||
|
||||
|
||||
def delete_record(name,
|
||||
dns_view,
|
||||
record_type,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
delete a record
|
||||
|
||||
name
|
||||
name of the record
|
||||
|
||||
dns_view
|
||||
the DNS view to remove the record from
|
||||
|
||||
record_type
|
||||
the record type (a, cname, host, etc)
|
||||
|
||||
infoblox_server
|
||||
the infoblox server hostname (can also use the infoblox:server pillar)
|
||||
|
||||
infoblox_user
|
||||
the infoblox user to connect with (can also use the infoblox:user pillar)
|
||||
|
||||
infoblox_password
|
||||
the infoblox user's password (can also use the infolblox:password pillar)
|
||||
|
||||
infoblox_api_version
|
||||
the infoblox api verison to use
|
||||
|
||||
sslVerify
|
||||
should ssl verification be done on the connection to the Infoblox REST API
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt my-minion infoblox.delete_record some.dns.record MyInfobloxView A sslVerify=False
|
||||
'''
|
||||
infoblox_server, infoblox_user, infoblox_password = _conn_info_check(infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password)
|
||||
if infoblox_server is None and infoblox_user is None and infoblox_password is None:
|
||||
_throw_no_creds()
|
||||
return None
|
||||
|
||||
currentRecords = get_record(name,
|
||||
record_type,
|
||||
infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password,
|
||||
dns_view,
|
||||
infoblox_api_version,
|
||||
sslVerify)
|
||||
if currentRecords:
|
||||
for currentRecord in currentRecords:
|
||||
url = 'https://{0}/wapi/{1}/{2}'.format(infoblox_server,
|
||||
infoblox_api_version,
|
||||
currentRecord['Record ID'])
|
||||
ret = requests.delete(url,
|
||||
auth=(infoblox_user, infoblox_password),
|
||||
headers={'Content-Type': 'application/json'},
|
||||
verify=sslVerify)
|
||||
if ret.status_code == 200:
|
||||
return True
|
||||
else:
|
||||
msg = 'Unsuccessful error code {0} returned -- full json dump {1}'.format(ret.status_code, ret.json())
|
||||
raise CommandExecutionError(msg)
|
||||
return False
|
||||
|
||||
|
||||
def update_record(name,
|
||||
value,
|
||||
dns_view,
|
||||
record_type,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
update an entry to an infoblox dns view
|
||||
|
||||
name
|
||||
the dns name
|
||||
|
||||
value
|
||||
the value for the record
|
||||
|
||||
record_type
|
||||
the record type (a, cname, etc)
|
||||
|
||||
dns_view
|
||||
the DNS view to add the record to
|
||||
|
||||
infoblox_server
|
||||
the infoblox server hostname (can also use the infoblox:server pillar)
|
||||
|
||||
infoblox_user
|
||||
the infoblox user to connect with (can also use the infoblox:user pillar)
|
||||
|
||||
infoblox_password
|
||||
the infoblox user's password (can also use the infolblox:password pillar)
|
||||
|
||||
infoblox_api_version
|
||||
the infoblox api verison to use
|
||||
|
||||
sslVerify
|
||||
should ssl verification be done on the connection to the Infoblox REST API
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' infoblox.update_record alias.network.name canonical.network.name MyInfobloxView cname sslVerify=False
|
||||
'''
|
||||
|
||||
infoblox_server, infoblox_user, infoblox_password = _conn_info_check(infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password)
|
||||
if infoblox_server is None and infoblox_user is None and infoblox_password is None:
|
||||
_throw_no_creds()
|
||||
return None
|
||||
|
||||
currentRecords = get_record(name,
|
||||
record_type,
|
||||
infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password,
|
||||
dns_view,
|
||||
infoblox_api_version,
|
||||
sslVerify)
|
||||
if currentRecords:
|
||||
for currentRecord in currentRecords:
|
||||
url = 'https://{0}/wapi/{1}/{2}'.format(
|
||||
infoblox_server,
|
||||
infoblox_api_version,
|
||||
currentRecord['Record ID'])
|
||||
data = None
|
||||
if record_type == 'cname':
|
||||
data = json.dumps({'canonical': value})
|
||||
elif record_type == 'a':
|
||||
data = {'ipv4addrs': []}
|
||||
for i in value:
|
||||
data['ipv4addrs'].append({'ipv4addr': i})
|
||||
data = json.dumps(data)
|
||||
ret = requests.put(url,
|
||||
data,
|
||||
auth=(infoblox_user, infoblox_password),
|
||||
headers={'Content-Type': 'application/json'},
|
||||
verify=sslVerify)
|
||||
if ret.status_code == 200:
|
||||
return True
|
||||
else:
|
||||
msg = 'Unsuccessful status code {0} returned.'.format(ret.status_code)
|
||||
raise CommandExecutionError(msg)
|
||||
else:
|
||||
msg = 'Record {0} of type {1} was not found'.format(name, record_type)
|
||||
log.error(msg)
|
||||
return False
|
||||
|
||||
|
||||
def add_record(name,
|
||||
value,
|
||||
record_type,
|
||||
dns_view,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
add a record to an infoblox dns view
|
||||
|
||||
name
|
||||
the record name
|
||||
|
||||
value
|
||||
the value for the entry
|
||||
can make use of infoblox functions for next available IP, like 'func:nextavailableip:10.1.0.0/24'
|
||||
|
||||
record_type
|
||||
the record type (cname, a, host, etc)
|
||||
|
||||
dns_view
|
||||
the DNS view to add the record to
|
||||
|
||||
infoblox_server
|
||||
the infoblox server hostname (can also use the infoblox:server pillar)
|
||||
|
||||
infoblox_user
|
||||
the infoblox user to connect with (can also use the infoblox:user pillar)
|
||||
|
||||
infoblox_password
|
||||
the infoblox user's password (can also use the infolblox:password pillar)
|
||||
|
||||
infoblox_api_version
|
||||
the infoblox api verison to use
|
||||
|
||||
sslVerify
|
||||
should ssl verification be done on the connection to the Infoblox REST API
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt 'myminion' infoblox.add_record alias.network.name canonical.network.name MyView
|
||||
'''
|
||||
|
||||
infoblox_server, infoblox_user, infoblox_password = _conn_info_check(infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password)
|
||||
if infoblox_server is None and infoblox_user is None and infoblox_password is None:
|
||||
_throw_no_creds()
|
||||
return None
|
||||
|
||||
record_type = record_type.lower()
|
||||
|
||||
data = None
|
||||
url = None
|
||||
if record_type == 'cname':
|
||||
data = json.dumps({'name': name, 'canonical': value, 'view': dns_view})
|
||||
if record_type == 'host' or record_type == 'a':
|
||||
data = json.dumps({'name': name, 'ipv4addrs': [{'ipv4addr': value}], 'view': dns_view})
|
||||
#if record_type == 'alias':
|
||||
# data = json.dumps({'name': name, 'aliases': [value], 'view': dns_view})
|
||||
# record_type = 'host'
|
||||
# tRec = get_record(name,
|
||||
# record_type,
|
||||
# infoblox_server,
|
||||
# infoblox_user,
|
||||
# infoblox_password,
|
||||
# dns_view,
|
||||
# infoblox_api_version,
|
||||
# sslVerify)
|
||||
# if not tRec:
|
||||
# log.error('A host record matching {0} was not found to add the alias to.'.format(name))
|
||||
# return False
|
||||
# else:
|
||||
# for _rec in tRec:
|
||||
# url = 'https://{0}/wapi/{1}/{2}'.format(
|
||||
# infoblox_server,
|
||||
# infoblox_api_version,
|
||||
# _rec['Record ID'])
|
||||
|
||||
url = 'https://{0}/wapi/{1}/record:{2}'.format(infoblox_server,
|
||||
infoblox_api_version,
|
||||
record_type)
|
||||
|
||||
ret = requests.post(url,
|
||||
data,
|
||||
auth=(infoblox_user, infoblox_password),
|
||||
headers={'Content-Type': 'application/json'},
|
||||
verify=sslVerify)
|
||||
if ret.status_code == 201:
|
||||
return True
|
||||
else:
|
||||
msg = 'Unsuccessful error code {0} returned -- full json dump {1}'.format(ret.status_code, ret.json())
|
||||
raise CommandExecutionError(msg)
|
||||
|
||||
|
||||
def _throw_no_creds():
|
||||
'''
|
||||
helper function to log no credentials found error
|
||||
'''
|
||||
msg = 'An infoblox server, username, and password must be specified or configured via pillar'
|
||||
raise SaltInvocationError(msg)
|
||||
|
||||
|
||||
def get_network(network_name,
|
||||
network_view=None,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
get a network from infoblox
|
||||
|
||||
network_name
|
||||
The name of the network in IPAM
|
||||
|
||||
network_view
|
||||
The name of the network view the network belongs to
|
||||
|
||||
infoblox_server
|
||||
the infoblox server hostname (can also use the infoblox:server pillar)
|
||||
|
||||
infoblox_user
|
||||
the infoblox user to connect with (can also use the infoblox:user pillar)
|
||||
|
||||
infoblox_password
|
||||
the infoblox user's password (can also use the infolblox:password pillar)
|
||||
|
||||
infoblox_api_version
|
||||
the infoblox api verison to use
|
||||
|
||||
sslVerify
|
||||
should ssl verification be done on the connection to the Infoblox REST API
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt myminion infoblox.get_network '10.0.0.0/8'
|
||||
'''
|
||||
|
||||
records = []
|
||||
infoblox_server, infoblox_user, infoblox_password = _conn_info_check(infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password)
|
||||
if infoblox_server is None and infoblox_user is None and infoblox_password is None:
|
||||
_throw_no_creds()
|
||||
return None
|
||||
|
||||
url = 'https://{0}/wapi/{1}/network?network={2}{3}'.format(
|
||||
infoblox_server,
|
||||
infoblox_api_version,
|
||||
network_name,
|
||||
('' if network_view is None else '&network_view=' + network_view))
|
||||
log.debug('Requst url is "{0}"'.format(url))
|
||||
ret = _process_return_data(requests.get(url,
|
||||
auth=(infoblox_user, infoblox_password),
|
||||
verify=sslVerify))
|
||||
if ret:
|
||||
for entry in ret.json():
|
||||
log.debug('Infoblox record returned: {0}'.format(entry))
|
||||
tEntry = {}
|
||||
data = _parse_record_data(entry)
|
||||
for key in data.keys():
|
||||
tEntry[key] = data[key]
|
||||
records.append(tEntry)
|
||||
return records
|
||||
else:
|
||||
return False
|
||||
return False
|
||||
|
||||
|
||||
def get_record(record_name,
|
||||
record_type='host',
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
dns_view=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
get a record from infoblox
|
||||
|
||||
record_name
|
||||
name of the record to search for
|
||||
|
||||
record_type
|
||||
type of reacord to search for (host, cname, a, etc...defaults to host)
|
||||
|
||||
infoblox_server
|
||||
the infoblox server hostname (can also use the infoblox:server pillar)
|
||||
|
||||
infoblox_user
|
||||
the infoblox user to connect with (can also use the infoblox:user pillar)
|
||||
|
||||
infoblox_password
|
||||
the infoblox user's password (can also use the infolblox:password pillar)
|
||||
|
||||
dns_view
|
||||
the infoblox DNS view to search, if not specified all views are searched
|
||||
|
||||
infoblox_api_version
|
||||
the infoblox api verison to use
|
||||
|
||||
sslVerify
|
||||
should ssl verification be done on the connection to the Infoblox REST API
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt myminion infoblox.get_record some.host.com A sslVerify=False
|
||||
'''
|
||||
|
||||
#TODO - verify record type (A, AAAA, CNAME< HOST, MX, PTR, SVR, TXT, host_ipv4addr, host_ipv6addr, naptr)
|
||||
records = []
|
||||
|
||||
infoblox_server, infoblox_user, infoblox_password = _conn_info_check(infoblox_server,
|
||||
infoblox_user,
|
||||
infoblox_password)
|
||||
|
||||
if infoblox_server is None and infoblox_user is None and infoblox_password is None:
|
||||
_throw_no_creds()
|
||||
return None
|
||||
|
||||
url = 'https://{0}/wapi/{1}/record:{3}?name:={2}{4}{5}'.format(
|
||||
infoblox_server,
|
||||
infoblox_api_version,
|
||||
record_name,
|
||||
record_type,
|
||||
('' if dns_view is None else '&view=' + dns_view),
|
||||
('&_return_fields%2B=aliases' if record_type == 'host' else '')
|
||||
)
|
||||
log.debug('Requst url is "{0}"'.format(url))
|
||||
ret = _process_return_data(requests.get(url,
|
||||
auth=(infoblox_user, infoblox_password),
|
||||
verify=sslVerify))
|
||||
if ret:
|
||||
for entry in ret.json():
|
||||
log.debug('Infoblox record returned: {0}'.format(entry))
|
||||
tEntry = {}
|
||||
data = _parse_record_data(entry)
|
||||
for key in data.keys():
|
||||
tEntry[key] = data[key]
|
||||
records.append(tEntry)
|
||||
return records
|
||||
else:
|
||||
return False
|
||||
return False
|
||||
|
||||
|
||||
def _parse_record_data(entry_data):
|
||||
'''
|
||||
returns the right value data we'd be interested in for the specified record type
|
||||
'''
|
||||
|
||||
ret = {}
|
||||
ipv4addrs = []
|
||||
aliases = []
|
||||
if 'canonical' in entry_data:
|
||||
ret['Canonical Name'] = entry_data['canonical']
|
||||
if 'ipv4addrs' in entry_data:
|
||||
for ipaddrs in entry_data['ipv4addrs']:
|
||||
ipv4addrs.append(ipaddrs['ipv4addr'])
|
||||
ret['IP Addresses'] = ipv4addrs
|
||||
if 'aliases' in entry_data:
|
||||
for alias in entry_data['aliases']:
|
||||
aliases.append(alias)
|
||||
ret['Aliases'] = aliases
|
||||
if 'name' in entry_data:
|
||||
ret['Name'] = entry_data['name']
|
||||
if 'view' in entry_data:
|
||||
ret['DNS View'] = entry_data['view']
|
||||
if 'network_view' in entry_data:
|
||||
ret['Network View'] = entry_data['network_view']
|
||||
if 'comment' in entry_data:
|
||||
ret['Comment'] = entry_data['comment']
|
||||
if 'network' in entry_data:
|
||||
ret['Network'] = entry_data['network']
|
||||
if '_ref' in entry_data:
|
||||
ret['Record ID'] = entry_data['_ref']
|
||||
return ret
|
228
salt/states/infoblox.py
Normal file
228
salt/states/infoblox.py
Normal file
@ -0,0 +1,228 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
states for infoblox stuff
|
||||
|
||||
ensures a record is either present or absent in an Infoblox DNS system
|
||||
|
||||
.. versionadded:: Boron
|
||||
'''
|
||||
from __future__ import absolute_import
|
||||
|
||||
# Import Python libs
|
||||
import logging
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def __virtual__():
|
||||
'''
|
||||
make sure the infoblox module is available
|
||||
'''
|
||||
return True if 'infoblox.get_record' in __salt__ else False
|
||||
|
||||
|
||||
def present(name,
|
||||
value,
|
||||
record_type,
|
||||
dns_view,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
Ensure a record exists
|
||||
|
||||
name
|
||||
Name of the record
|
||||
|
||||
value
|
||||
Value of the record
|
||||
|
||||
record_type
|
||||
record type (host, a, cname, etc)
|
||||
|
||||
dns_view
|
||||
DNS View
|
||||
|
||||
infoblox_server
|
||||
infoblox server to connect to (will try pillar if not specified)
|
||||
|
||||
infoblox_user
|
||||
username to use to connect to infoblox (will try pillar if not specified)
|
||||
|
||||
infoblox_password
|
||||
password to use to connect to infoblox (will try pillar if not specified)
|
||||
|
||||
verify_ssl
|
||||
verify SSL certificates
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
some-state:
|
||||
infoblox.present:
|
||||
- name: some.dns.record
|
||||
- value: 10.1.1.3
|
||||
- record_type: host
|
||||
- sslVerify: False
|
||||
'''
|
||||
record_type = record_type.lower()
|
||||
ret = {'name': name, 'result': True, 'comment': '', 'changes': {}}
|
||||
records = __salt__['infoblox.get_record'](name,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
dns_view=dns_view,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify)
|
||||
if records:
|
||||
#check records for updates
|
||||
for record in records:
|
||||
if record_type == 'cname':
|
||||
if record['Canonical Name'] != value:
|
||||
if __opts__['test']:
|
||||
ret['result'] = None
|
||||
ret['comment'] = ' '.join([ret['comment'],
|
||||
'DNS {0} record {1} in view {2} will be update'.format(record_type,
|
||||
name,
|
||||
dns_view)])
|
||||
else:
|
||||
retval = __salt__['infoblox.update_record'](name,
|
||||
value,
|
||||
dns_view,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify)
|
||||
if retval:
|
||||
if 'old' not in ret['changes']:
|
||||
ret['changes']['old'] = []
|
||||
if 'new' not in ret['changes']:
|
||||
ret['changes']['new'] = []
|
||||
ret['changes']['old'].append(record)
|
||||
ret['changes']['new'].append(__salt__['infoblox.get_record'](name,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
dns_view=dns_view,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify))
|
||||
else:
|
||||
ret['result'] = False
|
||||
return ret
|
||||
else:
|
||||
#no records
|
||||
if __opts__['test']:
|
||||
ret['result'] = None
|
||||
ret['comment'] = ' '.join([ret['comment'],
|
||||
'DNS {0} record {1} set to be added to view {2}'.format(record_type,
|
||||
name,
|
||||
dns_view)])
|
||||
return ret
|
||||
retval = __salt__['infoblox.add_record'](name,
|
||||
value,
|
||||
record_type,
|
||||
dns_view,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=sslVerify)
|
||||
if retval:
|
||||
ret['result'] = True
|
||||
ret['changes']['old'] = None
|
||||
ret['changes']['new'] = __salt__['infoblox.get_record'](name,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
dns_view=dns_view,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify)
|
||||
return ret
|
||||
|
||||
|
||||
def absent(name,
|
||||
record_type,
|
||||
dns_view,
|
||||
infoblox_server=None,
|
||||
infoblox_user=None,
|
||||
infoblox_password=None,
|
||||
infoblox_api_version='v1.4.2',
|
||||
sslVerify=True):
|
||||
'''
|
||||
Ensure a record does not exists
|
||||
|
||||
name
|
||||
Name of the record
|
||||
record_type
|
||||
record type (host, a, cname, etc)
|
||||
dns_view
|
||||
DNS View
|
||||
infoblox_server
|
||||
infoblox server to connect to (will try pillar if not specified)
|
||||
infoblox_user
|
||||
username to use to connect to infoblox (will try pillar if not specified)
|
||||
infoblox_password
|
||||
password to use to connect to infoblox (will try pillar if not specified)
|
||||
verify_ssl
|
||||
verify SSL certificates
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
some-state:
|
||||
infoblox.absent:
|
||||
- name: some.dns.record
|
||||
- record_type: host
|
||||
- dns_view: MyView
|
||||
- sslVerify: False
|
||||
'''
|
||||
ret = {'name': name, 'result': True, 'comment': '', 'changes': {}}
|
||||
record = __salt__['infoblox.get_record'](name,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
dns_view=dns_view,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify)
|
||||
if record:
|
||||
if __opts__['test']:
|
||||
ret['result'] = None
|
||||
ret['comment'] = ' '.join([ret['comment'],
|
||||
'DNS {0} record {1} in view {2} will be removed'.format(record_type,
|
||||
name,
|
||||
dns_view)])
|
||||
else:
|
||||
retval = __salt__['infoblox.delete_record'](name,
|
||||
dns_view,
|
||||
record_type,
|
||||
infoblox_server=infoblox_server,
|
||||
infoblox_user=infoblox_user,
|
||||
infoblox_password=infoblox_password,
|
||||
infoblox_api_version=infoblox_api_version,
|
||||
sslVerify=sslVerify)
|
||||
if retval:
|
||||
if 'old' not in ret['changes']:
|
||||
ret['changes']['old'] = []
|
||||
ret['changes']['new'] = None
|
||||
ret['changes']['old'].append(record)
|
||||
else:
|
||||
ret['result'] = False
|
||||
return ret
|
||||
else:
|
||||
#record not found
|
||||
ret['result'] = True
|
||||
ret['changes']['old'] = None
|
||||
ret['changes']['new'] = None
|
||||
ret['comment'] = 'DNS record does not exist'
|
||||
|
||||
return ret
|
Loading…
Reference in New Issue
Block a user