diff options
Diffstat (limited to 'ansible_collections/community/hrobot/plugins/modules/server.py')
-rw-r--r-- | ansible_collections/community/hrobot/plugins/modules/server.py | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/ansible_collections/community/hrobot/plugins/modules/server.py b/ansible_collections/community/hrobot/plugins/modules/server.py new file mode 100644 index 000000000..2a24986e3 --- /dev/null +++ b/ansible_collections/community/hrobot/plugins/modules/server.py @@ -0,0 +1,274 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright (c) 2019 Felix Fontein <felix@fontein.de> +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = r''' +--- +module: server +short_description: Update server information +version_added: 1.2.0 +author: + - Felix Fontein (@felixfontein) +description: + - Allows to update server information. + - Right now the API only supports updating the server's name. +extends_documentation_fragment: + - community.hrobot.robot + - community.hrobot.attributes + - community.hrobot.attributes.actiongroup_robot + +attributes: + action_group: + version_added: 1.6.0 + check_mode: + support: full + diff_mode: + support: none + +options: + server_number: + description: + - The server number of the server to update. + type: int + required: true + server_name: + description: + - The server's name. + - If this option is not provided, it will not be adjusted. + type: str +''' + +EXAMPLES = r''' +- name: Set server's name to foo.example.com + community.hrobot.server: + hetzner_user: foo + hetzner_password: bar + server_number: 123 + server_name: foo.example.com +''' + +RETURN = r''' +server: + description: + - Information on the server. + returned: success + type: dict + contains: + server_ip: + description: + - The server's main IP address. + type: str + sample: 123.123.123.123 + returned: success + server_ipv6_net: + description: + - The server's main IPv6 network address. + type: str + sample: '2a01:f48:111:4221::' + returned: success + server_number: + description: + - The server's numeric ID. + type: int + sample: 321 + returned: success + server_name: + description: + - The user-defined server's name. + type: str + sample: server1 + returned: success + product: + description: + - The server product name. + type: str + sample: EQ 8 + returned: success + dc: + description: + - The data center the server is located in. + type: str + sample: NBG1-DC1 + returned: success + traffic: + description: + - Free traffic quota. + - C(unlimited) in case of unlimited traffic. + type: str + sample: 5 TB + returned: success + status: + description: + - Server status. + type: str + choices: + - ready + - in process + sample: ready + returned: success + cancelled: + description: + - Whether the server is cancelled. + type: bool + sample: false + returned: success + paid_until: + description: + - The date until the server has been paid. + type: str + sample: "2018-08-04" + returned: success + ip: + description: + - List of assigned single IP addresses. + type: list + elements: str + sample: + - 123.123.123.123 + returned: success + subnet: + description: + - List of assigned subnets. + type: list + elements: dict + sample: + - ip: '2a01:4f8:111:4221::' + mask: 64 + contains: + ip: + description: + - The first IP in the subnet. + type: str + sample: '2a01:4f8:111:4221::' + mask: + description: + - The masks bitlength. + type: str + sample: "64" + returned: success + reset: + description: + - Whether the server can be automatically reset. + type: bool + sample: true + returned: success + rescue: + description: + - Whether the rescue system is available. + type: bool + sample: false + returned: success + vnc: + description: + - Flag of VNC installation availability. + type: bool + sample: true + returned: success + windows: + description: + - Flag of Windows installation availability. + type: bool + sample: true + returned: success + plesk: + description: + - Flag of Plesk installation availability. + type: bool + sample: true + returned: success + cpanel: + description: + - Flag of cPanel installation availability. + type: bool + sample: true + returned: success + wol: + description: + - Flag of Wake On Lan availability. + type: bool + sample: true + returned: success + hot_swap: + description: + - Flag of Hot Swap availability. + type: bool + sample: true + returned: success + linked_storagebox: + description: + - Linked Storage Box ID. + type: int + sample: 12345 + returned: success +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.six.moves.urllib.parse import urlencode + +from ansible_collections.community.hrobot.plugins.module_utils.robot import ( + BASE_URL, + ROBOT_DEFAULT_ARGUMENT_SPEC, + fetch_url_json, +) + + +def main(): + argument_spec = dict( + server_number=dict(type='int', required=True), + server_name=dict(type='str'), + ) + argument_spec.update(ROBOT_DEFAULT_ARGUMENT_SPEC) + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + ) + + server_number = module.params['server_number'] + server_name = module.params['server_name'] + + url = "{0}/server/{1}".format(BASE_URL, server_number) + server, error = fetch_url_json(module, url, accept_errors=['SERVER_NOT_FOUND']) + if error: + module.fail_json(msg='This server does not exist, or you do not have access rights for it') + + result = { + 'changed': False, + 'server': server['server'], + } + + update = {} + if server_name is not None: + if server_name != result['server']['server_name']: + update['server_name'] = server_name + + if update: + result['changed'] = True + if module.check_mode: + result['server'].update(update) + else: + headers = {"Content-type": "application/x-www-form-urlencoded"} + url = "{0}/server/{1}".format(BASE_URL, server_number) + server, error = fetch_url_json( + module, + url, + data=urlencode(update), + headers=headers, + method='POST', + accept_errors=['INVALID_INPUT'], + ) + if error: + module.fail_json(msg='The values to update were invalid ({0})'.format(module.jsonify(update))) + result['server'] = server['server'] + + module.exit_json(**result) + + +if __name__ == '__main__': # pragma: no cover + main() # pragma: no cover |