Get implementation in place
This commit is contained in:
parent
c800b9d0f4
commit
f5018fc457
@ -1,9 +1,14 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
import traceback
|
import traceback
|
||||||
from subprocess import check_output
|
from subprocess import CalledProcessError, check_output
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
from ansible.module_utils.basic import (
|
||||||
|
AnsibleModule,
|
||||||
|
env_fallback,
|
||||||
|
missing_required_lib,
|
||||||
|
)
|
||||||
|
|
||||||
DOCUMENTATION = """
|
DOCUMENTATION = """
|
||||||
---
|
---
|
||||||
@ -11,17 +16,10 @@ module: gandi_dns
|
|||||||
short_description: Manage Gandi DNS entries.
|
short_description: Manage Gandi DNS entries.
|
||||||
requirements:
|
requirements:
|
||||||
- python >= 3.8
|
- python >= 3.8
|
||||||
- gandi.cli >= 1.5
|
- dns-lexicon >= 3.3.19
|
||||||
author:
|
author:
|
||||||
- Luke Murphy (@decentral1se)
|
- Luke Murphy (@decentral1se)
|
||||||
options:
|
options:
|
||||||
apirest_key:
|
|
||||||
description:
|
|
||||||
- The Gandi REST API key. It may also be specified by the C(APIREST_KEY)
|
|
||||||
environment variable. See U(https://github.com/Gandi/gandi.cli/blob/master/gandicli.man.rst#environment)
|
|
||||||
for more.
|
|
||||||
type: str
|
|
||||||
required: true
|
|
||||||
domain:
|
domain:
|
||||||
description: The domain name you're working with.
|
description: The domain name you're working with.
|
||||||
type: str
|
type: str
|
||||||
@ -30,6 +28,13 @@ options:
|
|||||||
description: The IP v4 address that the domain refers to.
|
description: The IP v4 address that the domain refers to.
|
||||||
type: str
|
type: str
|
||||||
required: true
|
required: true
|
||||||
|
rest_api_key:
|
||||||
|
description:
|
||||||
|
- The Gandi REST API key. It may also be specified by the C(LEXICON_GANDI_AUTH_TOKEN)
|
||||||
|
environment variable. See U(https://github.com/AnalogJ/lexicon/blob/ce168132880558415c8c755e65f8e2f9b46cff62/lexicon/providers/gandi.py).
|
||||||
|
for more.
|
||||||
|
type: str
|
||||||
|
required: true
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
- The desired instance state.
|
- The desired instance state.
|
||||||
@ -43,44 +48,136 @@ options:
|
|||||||
EXAMPLES = """
|
EXAMPLES = """
|
||||||
- name: Create a new Gandi DNS entry
|
- name: Create a new Gandi DNS entry
|
||||||
gandi_dns:
|
gandi_dns:
|
||||||
apirest_key: "{{ apirest_key }}"
|
rest_api_key: "{{ lookup('env', 'LEXICON_GANDI_AUTH_TOKEN') }}"
|
||||||
domain: foobar.autonomic.zone
|
domain: foobar.autonomic.zone
|
||||||
ipv4: 192.168.1.2
|
ipv4: 192.168.1.2
|
||||||
state: present
|
state: present
|
||||||
"""
|
"""
|
||||||
|
|
||||||
RETURN = """
|
DNS_LEXICON_IMP_ERR = None
|
||||||
TODO
|
|
||||||
"""
|
|
||||||
|
|
||||||
GANDI_CLI_IMP_ERR = None
|
|
||||||
try:
|
try:
|
||||||
from gandi import cli # noqa
|
from lexicon.providers import gandi # noqa
|
||||||
|
|
||||||
HAS_GANDI_DEPENDENCY = True
|
HAS_DNS_LEXICON_DEPENDENCY = True
|
||||||
except ImportError:
|
except ImportError:
|
||||||
GANDI_IMP_ERR = traceback.format_exc()
|
DNS_LEXICON_IMP_ERR = traceback.format_exc()
|
||||||
HAS_GANDI_DEPENDENCY = False
|
HAS_DNS_LEXICON_DEPENDENCY = False
|
||||||
|
|
||||||
|
|
||||||
def retrieve_domain(domain):
|
def retrieve_domain_info(module):
|
||||||
"""Retrieve information about an existing domain."""
|
"""Retrieve all information about a specific domain."""
|
||||||
output = subprocess.check_output(["gandi", ""])
|
try:
|
||||||
|
return json.loads(
|
||||||
|
check_output(
|
||||||
|
[
|
||||||
|
"lexicon",
|
||||||
|
"gandi",
|
||||||
|
"list",
|
||||||
|
module.params["domain"],
|
||||||
|
"A",
|
||||||
|
"--output",
|
||||||
|
"JSON",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except CalledProcessError as exception:
|
||||||
|
module.fail_json(
|
||||||
|
msg="Unable to retrieve domain info. Saw: %s" % str(exception)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_domain(module):
|
||||||
|
"""Create a new DNS entry."""
|
||||||
|
try:
|
||||||
|
return json.loads(
|
||||||
|
check_output(
|
||||||
|
[
|
||||||
|
"lexicon",
|
||||||
|
"gandi",
|
||||||
|
"create",
|
||||||
|
module.params["domain"],
|
||||||
|
"A",
|
||||||
|
"--name",
|
||||||
|
module.params["domain"],
|
||||||
|
"--content",
|
||||||
|
module.params["ipv4"],
|
||||||
|
"--output",
|
||||||
|
"JSON",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except Exception as exception:
|
||||||
|
module.fail_json(
|
||||||
|
msg="Unable to create domain entry. Saw: %s" % str(exception)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def delete_domain(module):
|
||||||
|
"""Delete an existing DNS entry."""
|
||||||
|
try:
|
||||||
|
return json.loads(
|
||||||
|
check_output(
|
||||||
|
[
|
||||||
|
"lexicon",
|
||||||
|
"gandi",
|
||||||
|
"delete",
|
||||||
|
module.params["domain"],
|
||||||
|
"A",
|
||||||
|
"--name",
|
||||||
|
module.params["domain"],
|
||||||
|
"--content",
|
||||||
|
module.params["ipv4"],
|
||||||
|
"--output",
|
||||||
|
"JSON",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except Exception as exception:
|
||||||
|
module.fail_json(
|
||||||
|
msg="Unable to delete domain entry. Saw: %s" % str(exception)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Module entrypoint."""
|
"""Module entrypoint."""
|
||||||
module = AnsibleModule(argument_spec={})
|
module = AnsibleModule(
|
||||||
|
argument_spec=dict(
|
||||||
|
domain=dict(type='str', required=True),
|
||||||
|
ipv4=dict(type='str', required=True),
|
||||||
|
state=dict(
|
||||||
|
type='str', required=True, choices=['present', 'absent']
|
||||||
|
),
|
||||||
|
rest_api_key=dict(
|
||||||
|
type='str',
|
||||||
|
required=True,
|
||||||
|
no_log=True,
|
||||||
|
fallback=(env_fallback, ['LEXICON_GANDI_AUTH_TOKEN']),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
supports_check_mode=False,
|
||||||
|
required_together=(['domain', 'ipv4']),
|
||||||
|
)
|
||||||
|
|
||||||
if not HAS_GANDI_DEPENDENCY:
|
if not HAS_DNS_LEXICON_DEPENDENCY:
|
||||||
msg = missing_required_lib('gandi.cli')
|
msg = missing_required_lib('lexicon')
|
||||||
module.fail_json(msg=msg, exception=GANDI_IMP_ERR)
|
module.fail_json(msg=msg, exception=DNS_LEXICON_IMP_ERR)
|
||||||
|
|
||||||
|
domains = retrieve_domain_info(module)
|
||||||
|
existing_domain = module.params['domain'] in [
|
||||||
|
domain['name'] for domain in domains
|
||||||
|
]
|
||||||
|
|
||||||
if module.params['state'] == 'present':
|
if module.params['state'] == 'present':
|
||||||
domain = retrieve_domain(module.params['domain'])
|
if existing_domain:
|
||||||
|
module.exit_json(changed=False)
|
||||||
|
create_domain(module)
|
||||||
|
module.exit_json(changed=True)
|
||||||
|
|
||||||
if module.params['state'] == 'absent':
|
if module.params['state'] == 'absent':
|
||||||
pass
|
if not existing_domain:
|
||||||
|
module.exit_json(changed=False)
|
||||||
|
delete_domain(module)
|
||||||
|
module.exit_json(changed=True)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
Reference in New Issue
Block a user