plugins/modules/ali_dns_domain.py (148 lines of code) (raw):

#!/usr/bin/python # Copyright (c) 2017-present Alibaba Group Holding Limited. <xiaozhu36> # 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 = """ --- module: ali_dns_domain short_description: Configure Alibaba Cloud DNS (DNS) description: - Create, Delete Alicloud cloud DNS(DNS). It supports updating DNS remark and change domain group. options: domain_name: description: - The name to give your DNS. required: True aliases: ['name'] type: str group_name: description: - Specify name of group, when change domain group. type: str lang: description: - The language which you choose type: str resource_group_id: description: - When add domain, You can specify the resource group id. type: str remark: description: - Specify this parameter as a comment for dns. type: str state: description: - Whether or not to create, delete DNS. choices: ['present', 'absent'] default: 'present' type: str user_client_ip: description: - User client IP. type: str requirements: - "python >= 3.6" - "footmark >= 1.15.0" extends_documentation_fragment: - alibaba.alicloud.alicloud author: - "He Guimin (@xiaozhu36)" """ EXAMPLES = """ # Note: These examples do not set authentication details, see the Alibaba Cloud Guide for details. - name: Create a new domain alibaba.alicloud.ali_dns_domain: state: 'present' domain_name: '{{ domain_name }}' remark: '{{ remark }}' - name: Changed. Changed. Modify remark. alibaba.alicloud.ali_dns_domain: domain_name: '{{ domain_name }}' remark: 'new--{{ remark }}' - name: Changed. change domain group. alibaba.alicloud.ali_dns_domain: domain_name: '{{ domain_name }}' group_name: '{{ group_name }}' - name: Changed. Deleting dns alibaba.alicloud.ali_dns_domain: domain_name: '{{ domain_name }}' state: absent """ RETURN = ''' dns: description: info about the DNS that was created or deleted. returned: always type: complex contains: alibaba.alicloud.ali_domain: description: Whether it is the domain name of Alibaba Cloud. returned: always type: bool sample: false dns_servers: description: The DNS list of the domain name in the resolution system. returned: always type: dict sample: dns_servers: dns_server: - xx1.alidns.com - xx2.alidns.com domain_name: description: The name of domain. returned: always type: str sample: ansiblexxx.abc name: description: alias of 'domain_name'. returned: always type: str sample: ansiblexxx.abc id: description: alias of 'domain_id'. returned: always type: str sample: dns-c2e00da5 puny_code: description: Chinese domain name punycode code, English domain name returned empty. type: bool sample: ansiblexxx.abc record_count: description: The number of parsing records contained in the domain name. returned: always type: int sample: 0 remark: description: A comment for dns. returned: always type: str sample: ansible_test_dns_domain starmark: description: Whether to query the domain name star. returned: always type: bool sample: false domain_id: description: DNS resource id. returned: always type: str sample: dns-c2e00da5 version_code: description: Cloud resolution version Code. returned: always type: str sample: mianfei version_name: description: Cloud resolution product name. returned: always type: str sample: Alibaba Cloud DNS ''' from ansible.module_utils.basic import AnsibleModule from ansible_collections.alibaba.alicloud.plugins.module_utils.alicloud_ecs import ecs_argument_spec, dns_connect HAS_FOOTMARK = False try: from footmark.exception import DNSResponseError HAS_FOOTMARK = True except ImportError: HAS_FOOTMARK = False def dns_exists(module, dns_conn, domain_name): """Returns None or a vpc object depending on the existence of a VPC. When supplied with a CIDR and Name, it will check them to determine if it is a match otherwise it will assume the VPC does not exist and thus return None. """ matching_dns = [] try: for v in dns_conn.describe_domains(): if v.domain_name == domain_name: matching_dns.append(v) except Exception as e: module.fail_json(msg="Failed to describe DNSs: {0}".format(e)) if matching_dns: return matching_dns[0] def main(): argument_spec = ecs_argument_spec() argument_spec.update(dict( domain_name=dict(type='str', aliases=['name'], required=True), group_name=dict(type='str'), lang=dict(type='str'), resource_group_id=dict(type='str'), remark=dict(type='str'), state=dict(default='present', choices=['present', 'absent']), user_client_ip=dict(type='str') )) module = AnsibleModule(argument_spec=argument_spec) if HAS_FOOTMARK is False: module.fail_json(msg='footmark required for the module ali_dns_domain.') dns_conn = dns_connect(module) # Get values of variable state = module.params['state'] domain_name = module.params['domain_name'] remark = module.params['remark'] group_name = module.params['group_name'] changed = False # Check if VPC exists dns = dns_exists(module, dns_conn, domain_name) if state == 'absent': if not dns: module.exit_json(changed=changed, dns={}) try: module.exit_json(changed=dns.delete(), dns={}) except DNSResponseError as ex: module.fail_json(msg='Unable to delete dns {0}, error: {1}'.format(dns.id, ex)) if not dns: params = module.params try: dns = dns_conn.add_domain(**params) if dns: changed = True except DNSResponseError as e: module.fail_json(msg='Unable to create dns, error: {0}'.format(e)) if domain_name and group_name: try: res = dns.change_domain_group(group_name=group_name, domain_name=domain_name) if res: changed = True except DNSResponseError as e: module.fail_json(msg='Unable to change domain group, error: {0}'.format(e)) if remark: try: res = dns.modify_remark(remark=remark) if res: changed = True except DNSResponseError as e: module.fail_json(msg='Unable to modify dns remark, error: {0}'.format(e)) module.exit_json(changed=changed, dns=dns.get().read()) if __name__ == '__main__': main()