summaryrefslogtreecommitdiff
path: root/lib/ansible/modules
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules')
l---------lib/ansible/modules/cloud/hcloud/_hcloud_datacenter_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_floating_ip_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_image_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_location_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_server_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_server_type_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_ssh_key_facts.py1
l---------lib/ansible/modules/cloud/hcloud/_hcloud_volume_facts.py1
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_datacenter_info.py170
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_floating_ip.py353
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_floating_ip_info.py195
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_image_info.py208
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_location_info.py169
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_network.py248
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_network_info.py213
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_rdns.py230
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_route.py200
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_server.py555
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_server_info.py229
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_server_network.py229
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_server_type_info.py187
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_ssh_key.py250
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_ssh_key_info.py179
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_subnetwork.py221
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_volume.py344
-rw-r--r--lib/ansible/modules/cloud/hcloud/hcloud_volume_info.py196
26 files changed, 0 insertions, 4384 deletions
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_datacenter_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_datacenter_facts.py
deleted file mode 120000
index 44473ed316..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_datacenter_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_datacenter_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_floating_ip_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_floating_ip_facts.py
deleted file mode 120000
index 76db56c360..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_floating_ip_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_floating_ip_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_image_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_image_facts.py
deleted file mode 120000
index c673044bcc..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_image_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_image_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_location_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_location_facts.py
deleted file mode 120000
index adb06ecb09..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_location_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_location_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_server_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_server_facts.py
deleted file mode 120000
index cc0effff1b..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_server_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_server_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_server_type_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_server_type_facts.py
deleted file mode 120000
index 5fe872d486..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_server_type_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_server_type_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_ssh_key_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_ssh_key_facts.py
deleted file mode 120000
index c4b0f78e70..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_ssh_key_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_ssh_key_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/_hcloud_volume_facts.py b/lib/ansible/modules/cloud/hcloud/_hcloud_volume_facts.py
deleted file mode 120000
index 1dd0312c66..0000000000
--- a/lib/ansible/modules/cloud/hcloud/_hcloud_volume_facts.py
+++ /dev/null
@@ -1 +0,0 @@
-hcloud_volume_info.py \ No newline at end of file
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_datacenter_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_datacenter_info.py
deleted file mode 100644
index 5e9f64370c..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_datacenter_info.py
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_datacenter_info
-
-short_description: Gather info about the Hetzner Cloud datacenters.
-
-version_added: "2.8"
-description:
- - Gather info about your Hetzner Cloud datacenters.
- - This module was called C(hcloud_datacenter_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_datacenter_facts).
- Note that the M(hcloud_datacenter_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_datacenter_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the datacenter you want to get.
- type: int
- name:
- description:
- - The name of the datacenter you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud datacenter info
- hcloud_datacenter_info:
- register: output
-- name: Print the gathered info
- debug:
- var: output
-"""
-
-RETURN = """
-hcloud_datacenter_info:
- description:
- - The datacenter info as list
- - This module was called C(hcloud_datacenter_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_datacenter_facts).
- Note that the M(hcloud_datacenter_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_datacenter_info)!
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the datacenter
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the datacenter
- returned: always
- type: str
- sample: fsn1-dc8
- description:
- description: Detail description of the datacenter
- returned: always
- type: str
- sample: Falkenstein DC 8
- location:
- description: Name of the location where the datacenter resides in
- returned: always
- type: str
- sample: fsn1
- city:
- description: City of the location
- returned: always
- type: str
- sample: fsn1
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudDatacenterInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_datacenter_info")
- self.hcloud_datacenter_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for datacenter in self.hcloud_datacenter_info:
- if datacenter is not None:
- tmp.append({
- "id": to_native(datacenter.id),
- "name": to_native(datacenter.name),
- "description": to_native(datacenter.description),
- "location": to_native(datacenter.location.name)
- })
-
- return tmp
-
- def get_datacenters(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_datacenter_info = [self.client.datacenters.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_datacenter_info = [self.client.datacenters.get_by_name(
- self.module.params.get("name")
- )]
- else:
- self.hcloud_datacenter_info = self.client.datacenters.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudDatacenterInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_datacenter_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_datacenter_facts' module has been renamed to 'hcloud_datacenter_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
- hcloud = AnsibleHcloudDatacenterInfo(module)
-
- hcloud.get_datacenters()
- result = hcloud.get_result()
- if is_old_facts:
- ansible_info = {
- 'hcloud_datacenter_facts': result['hcloud_datacenter_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_datacenter_info': result['hcloud_datacenter_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip.py b/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip.py
deleted file mode 100644
index 5f04c80e82..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip.py
+++ /dev/null
@@ -1,353 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_floating_ip
-
-short_description: Create and manage cloud Floating IPs on the Hetzner Cloud.
-
-version_added: "2.10"
-
-description:
- - Create, update and manage cloud Floating IPs on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- id:
- description:
- - The ID of the Hetzner Cloud Floating IPs to manage.
- - Only required if no Floating IP I(name) is given.
- type: int
- name:
- description:
- - The Name of the Hetzner Cloud Floating IPs to manage.
- - Only required if no Floating IP I(id) is given or a Floating IP does not exists.
- type: str
- description:
- description:
- - The Description of the Hetzner Cloud Floating IPs.
- type: str
- home_location:
- description:
- - Home Location of the Hetzner Cloud Floating IP.
- - Required if no I(server) is given and Floating IP does not exists.
- type: str
- server:
- description:
- - Server Name the Floating IP should be assigned to.
- - Required if no I(home_location) is given and Floating IP does not exists.
- type: str
- type:
- description:
- - Type of the Floating IP.
- - Required if Floating IP does not exists
- choices: [ ipv4, ipv6 ]
- type: str
- force:
- description:
- - Force the assignment or deletion of the Floating IP.
- type: bool
- delete_protection:
- description:
- - Protect the Floating IP for deletion.
- type: bool
- version_added: "2.10"
- labels:
- description:
- - User-defined labels (key-value pairs).
- type: dict
- state:
- description:
- - State of the Floating IP.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.6.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic IPv4 Floating IP
- hcloud_floating_ip:
- name: my-floating-ip
- home_location: fsn1
- type: ipv4
- state: present
-- name: Create a basic IPv6 Floating IP
- hcloud_floating_ip:
- name: my-floating-ip
- home_location: fsn1
- type: ipv6
- state: present
-- name: Assign a Floating IP to a server
- hcloud_floating_ip:
- name: my-floating-ip
- server: 1234
- state: present
-- name: Assign a Floating IP to another server
- hcloud_floating_ip:
- name: my-floating-ip
- server: 1234
- force: yes
- state: present
-- name: Floating IP should be absent
- hcloud_floating_ip:
- name: my-floating-ip
- state: absent
-"""
-
-RETURN = """
-hcloud_floating_ip:
- description: The Floating IP instance
- returned: Always
- type: complex
- contains:
- id:
- description: ID of the Floating IP
- type: int
- returned: Always
- sample: 12345
- name:
- description: Name of the Floating IP
- type: str
- returned: Always
- sample: my-floating-ip
- description:
- description: Description of the Floating IP
- type: str
- returned: Always
- sample: my-floating-ip
- ip:
- description: IP Address of the Floating IP
- type: str
- returned: Always
- sample: 116.203.104.109
- type:
- description: Type of the Floating IP
- type: str
- returned: Always
- sample: ipv4
- home_location:
- description: Name of the home location of the Floating IP
- type: str
- returned: Always
- sample: fsn1
- server:
- description: Name of the server the Floating IP is assigned to.
- type: str
- returned: Always
- sample: "my-server"
- delete_protection:
- description: True if Floating IP is protected for deletion
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
- labels:
- description: User-defined labels (key-value pairs)
- type: dict
- returned: Always
- sample:
- key: value
- mylabel: 123
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- APIException = None
-
-
-class AnsibleHcloudFloatingIP(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudFloatingIP, self).__init__(module, "hcloud_floating_ip")
- self.hcloud_floating_ip = None
-
- def _prepare_result(self):
- server = None
-
- if self.hcloud_floating_ip.server is not None:
- server = to_native(self.hcloud_floating_ip.server.name)
- return {
- "id": to_native(self.hcloud_floating_ip.id),
- "name": to_native(self.hcloud_floating_ip.name),
- "description": to_native(self.hcloud_floating_ip.description),
- "ip": to_native(self.hcloud_floating_ip.ip),
- "type": to_native(self.hcloud_floating_ip.type),
- "home_location": to_native(self.hcloud_floating_ip.home_location.name),
- "labels": self.hcloud_floating_ip.labels,
- "server": server,
- "delete_protection": self.hcloud_floating_ip.protection["delete"],
- }
-
- def _get_floating_ip(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_floating_ip = self.client.floating_ips.get_by_id(
- self.module.params.get("id")
- )
- else:
- self.hcloud_floating_ip = self.client.floating_ips.get_by_name(
- self.module.params.get("name")
- )
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _create_floating_ip(self):
- self.module.fail_on_missing_params(
- required_params=["type"]
- )
- params = {
- "description": self.module.params.get("description"),
- "type": self.module.params.get("type"),
- "name": self.module.params.get("name"),
- }
- if self.module.params.get("home_location") is not None:
- params["home_location"] = self.client.locations.get_by_name(
- self.module.params.get("home_location")
- )
- elif self.module.params.get("server") is not None:
- params["server"] = self.client.servers.get_by_name(
- self.module.params.get("server")
- )
- else:
- self.module.fail_json(msg="one of the following is required: home_location, server")
-
- if self.module.params.get("labels") is not None:
- params["labels"] = self.module.params.get("labels")
- if not self.module.check_mode:
- resp = self.client.floating_ips.create(**params)
- self.hcloud_floating_ip = resp.floating_ip
-
- self._mark_as_changed()
- self._get_floating_ip()
-
- def _update_floating_ip(self):
- try:
- labels = self.module.params.get("labels")
- if labels is not None and labels != self.hcloud_floating_ip.labels:
- if not self.module.check_mode:
- self.hcloud_floating_ip.update(labels=labels)
- self._mark_as_changed()
-
- description = self.module.params.get("description")
- if description is not None and description != self.hcloud_floating_ip.description:
- if not self.module.check_mode:
- self.hcloud_floating_ip.update(description=description)
- self._mark_as_changed()
-
- server = self.module.params.get("server")
- if server is not None:
- if self.module.params.get("force") or self.hcloud_floating_ip.server is None:
- if not self.module.check_mode:
- self.hcloud_floating_ip.assign(
- self.client.servers.get_by_name(self.module.params.get("server"))
- )
- else:
- self.module.warn(
- "Floating IP is already assigned to server %s. You need to unassign the Floating IP or use force=yes."
- % self.hcloud_floating_ip.server.name
- )
- self._mark_as_changed()
- elif server is None and self.hcloud_floating_ip.server is not None:
- if not self.module.check_mode:
- self.hcloud_floating_ip.unassign()
- self._mark_as_changed()
-
- delete_protection = self.module.params.get("delete_protection")
- if delete_protection is not None and delete_protection != self.hcloud_floating_ip.protection["delete"]:
- if not self.module.check_mode:
- self.hcloud_floating_ip.change_protection(delete=delete_protection).wait_until_finished()
- self._mark_as_changed()
-
- self._get_floating_ip()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def present_floating_ip(self):
- self._get_floating_ip()
- if self.hcloud_floating_ip is None:
- self._create_floating_ip()
- else:
- self._update_floating_ip()
-
- def delete_floating_ip(self):
- try:
- self._get_floating_ip()
- if self.hcloud_floating_ip is not None:
- if self.module.params.get("force") or self.hcloud_floating_ip.server is None:
- if not self.module.check_mode:
- self.client.floating_ips.delete(self.hcloud_floating_ip)
- else:
- self.module.warn(
- "Floating IP is currently assigned to server %s. You need to unassign the Floating IP or use force=yes."
- % self.hcloud_floating_ip.server.name
- )
- self._mark_as_changed()
- self.hcloud_floating_ip = None
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- description={"type": "str"},
- server={"type": "str"},
- home_location={"type": "str"},
- force={"type": "bool"},
- type={"choices": ["ipv4", "ipv6"]},
- labels={"type": "dict"},
- delete_protection={"type": "bool"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- required_one_of=[['id', 'name']],
- mutually_exclusive=[['home_location', 'server']],
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudFloatingIP.define_module()
-
- hcloud = AnsibleHcloudFloatingIP(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_floating_ip()
- elif state == "present":
- hcloud.present_floating_ip()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip_info.py
deleted file mode 100644
index 22dd7725c2..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_floating_ip_info.py
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_floating_ip_info
-
-short_description: Gather infos about the Hetzner Cloud Floating IPs.
-
-version_added: "2.8"
-description:
- - Gather facts about your Hetzner Cloud Floating IPs.
- - This module was called C(hcloud_floating_ip_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_floating_ip_facts).
- Note that the M(hcloud_floating_ip_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_floating_ip_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the Floating IP you want to get.
- type: int
- label_selector:
- description:
- - The label selector for the Floating IP you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud Floating ip infos
- hcloud_floating_ip_info:
- register: output
-- name: Print the gathered infos
- debug:
- var: output
-"""
-
-RETURN = """
-hcloud_floating_ip_info:
- description: The Floating ip infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the Floating IP
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the Floating IP
- returned: Always
- type: str
- sample: my-floating-ip
- version_added: "2.10"
- description:
- description: Description of the Floating IP
- returned: always
- type: str
- sample: Falkenstein DC 8
- ip:
- description: IP address of the Floating IP
- returned: always
- type: str
- sample: 131.232.99.1
- type:
- description: Type of the Floating IP
- returned: always
- type: str
- sample: ipv4
- server:
- description: Name of the server where the Floating IP is assigned to.
- returned: always
- type: str
- sample: my-server
- home_location:
- description: Location the Floating IP was created in
- returned: always
- type: str
- sample: fsn1
- delete_protection:
- description: True if the Floating IP is protected for deletion
- returned: always
- type: bool
- version_added: "2.10"
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudFloatingIPInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_floating_ip_info")
- self.hcloud_floating_ip_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for floating_ip in self.hcloud_floating_ip_info:
- if floating_ip is not None:
- server_name = None
- if floating_ip.server is not None:
- server_name = floating_ip.server.name
- tmp.append({
- "id": to_native(floating_ip.id),
- "name": to_native(floating_ip.name),
- "description": to_native(floating_ip.description),
- "ip": to_native(floating_ip.ip),
- "type": to_native(floating_ip.type),
- "server": to_native(server_name),
- "home_location": to_native(floating_ip.home_location.name),
- "labels": floating_ip.labels,
- "delete_protection": floating_ip.protection["delete"],
- })
-
- return tmp
-
- def get_floating_ips(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_floating_ip_info = [self.client.floating_ips.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("label_selector") is not None:
- self.hcloud_floating_ip_info = self.client.floating_ips.get_all(
- label_selector=self.module.params.get("label_selector"))
- else:
- self.hcloud_floating_ip_info = self.client.floating_ips.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- label_selector={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudFloatingIPInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_floating_ip_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_floating_ip_facts' module has been renamed to 'hcloud_floating_ip_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudFloatingIPInfo(module)
-
- hcloud.get_floating_ips()
- result = hcloud.get_result()
- if is_old_facts:
- ansible_info = {
- 'hcloud_floating_ip_facts': result['hcloud_floating_ip_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_floating_ip_info': result['hcloud_floating_ip_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_image_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_image_info.py
deleted file mode 100644
index 0e094bc873..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_image_info.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_image_info
-
-short_description: Gather infos about your Hetzner Cloud images.
-
-version_added: "2.8"
-
-description:
- - Gather infos about your Hetzner Cloud images.
- - This module was called C(hcloud_location_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_location_facts).
- Note that the M(hcloud_image_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_image_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the image you want to get.
- type: int
- name:
- description:
- - The name of the image you want to get.
- type: str
- label_selector:
- description:
- - The label selector for the images you want to get.
- type: str
- type:
- description:
- - The label selector for the images you want to get.
- default: system
- choices: [ system, snapshot, backup ]
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud image infos
- hcloud_image_info:
- register: output
-
-- name: Print the gathered infos
- debug:
- var: output
-"""
-
-RETURN = """
-hcloud_image_info:
- description: The image infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the image
- returned: always
- type: int
- sample: 1937415
- type:
- description: Type of the image
- returned: always
- type: str
- sample: system
- status:
- description: Status of the image
- returned: always
- type: str
- sample: available
- name:
- description: Name of the image
- returned: always
- type: str
- sample: ubuntu-18.04
- description:
- description: Detail description of the image
- returned: always
- type: str
- sample: Ubuntu 18.04 Standard 64 bit
- os_flavor:
- description: OS flavor of the image
- returned: always
- type: str
- sample: ubuntu
- os_version:
- description: OS version of the image
- returned: always
- type: str
- sample: 18.04
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudImageInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_image_info")
- self.hcloud_image_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for image in self.hcloud_image_info:
- if image is not None:
- tmp.append({
- "id": to_native(image.id),
- "status": to_native(image.status),
- "type": to_native(image.type),
- "name": to_native(image.name),
- "description": to_native(image.description),
- "os_flavor": to_native(image.os_flavor),
- "os_version": to_native(image.os_version),
- "labels": image.labels,
- })
- return tmp
-
- def get_images(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_image_info = [self.client.images.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_image_info = [self.client.images.get_by_name(
- self.module.params.get("name")
- )]
- else:
- params = {}
- label_selector = self.module.params.get("label_selector")
- if label_selector:
- params["label_selector"] = label_selector
-
- image_type = self.module.params.get("type")
- if image_type:
- params["type"] = image_type
-
- self.hcloud_image_info = self.client.images.get_all(**params)
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- label_selector={"type": "str"},
- type={"choices": ["system", "snapshot", "backup"], "default": "system", "type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudImageInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_image_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_image_facts' module has been renamed to 'hcloud_image_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudImageInfo(module)
- hcloud.get_images()
- result = hcloud.get_result()
-
- if is_old_facts:
- ansible_info = {
- 'hcloud_imagen_facts': result['hcloud_image_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_image_info': result['hcloud_image_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_location_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_location_info.py
deleted file mode 100644
index fe00190ac2..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_location_info.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_location_info
-
-short_description: Gather infos about your Hetzner Cloud locations.
-
-version_added: "2.8"
-
-description:
- - Gather infos about your Hetzner Cloud locations.
- - This module was called C(hcloud_location_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_location_facts).
- Note that the M(hcloud_location_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_location_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the location you want to get.
- type: int
- name:
- description:
- - The name of the location you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud location infos
- hcloud_location_info:
- register: output
-
-- name: Print the gathered infos
- debug:
- var: output
-"""
-
-RETURN = """
-hcloud_location_info:
- description: The location infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the location
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the location
- returned: always
- type: str
- sample: fsn1
- description:
- description: Detail description of the location
- returned: always
- type: str
- sample: Falkenstein DC Park 1
- country:
- description: Country code of the location
- returned: always
- type: str
- sample: DE
- city:
- description: City of the location
- returned: always
- type: str
- sample: Falkenstein
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudLocationInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_location_info")
- self.hcloud_location_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for location in self.hcloud_location_info:
- if location is not None:
- tmp.append({
- "id": to_native(location.id),
- "name": to_native(location.name),
- "description": to_native(location.description),
- "city": to_native(location.city),
- "country": to_native(location.country)
- })
- return tmp
-
- def get_locations(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_location_info = [self.client.locations.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_location_info = [self.client.locations.get_by_name(
- self.module.params.get("name")
- )]
- else:
- self.hcloud_location_info = self.client.locations.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudLocationInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_location_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_location_info' module has been renamed to 'hcloud_location_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudLocationInfo(module)
- hcloud.get_locations()
- result = hcloud.get_result()
- if is_old_facts:
- ansible_info = {
- 'hcloud_location_facts': result['hcloud_location_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_location_info': result['hcloud_location_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_network.py b/lib/ansible/modules/cloud/hcloud/hcloud_network.py
deleted file mode 100644
index 4597af434c..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_network.py
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_network
-
-short_description: Create and manage cloud Networks on the Hetzner Cloud.
-
-version_added: "2.9"
-
-description:
- - Create, update and manage cloud Networks on the Hetzner Cloud.
- - You need at least hcloud-python 1.3.0.
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- id:
- description:
- - The ID of the Hetzner Cloud Networks to manage.
- - Only required if no Network I(name) is given.
- type: int
- name:
- description:
- - The Name of the Hetzner Cloud Network to manage.
- - Only required if no Network I(id) is given or a Network does not exists.
- type: str
- ip_range:
- description:
- - IP range of the Network.
- - Required if Network does not exists.
- type: str
- labels:
- description:
- - User-defined labels (key-value pairs).
- type: dict
- delete_protection:
- description:
- - Protect the Network for deletion.
- type: bool
- version_added: "2.10"
- state:
- description:
- - State of the Network.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.3.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic network
- hcloud_network:
- name: my-network
- ip_range: 10.0.0.0/8
- state: present
-
-- name: Ensure the Network is absent (remove if needed)
- hcloud_network:
- name: my-network
- state: absent
-"""
-
-RETURN = """
-hcloud_network:
- description: The Network
- returned: always
- type: complex
- contains:
- id:
- description: ID of the Network
- type: int
- returned: always
- sample: 12345
- name:
- description: Name of the Network
- type: str
- returned: always
- sample: my-volume
- ip_range:
- description: IP range of the Network
- type: str
- returned: always
- sample: 10.0.0.0/8
- delete_protection:
- description: True if Network is protected for deletion
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
- labels:
- description: User-defined labels (key-value pairs)
- type: dict
- returned: always
- sample:
- key: value
- mylabel: 123
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- APIException = None
-
-
-class AnsibleHcloudNetwork(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudNetwork, self).__init__(module, "hcloud_network")
- self.hcloud_network = None
-
- def _prepare_result(self):
- return {
- "id": to_native(self.hcloud_network.id),
- "name": to_native(self.hcloud_network.name),
- "ip_range": to_native(self.hcloud_network.ip_range),
- "delete_protection": self.hcloud_network.protection["delete"],
- "labels": self.hcloud_network.labels,
- }
-
- def _get_network(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_network = self.client.networks.get_by_id(
- self.module.params.get("id")
- )
- else:
- self.hcloud_network = self.client.networks.get_by_name(
- self.module.params.get("name")
- )
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _create_network(self):
-
- self.module.fail_on_missing_params(
- required_params=["name", "ip_range"]
- )
- params = {
- "name": self.module.params.get("name"),
- "ip_range": self.module.params.get("ip_range"),
- "labels": self.module.params.get("labels"),
- }
-
- if not self.module.check_mode:
- self.client.networks.create(**params)
-
- self._mark_as_changed()
- self._get_network()
-
- def _update_network(self):
- try:
- labels = self.module.params.get("labels")
- if labels is not None and labels != self.hcloud_network.labels:
- if not self.module.check_mode:
- self.hcloud_network.update(labels=labels)
- self._mark_as_changed()
-
- ip_range = self.module.params.get("ip_range")
- if ip_range is not None and ip_range != self.hcloud_network.ip_range:
- if not self.module.check_mode:
- self.hcloud_network.change_ip_range(ip_range=ip_range).wait_until_finished()
- self._mark_as_changed()
-
- delete_protection = self.module.params.get("delete_protection")
- if delete_protection is not None and delete_protection != self.hcloud_network.protection["delete"]:
- if not self.module.check_mode:
- self.hcloud_network.change_protection(delete=delete_protection).wait_until_finished()
- self._mark_as_changed()
- except APIException as e:
- self.module.fail_json(msg=e.message)
- self._get_network()
-
- def present_network(self):
- self._get_network()
- if self.hcloud_network is None:
- self._create_network()
- else:
- self._update_network()
-
- def delete_network(self):
- try:
- self._get_network()
- if self.hcloud_network is not None:
- if not self.module.check_mode:
- self.client.networks.delete(self.hcloud_network)
- self._mark_as_changed()
- except APIException as e:
- self.module.fail_json(msg=e.message)
- self.hcloud_network = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- ip_range={"type": "str"},
- labels={"type": "dict"},
- delete_protection={"type": "bool"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- required_one_of=[['id', 'name']],
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudNetwork.define_module()
-
- hcloud = AnsibleHcloudNetwork(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_network()
- elif state == "present":
- hcloud.present_network()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_network_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_network_info.py
deleted file mode 100644
index dae960ef92..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_network_info.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_network_info
-
-short_description: Gather info about your Hetzner Cloud networks.
-
-version_added: "2.9"
-
-description:
- - Gather info about your Hetzner Cloud networks.
-
-author:
- - Christopher Schmitt (@cschmitt-hcloud)
-
-options:
- id:
- description:
- - The ID of the network you want to get.
- type: int
- name:
- description:
- - The name of the network you want to get.
- type: str
- label_selector:
- description:
- - The label selector for the network you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud network info
- local_action:
- module: hcloud_network_info
-
-- name: Print the gathered info
- debug:
- var: hcloud_network_info
-"""
-
-RETURN = """
-hcloud_network_info:
- description: The network info as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the network
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the network
- returned: always
- type: str
- sample: awesome-network
- ip_range:
- description: IP range of the network
- returned: always
- type: str
- sample: 10.0.0.0/16
- subnetworks:
- description: Subnetworks belonging to the network
- returned: always
- type: complex
- routes:
- description: Routes belonging to the network
- returned: always
- type: complex
- servers:
- description: Servers attached to the network
- returned: always
- type: complex
- delete_protection:
- description: True if the network is protected for deletion
- returned: always
- type: bool
- version_added: "2.10"
- labels:
- description: Labels of the network
- returned: always
- type: dict
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudNetworkInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_network_info")
- self.hcloud_network_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for network in self.hcloud_network_info:
- if network is not None:
- subnets = []
- for subnet in network.subnets:
- prepared_subnet = {
- "type": subnet.type,
- "ip_range": subnet.ip_range,
- "network_zone": subnet.network_zone,
- "gateway": subnet.gateway,
- }
- subnets.append(prepared_subnet)
- routes = []
- for route in network.routes:
- prepared_route = {
- "destination": route.destination,
- "gateway": route.gateway
- }
- routes.append(prepared_route)
-
- servers = []
- for server in network.servers:
- prepared_server = {
- "id": to_native(server.id),
- "name": to_native(server.name),
- "ipv4_address": to_native(server.public_net.ipv4.ip),
- "ipv6": to_native(server.public_net.ipv6.ip),
- "image": to_native(server.image.name),
- "server_type": to_native(server.server_type.name),
- "datacenter": to_native(server.datacenter.name),
- "location": to_native(server.datacenter.location.name),
- "rescue_enabled": server.rescue_enabled,
- "backup_window": to_native(server.backup_window),
- "labels": server.labels,
- "status": to_native(server.status),
- }
- servers.append(prepared_server)
-
- tmp.append({
- "id": to_native(network.id),
- "name": to_native(network.name),
- "ip_range": to_native(network.ip_range),
- "subnetworks": subnets,
- "routes": routes,
- "servers": servers,
- "labels": network.labels,
- "delete_protection": network.protection["delete"],
- })
- return tmp
-
- def get_networks(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_network_info = [self.client.networks.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_network_info = [self.client.networks.get_by_name(
- self.module.params.get("name")
- )]
- elif self.module.params.get("label_selector") is not None:
- self.hcloud_network_info = self.client.networks.get_all(
- label_selector=self.module.params.get("label_selector"))
- else:
- self.hcloud_network_info = self.client.networks.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- label_selector={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudNetworkInfo.define_module()
-
- hcloud = AnsibleHcloudNetworkInfo(module)
- hcloud.get_networks()
- result = hcloud.get_result()
- info = {
- 'hcloud_network_info': result['hcloud_network_info']
- }
- module.exit_json(**info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_rdns.py b/lib/ansible/modules/cloud/hcloud/hcloud_rdns.py
deleted file mode 100644
index db17c77485..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_rdns.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_rdns
-
-short_description: Create and manage reverse DNS entries on the Hetzner Cloud.
-
-version_added: "2.9"
-
-description:
- - Create, update and delete reverse DNS entries on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- server:
- description:
- - The name of the Hetzner Cloud server you want to add the reverse DNS entry to.
- type: str
- required: true
- ip_address:
- description:
- - The IP address that should point to I(dns_ptr).
- type: str
- required: true
- dns_ptr:
- description:
- - The DNS address the I(ip_address) should resolve to.
- - Omit the param to reset the reverse DNS entry to the default value.
- type: str
- state:
- description:
- - State of the reverse DNS entry.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.3.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a reverse DNS entry for a server
- hcloud_rdns:
- server: my-server
- ip_address: 123.123.123.123
- dns_ptr: example.com
- state: present
-
-- name: Ensure the reverse DNS entry is absent (remove if needed)
- hcloud_rdns:
- server: my-server
- ip_address: 123.123.123.123
- dns_ptr: example.com
- state: absent
-"""
-
-RETURN = """
-hcloud_rdns:
- description: The reverse DNS entry
- returned: always
- type: complex
- contains:
- server:
- description: Name of the server
- type: str
- returned: always
- sample: my-server
- ip_address:
- description: The IP address that point to the DNS ptr
- type: str
- returned: always
- sample: 123.123.123.123
- dns_ptr:
- description: The DNS that resolves to the IP
- type: str
- returned: always
- sample: example.com
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-from ansible.module_utils.network.common import utils
-
-try:
- from hcloud import APIException
-except ImportError:
- APIException = None
-
-
-class AnsibleHcloudReverseDNS(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudReverseDNS, self).__init__(module, "hcloud_rdns")
- self.hcloud_server = None
- self.hcloud_rdns = None
-
- def _prepare_result(self):
- return {
- "server": to_native(self.hcloud_server.name),
- "ip_address": to_native(self.hcloud_rdns["ip_address"]),
- "dns_ptr": to_native(self.hcloud_rdns["dns_ptr"]),
- }
-
- def _get_server(self):
- try:
- self.hcloud_server = self.client.servers.get_by_name(
- self.module.params.get("server")
- )
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _get_rdns(self):
- ip_address = self.module.params.get("ip_address")
- if utils.validate_ip_address(ip_address):
- if self.hcloud_server.public_net.ipv4.ip == ip_address:
- self.hcloud_rdns = {
- "ip_address": self.hcloud_server.public_net.ipv4.ip,
- "dns_ptr": self.hcloud_server.public_net.ipv4.dns_ptr,
- }
- else:
- self.module.fail_json(msg="The selected server does not have this IP address")
- elif utils.validate_ip_v6_address(ip_address):
- for ipv6_address_dns_ptr in self.hcloud_server.public_net.ipv6.dns_ptr:
- if ipv6_address_dns_ptr["ip"] == ip_address:
- self.hcloud_rdns = {
- "ip_address": ipv6_address_dns_ptr["ip"],
- "dns_ptr": ipv6_address_dns_ptr["dns_ptr"],
- }
- else:
- self.module.fail_json(msg="The given IP address is not valid")
-
- def _create_rdns(self):
- self.module.fail_on_missing_params(
- required_params=["dns_ptr"]
- )
- params = {
- "ip": self.module.params.get("ip_address"),
- "dns_ptr": self.module.params.get("dns_ptr"),
- }
-
- if not self.module.check_mode:
- self.hcloud_server.change_dns_ptr(**params).wait_until_finished()
-
- self._mark_as_changed()
- self._get_server()
- self._get_rdns()
-
- def _update_rdns(self):
- dns_ptr = self.module.params.get("dns_ptr")
- if dns_ptr != self.hcloud_rdns["dns_ptr"]:
- params = {
- "ip": self.module.params.get("ip_address"),
- "dns_ptr": dns_ptr,
- }
-
- if not self.module.check_mode:
- self.hcloud_server.change_dns_ptr(**params).wait_until_finished()
-
- self._mark_as_changed()
- self._get_server()
- self._get_rdns()
-
- def present_rdns(self):
- self._get_server()
- self._get_rdns()
- if self.hcloud_rdns is None:
- self._create_rdns()
- else:
- self._update_rdns()
-
- def delete_rdns(self):
- self._get_server()
- self._get_rdns()
- if self.hcloud_rdns is not None:
- if not self.module.check_mode:
- self.hcloud_server.change_dns_ptr(ip=self.hcloud_rdns['ip_address'], dns_ptr=None)
- self._mark_as_changed()
- self.hcloud_rdns = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- server={"type": "str", "required": True},
- ip_address={"type": "str", "required": True},
- dns_ptr={"type": "str"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudReverseDNS.define_module()
-
- hcloud = AnsibleHcloudReverseDNS(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_rdns()
- elif state == "present":
- hcloud.present_rdns()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_route.py b/lib/ansible/modules/cloud/hcloud/hcloud_route.py
deleted file mode 100644
index fe249534b6..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_route.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_route
-
-short_description: Create and delete cloud routes on the Hetzner Cloud.
-
-version_added: "2.9"
-
-description:
- - Create, update and delete cloud routes on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- network:
- description:
- - The name of the Hetzner Cloud Network.
- type: str
- required: true
- destination:
- description:
- - Destination network or host of this route.
- type: str
- required: true
- gateway:
- description:
- - Gateway for the route.
- type: str
- required: true
- state:
- description:
- - State of the route.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.3.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic route
- hcloud_route:
- network: my-network
- destination: 10.100.1.0/24
- gateway: 10.0.1.1
- state: present
-
-- name: Ensure the route is absent
- hcloud_route:
- network: my-network
- destination: 10.100.1.0/24
- gateway: 10.0.1.1
- state: absent
-"""
-
-RETURN = """
-hcloud_route:
- description: One Route of a Network
- returned: always
- type: complex
- contains:
- network:
- description: Name of the Network
- type: str
- returned: always
- sample: my-network
- destination:
- description: Destination network or host of this route
- type: str
- returned: always
- sample: 10.0.0.0/8
- gateway:
- description: Gateway of the route
- type: str
- returned: always
- sample: 10.0.0.1
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
- from hcloud.networks.domain import NetworkRoute
-except ImportError:
- APIException = None
- NetworkSubnet = None
-
-
-class AnsibleHcloudRoute(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudRoute, self).__init__(module, "hcloud_route")
- self.hcloud_network = None
- self.hcloud_route = None
-
- def _prepare_result(self):
- return {
- "network": to_native(self.hcloud_network.name),
- "destination": to_native(self.hcloud_route.destination),
- "gateway": self.hcloud_route.gateway,
- }
-
- def _get_network(self):
- try:
- self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
- self.hcloud_route = None
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _get_route(self):
- destination = self.module.params.get("destination")
- gateway = self.module.params.get("gateway")
- for route in self.hcloud_network.routes:
- if route.destination == destination and route.gateway == gateway:
- self.hcloud_route = route
-
- def _create_route(self):
- route = NetworkRoute(
- destination=self.module.params.get("destination"),
- gateway=self.module.params.get('gateway')
- )
-
- if not self.module.check_mode:
- try:
- self.hcloud_network.add_route(route=route).wait_until_finished()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- self._mark_as_changed()
- self._get_network()
- self._get_route()
-
- def present_route(self):
- self._get_network()
- self._get_route()
- if self.hcloud_route is None:
- self._create_route()
-
- def delete_route(self):
- self._get_network()
- self._get_route()
- if self.hcloud_route is not None and self.hcloud_network is not None:
- if not self.module.check_mode:
- self.hcloud_network.delete_route(self.hcloud_route).wait_until_finished()
- self._mark_as_changed()
- self.hcloud_route = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- network={"type": "str", "required": True},
- destination={"type": "str", "required": True},
- gateway={"type": "str", "required": True},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudRoute.define_module()
-
- hcloud = AnsibleHcloudRoute(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_route()
- elif state == "present":
- hcloud.present_route()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_server.py b/lib/ansible/modules/cloud/hcloud/hcloud_server.py
deleted file mode 100644
index 791c890a29..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_server.py
+++ /dev/null
@@ -1,555 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_server
-
-short_description: Create and manage cloud servers on the Hetzner Cloud.
-
-version_added: "2.8"
-
-description:
- - Create, update and manage cloud servers on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the Hetzner Cloud server to manage.
- - Only required if no server I(name) is given
- type: int
- name:
- description:
- - The Name of the Hetzner Cloud server to manage.
- - Only required if no server I(id) is given or a server does not exists.
- type: str
- server_type:
- description:
- - The Server Type of the Hetzner Cloud server to manage.
- - Required if server does not exists.
- type: str
- ssh_keys:
- description:
- - List of SSH key names
- - The key names correspond to the SSH keys configured for your
- Hetzner Cloud account access.
- type: list
- volumes:
- description:
- - List of Volumes IDs that should be attached to the server on server creation.
- type: list
- image:
- description:
- - Image the server should be created from.
- - Required if server does not exists.
- type: str
- location:
- description:
- - Location of Server.
- - Required if no I(datacenter) is given and server does not exists.
- type: str
- datacenter:
- description:
- - Datacenter of Server.
- - Required of no I(location) is given and server does not exists.
- type: str
- backups:
- description:
- - Enable or disable Backups for the given Server.
- type: bool
- default: no
- upgrade_disk:
- description:
- - Resize the disk size, when resizing a server.
- - If you want to downgrade the server later, this value should be False.
- type: bool
- default: no
- force_upgrade:
- description:
- - Force the upgrade of the server.
- - Power off the server if it is running on upgrade.
- type: bool
- default: no
- user_data:
- description:
- - User Data to be passed to the server on creation.
- - Only used if server does not exists.
- type: str
- rescue_mode:
- description:
- - Add the Hetzner rescue system type you want the server to be booted into.
- type: str
- version_added: 2.9
- labels:
- description:
- - User-defined labels (key-value pairs).
- type: dict
- delete_protection:
- description:
- - Protect the Server for deletion.
- - Needs to be the same as I(rebuild_protection).
- type: bool
- version_added: "2.10"
- rebuild_protection:
- description:
- - Protect the Server for rebuild.
- - Needs to be the same as I(delete_protection).
- type: bool
- version_added: "2.10"
- state:
- description:
- - State of the server.
- default: present
- choices: [ absent, present, restarted, started, stopped, rebuild ]
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic server
- hcloud_server:
- name: my-server
- server_type: cx11
- image: ubuntu-18.04
- state: present
-
-- name: Create a basic server with ssh key
- hcloud_server:
- name: my-server
- server_type: cx11
- image: ubuntu-18.04
- location: fsn1
- ssh_keys:
- - me@myorganisation
- state: present
-
-- name: Resize an existing server
- hcloud_server:
- name: my-server
- server_type: cx21
- upgrade_disk: yes
- state: present
-
-- name: Ensure the server is absent (remove if needed)
- hcloud_server:
- name: my-server
- state: absent
-
-- name: Ensure the server is started
- hcloud_server:
- name: my-server
- state: started
-
-- name: Ensure the server is stopped
- hcloud_server:
- name: my-server
- state: stopped
-
-- name: Ensure the server is restarted
- hcloud_server:
- name: my-server
- state: restarted
-
-- name: Ensure the server is will be booted in rescue mode and therefore restarted
- hcloud_server:
- name: my-server
- rescue_mode: linux64
- state: restarted
-
-- name: Ensure the server is rebuild
- hcloud_server:
- name: my-server
- image: ubuntu-18.04
- state: rebuild
-"""
-
-RETURN = """
-hcloud_server:
- description: The server instance
- returned: Always
- type: complex
- contains:
- id:
- description: Numeric identifier of the server
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the server
- returned: always
- type: str
- sample: my-server
- status:
- description: Status of the server
- returned: always
- type: str
- sample: running
- server_type:
- description: Name of the server type of the server
- returned: always
- type: str
- sample: cx11
- ipv4_address:
- description: Public IPv4 address of the server
- returned: always
- type: str
- sample: 116.203.104.109
- ipv6:
- description: IPv6 network of the server
- returned: always
- type: str
- sample: 2a01:4f8:1c1c:c140::/64
- location:
- description: Name of the location of the server
- returned: always
- type: str
- sample: fsn1
- datacenter:
- description: Name of the datacenter of the server
- returned: always
- type: str
- sample: fsn1-dc14
- rescue_enabled:
- description: True if rescue mode is enabled, Server will then boot into rescue system on next reboot
- returned: always
- type: bool
- sample: false
- backup_window:
- description: Time window (UTC) in which the backup will run, or null if the backups are not enabled
- returned: always
- type: bool
- sample: 22-02
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
- delete_protection:
- description: True if server is protected for deletion
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
- rebuild_protection:
- description: True if server is protected for rebuild
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud.volumes.domain import Volume
- from hcloud.ssh_keys.domain import SSHKey
- from hcloud.servers.domain import Server
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudServer(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_server")
- self.hcloud_server = None
-
- def _prepare_result(self):
- image = None if self.hcloud_server.image is None else to_native(self.hcloud_server.image.name)
- return {
- "id": to_native(self.hcloud_server.id),
- "name": to_native(self.hcloud_server.name),
- "ipv4_address": to_native(self.hcloud_server.public_net.ipv4.ip),
- "ipv6": to_native(self.hcloud_server.public_net.ipv6.ip),
- "image": image,
- "server_type": to_native(self.hcloud_server.server_type.name),
- "datacenter": to_native(self.hcloud_server.datacenter.name),
- "location": to_native(self.hcloud_server.datacenter.location.name),
- "rescue_enabled": self.hcloud_server.rescue_enabled,
- "backup_window": to_native(self.hcloud_server.backup_window),
- "labels": self.hcloud_server.labels,
- "delete_protection": self.hcloud_server.protection["delete"],
- "rebuild_protection": self.hcloud_server.protection["rebuild"],
- "status": to_native(self.hcloud_server.status),
- }
-
- def _get_server(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_server = self.client.servers.get_by_id(
- self.module.params.get("id")
- )
- else:
- self.hcloud_server = self.client.servers.get_by_name(
- self.module.params.get("name")
- )
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _create_server(self):
-
- self.module.fail_on_missing_params(
- required_params=["name", "server_type", "image"]
- )
- params = {
- "name": self.module.params.get("name"),
- "server_type": self.client.server_types.get_by_name(
- self.module.params.get("server_type")
- ),
- "user_data": self.module.params.get("user_data"),
- "labels": self.module.params.get("labels"),
- }
- if self.client.images.get_by_name(self.module.params.get("image")) is not None:
- # When image name is not available look for id instead
- params["image"] = self.client.images.get_by_name(self.module.params.get("image"))
- else:
- params["image"] = self.client.images.get_by_id(self.module.params.get("image"))
-
- if self.module.params.get("ssh_keys") is not None:
- params["ssh_keys"] = [
- SSHKey(name=ssh_key_name)
- for ssh_key_name in self.module.params.get("ssh_keys")
- ]
-
- if self.module.params.get("volumes") is not None:
- params["volumes"] = [
- Volume(id=volume_id) for volume_id in self.module.params.get("volumes")
- ]
-
- if self.module.params.get("location") is None and self.module.params.get("datacenter") is None:
- # When not given, the API will choose the location.
- params["location"] = None
- params["datacenter"] = None
- elif self.module.params.get("location") is not None and self.module.params.get("datacenter") is None:
- params["location"] = self.client.locations.get_by_name(
- self.module.params.get("location")
- )
- elif self.module.params.get("location") is None and self.module.params.get("datacenter") is not None:
- params["datacenter"] = self.client.datacenters.get_by_name(
- self.module.params.get("datacenter")
- )
-
- if not self.module.check_mode:
- resp = self.client.servers.create(**params)
- self.result["root_password"] = resp.root_password
- resp.action.wait_until_finished(max_retries=1000)
- [action.wait_until_finished() for action in resp.next_actions]
-
- rescue_mode = self.module.params.get("rescue_mode")
- if rescue_mode:
- self._get_server()
- self._set_rescue_mode(rescue_mode)
-
- self._mark_as_changed()
- self._get_server()
-
- def _update_server(self):
- try:
- rescue_mode = self.module.params.get("rescue_mode")
- if rescue_mode and self.hcloud_server.rescue_enabled is False:
- if not self.module.check_mode:
- self._set_rescue_mode(rescue_mode)
- self._mark_as_changed()
- elif not rescue_mode and self.hcloud_server.rescue_enabled is True:
- if not self.module.check_mode:
- self.hcloud_server.disable_rescue().wait_until_finished()
- self._mark_as_changed()
-
- if self.module.params.get("backups") and self.hcloud_server.backup_window is None:
- if not self.module.check_mode:
- self.hcloud_server.enable_backup().wait_until_finished()
- self._mark_as_changed()
- elif not self.module.params.get("backups") and self.hcloud_server.backup_window is not None:
- if not self.module.check_mode:
- self.hcloud_server.disable_backup().wait_until_finished()
- self._mark_as_changed()
-
- labels = self.module.params.get("labels")
- if labels is not None and labels != self.hcloud_server.labels:
- if not self.module.check_mode:
- self.hcloud_server.update(labels=labels)
- self._mark_as_changed()
-
- server_type = self.module.params.get("server_type")
- if server_type is not None and self.hcloud_server.server_type.name != server_type:
- previous_server_status = self.hcloud_server.status
- state = self.module.params.get("state")
- if previous_server_status == Server.STATUS_RUNNING:
- if not self.module.check_mode:
- if self.module.params.get("force_upgrade") or state == "stopped":
- self.stop_server() # Only stopped server can be upgraded
- else:
- self.module.warn(
- "You can not upgrade a running instance %s. You need to stop the instance or use force_upgrade=yes."
- % self.hcloud_server.name
- )
- timeout = 100
- if self.module.params.get("upgrade_disk"):
- timeout = (
- 1000
- ) # When we upgrade the disk too the resize progress takes some more time.
- if not self.module.check_mode:
- self.hcloud_server.change_type(
- server_type=self.client.server_types.get_by_name(server_type),
- upgrade_disk=self.module.params.get("upgrade_disk"),
- ).wait_until_finished(timeout)
- if state == "present" and previous_server_status == Server.STATUS_RUNNING or state == "started":
- self.start_server()
-
- self._mark_as_changed()
-
- delete_protection = self.module.params.get("delete_protection")
- rebuild_protection = self.module.params.get("rebuild_protection")
- if (delete_protection is not None and rebuild_protection is not None) and (
- delete_protection != self.hcloud_server.protection["delete"] or rebuild_protection !=
- self.hcloud_server.protection["rebuild"]):
- if not self.module.check_mode:
- self.hcloud_server.change_protection(delete=delete_protection,
- rebuild=rebuild_protection).wait_until_finished()
- self._mark_as_changed()
- self._get_server()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _set_rescue_mode(self, rescue_mode):
- if self.module.params.get("ssh_keys"):
- resp = self.hcloud_server.enable_rescue(type=rescue_mode,
- ssh_keys=[self.client.ssh_keys.get_by_name(ssh_key_name).id
- for
- ssh_key_name in
- self.module.params.get("ssh_keys")])
- else:
- resp = self.hcloud_server.enable_rescue(type=rescue_mode)
- resp.action.wait_until_finished()
- self.result["root_password"] = resp.root_password
-
- def start_server(self):
- try:
- if self.hcloud_server.status != Server.STATUS_RUNNING:
- if not self.module.check_mode:
- self.client.servers.power_on(self.hcloud_server).wait_until_finished()
- self._mark_as_changed()
- self._get_server()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def stop_server(self):
- try:
- if self.hcloud_server.status != Server.STATUS_OFF:
- if not self.module.check_mode:
- self.client.servers.power_off(self.hcloud_server).wait_until_finished()
- self._mark_as_changed()
- self._get_server()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def rebuild_server(self):
- self.module.fail_on_missing_params(
- required_params=["image"]
- )
- try:
- if not self.module.check_mode:
- self.client.servers.rebuild(self.hcloud_server, self.client.images.get_by_name(
- self.module.params.get("image"))).wait_until_finished()
- self._mark_as_changed()
-
- self._get_server()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def present_server(self):
- self._get_server()
- if self.hcloud_server is None:
- self._create_server()
- else:
- self._update_server()
-
- def delete_server(self):
- try:
- self._get_server()
- if self.hcloud_server is not None:
- if not self.module.check_mode:
- self.client.servers.delete(self.hcloud_server).wait_until_finished()
- self._mark_as_changed()
- self.hcloud_server = None
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- image={"type": "str"},
- server_type={"type": "str"},
- location={"type": "str"},
- datacenter={"type": "str"},
- user_data={"type": "str"},
- ssh_keys={"type": "list"},
- volumes={"type": "list"},
- labels={"type": "dict"},
- backups={"type": "bool", "default": False},
- upgrade_disk={"type": "bool", "default": False},
- force_upgrade={"type": "bool", "default": False},
- rescue_mode={"type": "str"},
- delete_protection={"type": "bool"},
- rebuild_protection={"type": "bool"},
- state={
- "choices": ["absent", "present", "restarted", "started", "stopped", "rebuild"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- required_one_of=[['id', 'name']],
- mutually_exclusive=[["location", "datacenter"]],
- required_together=[["delete_protection", "rebuild_protection"]],
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudServer.define_module()
-
- hcloud = AnsibleHcloudServer(module)
- state = module.params.get("state")
- if state == "absent":
- hcloud.delete_server()
- elif state == "present":
- hcloud.present_server()
- elif state == "started":
- hcloud.present_server()
- hcloud.start_server()
- elif state == "stopped":
- hcloud.present_server()
- hcloud.stop_server()
- elif state == "restarted":
- hcloud.present_server()
- hcloud.stop_server()
- hcloud.start_server()
- elif state == "rebuild":
- hcloud.present_server()
- hcloud.rebuild_server()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_server_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_server_info.py
deleted file mode 100644
index 87a8396bf3..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_server_info.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_server_info
-
-short_description: Gather infos about your Hetzner Cloud servers.
-
-version_added: "2.8"
-
-description:
- - Gather infos about your Hetzner Cloud servers.
- - This module was called C(hcloud_server_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_server_facts).
- Note that the M(hcloud_server_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_server_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the server you want to get.
- type: int
- name:
- description:
- - The name of the server you want to get.
- type: str
- label_selector:
- description:
- - The label selector for the server you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud server infos
- hcloud_server_info:
- register: output
-
-- name: Print the gathered infos
- debug:
- var: output.hcloud_server_info
-"""
-
-RETURN = """
-hcloud_server_info:
- description: The server infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the server
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the server
- returned: always
- type: str
- sample: my-server
- status:
- description: Status of the server
- returned: always
- type: str
- sample: running
- server_type:
- description: Name of the server type of the server
- returned: always
- type: str
- sample: cx11
- ipv4_address:
- description: Public IPv4 address of the server
- returned: always
- type: str
- sample: 116.203.104.109
- ipv6:
- description: IPv6 network of the server
- returned: always
- type: str
- sample: 2a01:4f8:1c1c:c140::/64
- location:
- description: Name of the location of the server
- returned: always
- type: str
- sample: fsn1
- datacenter:
- description: Name of the datacenter of the server
- returned: always
- type: str
- sample: fsn1-dc14
- rescue_enabled:
- description: True if rescue mode is enabled, Server will then boot into rescue system on next reboot
- returned: always
- type: bool
- sample: false
- backup_window:
- description: Time window (UTC) in which the backup will run, or null if the backups are not enabled
- returned: always
- type: bool
- sample: 22-02
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
- delete_protection:
- description: True if server is protected for deletion
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
- rebuild_protection:
- description: True if server is protected for rebuild
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudServerInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_server_info")
- self.hcloud_server_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for server in self.hcloud_server_info:
- if server is not None:
- image = None if server.image is None else to_native(server.image.name)
- tmp.append({
- "id": to_native(server.id),
- "name": to_native(server.name),
- "ipv4_address": to_native(server.public_net.ipv4.ip),
- "ipv6": to_native(server.public_net.ipv6.ip),
- "image": image,
- "server_type": to_native(server.server_type.name),
- "datacenter": to_native(server.datacenter.name),
- "location": to_native(server.datacenter.location.name),
- "rescue_enabled": server.rescue_enabled,
- "backup_window": to_native(server.backup_window),
- "labels": server.labels,
- "status": to_native(server.status),
- "delete_protection": server.protection["delete"],
- "rebuild_protection": server.protection["rebuild"],
- })
- return tmp
-
- def get_servers(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_server_info = [self.client.servers.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_server_info = [self.client.servers.get_by_name(
- self.module.params.get("name")
- )]
- elif self.module.params.get("label_selector") is not None:
- self.hcloud_server_info = self.client.servers.get_all(
- label_selector=self.module.params.get("label_selector"))
- else:
- self.hcloud_server_info = self.client.servers.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- label_selector={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudServerInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_server_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_server_facts' module has been renamed to 'hcloud_server_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudServerInfo(module)
- hcloud.get_servers()
- result = hcloud.get_result()
-
- if is_old_facts:
- ansible_info = {
- 'hcloud_server_facts': result['hcloud_server_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_server_info': result['hcloud_server_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_server_network.py b/lib/ansible/modules/cloud/hcloud/hcloud_server_network.py
deleted file mode 100644
index 74cfae9525..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_server_network.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_server_network
-
-short_description: Manage the relationship between Hetzner Cloud Networks and servers
-
-version_added: "2.9"
-
-description:
- - Create and delete the relationship Hetzner Cloud Networks and servers
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- network:
- description:
- - The name of the Hetzner Cloud Networks.
-
- type: str
- required: true
- server:
- description:
- - The name of the Hetzner Cloud server.
- type: str
- required: true
- ip:
- description:
- - The IP the server should have.
- type: str
- alias_ips:
- description:
- - Alias IPs the server has.
- type: list
- state:
- description:
- - State of the server_network.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.3.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic server network
- hcloud_server_network:
- network: my-network
- server: my-server
- state: present
-
-- name: Create a server network and specify the ip address
- hcloud_server_network:
- network: my-network
- server: my-server
- ip: 10.0.0.1
- state: present
-
-- name: Create a server network and add alias ips
- hcloud_server_network:
- network: my-network
- server: my-server
- ip: 10.0.0.1
- alias_ips:
- - 10.1.0.1
- - 10.2.0.1
- state: present
-
-- name: Ensure the server network is absent (remove if needed)
- hcloud_server_network:
- network: my-network
- server: my-server
- state: absent
-"""
-
-RETURN = """
-hcloud_server_network:
- description: The relationship between a server and a network
- returned: always
- type: complex
- contains:
- network:
- description: Name of the Network
- type: str
- returned: always
- sample: my-network
- server:
- description: Name of the server
- type: str
- returned: always
- sample: my-server
- ip:
- description: IP of the server within the Network ip range
- type: str
- returned: always
- sample: 10.0.0.8
- alias_ips:
- description: Alias IPs of the server within the Network ip range
- type: str
- returned: always
- sample: [10.1.0.1, ...]
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- APIException = None
- NetworkSubnet = None
-
-
-class AnsibleHcloudServerNetwork(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudServerNetwork, self).__init__(module, "hcloud_server_network")
- self.hcloud_network = None
- self.hcloud_server = None
- self.hcloud_server_network = None
-
- def _prepare_result(self):
- return {
- "network": to_native(self.hcloud_network.name),
- "server": to_native(self.hcloud_server.name),
- "ip": to_native(self.hcloud_server_network.ip),
- "alias_ips": self.hcloud_server_network.alias_ips,
- }
-
- def _get_server_and_network(self):
- try:
- self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
- self.hcloud_server = self.client.servers.get_by_name(self.module.params.get("server"))
- self.hcloud_server_network = None
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _get_server_network(self):
- for privateNet in self.hcloud_server.private_net:
- if privateNet.network.id == self.hcloud_network.id:
- self.hcloud_server_network = privateNet
-
- def _create_server_network(self):
- params = {
- "network": self.hcloud_network
- }
-
- if self.module.params.get("ip") is not None:
- params["ip"] = self.module.params.get("ip")
- if self.module.params.get("alias_ips") is not None:
- params["alias_ips"] = self.module.params.get("alias_ips")
-
- if not self.module.check_mode:
- try:
- self.hcloud_server.attach_to_network(**params).wait_until_finished()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- self._mark_as_changed()
- self._get_server_and_network()
- self._get_server_network()
-
- def present_server_network(self):
- self._get_server_and_network()
- self._get_server_network()
- if self.hcloud_server_network is None:
- self._create_server_network()
-
- def delete_server_network(self):
- self._get_server_and_network()
- self._get_server_network()
- if self.hcloud_server_network is not None and self.hcloud_server is not None:
- if not self.module.check_mode:
- self.hcloud_server.detach_from_network(self.hcloud_server_network.network).wait_until_finished()
- self._mark_as_changed()
- self.hcloud_server_network = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- network={"type": "str", "required": True},
- server={"type": "str", "required": True},
- ip={"type": "str"},
- alias_ips={"type": "list"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudServerNetwork.define_module()
-
- hcloud = AnsibleHcloudServerNetwork(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_server_network()
- elif state == "present":
- hcloud.present_server_network()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_server_type_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_server_type_info.py
deleted file mode 100644
index 88793260fd..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_server_type_info.py
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_server_type_info
-
-short_description: Gather infos about the Hetzner Cloud server types.
-
-version_added: "2.8"
-
-description:
- - Gather infos about your Hetzner Cloud server types.
- - This module was called C(hcloud_server_type_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_server_type_facts).
- Note that the M(hcloud_server_type_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_server_type_info)!
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the server type you want to get.
- type: int
- name:
- description:
- - The name of the server type you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud server type infos
- hcloud_server_type_info:
- register: output
-
-- name: Print the gathered infos
- debug:
- var: output.hcloud_server_type_info
-"""
-
-RETURN = """
-hcloud_server_type_info:
- description: The server type infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the server type
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the server type
- returned: always
- type: str
- sample: fsn1
- description:
- description: Detail description of the server type
- returned: always
- type: str
- sample: Falkenstein DC Park 1
- cores:
- description: Number of cpu cores a server of this type will have
- returned: always
- type: int
- sample: 1
- memory:
- description: Memory a server of this type will have in GB
- returned: always
- type: int
- sample: 1
- disk:
- description: Disk size a server of this type will have in GB
- returned: always
- type: int
- sample: 25
- storage_type:
- description: Type of server boot drive
- returned: always
- type: str
- sample: local
- cpu_type:
- description: Type of cpu
- returned: always
- type: str
- sample: shared
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudServerTypeInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_server_type_info")
- self.hcloud_server_type_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for server_type in self.hcloud_server_type_info:
- if server_type is not None:
- tmp.append({
- "id": to_native(server_type.id),
- "name": to_native(server_type.name),
- "description": to_native(server_type.description),
- "cores": server_type.cores,
- "memory": server_type.memory,
- "disk": server_type.disk,
- "storage_type": to_native(server_type.storage_type),
- "cpu_type": to_native(server_type.cpu_type)
- })
- return tmp
-
- def get_server_types(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_server_type_info = [self.client.server_types.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_server_type_info = [self.client.server_types.get_by_name(
- self.module.params.get("name")
- )]
- else:
- self.hcloud_server_type_info = self.client.server_types.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudServerTypeInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_server_type_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_server_type_info' module has been renamed to 'hcloud_server_type_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudServerTypeInfo(module)
- hcloud.get_server_types()
- result = hcloud.get_result()
- if is_old_facts:
- ansible_info = {
- 'hcloud_server_type_info': result['hcloud_server_type_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_server_type_info': result['hcloud_server_type_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key.py b/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key.py
deleted file mode 100644
index b19473d8a8..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key.py
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_ssh_key
-
-short_description: Create and manage ssh keys on the Hetzner Cloud.
-
-version_added: "2.8"
-
-description:
- - Create, update and manage ssh keys on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the Hetzner Cloud ssh_key to manage.
- - Only required if no ssh_key I(name) is given
- type: int
- name:
- description:
- - The Name of the Hetzner Cloud ssh_key to manage.
- - Only required if no ssh_key I(id) is given or a ssh_key does not exists.
- type: str
- fingerprint:
- description:
- - The Fingerprint of the Hetzner Cloud ssh_key to manage.
- - Only required if no ssh_key I(id) or I(name) is given.
- type: str
- labels:
- description:
- - User-defined labels (key-value pairs)
- type: dict
- public_key:
- description:
- - The Public Key to add.
- - Required if ssh_key does not exists.
- type: str
- state:
- description:
- - State of the ssh_key.
- default: present
- choices: [ absent, present ]
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic ssh_key
- hcloud_ssh_key:
- name: my-ssh_key
- public_key: "ssh-rsa AAAjjk76kgf...Xt"
- state: present
-
-- name: Create a ssh_key with labels
- hcloud_ssh_key:
- name: my-ssh_key
- public_key: "ssh-rsa AAAjjk76kgf...Xt"
- labels:
- key: value
- mylabel: 123
- state: present
-
-- name: Ensure the ssh_key is absent (remove if needed)
- hcloud_ssh_key:
- name: my-ssh_key
- state: absent
-"""
-
-RETURN = """
-hcloud_ssh_key:
- description: The ssh_key instance
- returned: Always
- type: complex
- contains:
- id:
- description: ID of the ssh_key
- type: int
- returned: Always
- sample: 12345
- name:
- description: Name of the ssh_key
- type: str
- returned: Always
- sample: my-ssh-key
- fingerprint:
- description: Fingerprint of the ssh_key
- type: str
- returned: Always
- sample: b7:2f:30:a0:2f:6c:58:6c:21:04:58:61:ba:06:3b:2f
- public_key:
- description: Public key of the ssh_key
- type: str
- returned: Always
- sample: "ssh-rsa AAAjjk76kgf...Xt"
- labels:
- description: User-defined labels (key-value pairs)
- type: dict
- returned: Always
- sample:
- key: value
- mylabel: 123
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud.volumes.domain import Volume
- from hcloud.ssh_keys.domain import SSHKey
- from hcloud.ssh_keys.domain import Server
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudSSHKey(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_ssh_key")
- self.hcloud_ssh_key = None
-
- def _prepare_result(self):
- return {
- "id": to_native(self.hcloud_ssh_key.id),
- "name": to_native(self.hcloud_ssh_key.name),
- "fingerprint": to_native(self.hcloud_ssh_key.fingerprint),
- "public_key": to_native(self.hcloud_ssh_key.public_key),
- "labels": self.hcloud_ssh_key.labels,
- }
-
- def _get_ssh_key(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_ssh_key = self.client.ssh_keys.get_by_id(
- self.module.params.get("id")
- )
- elif self.module.params.get("fingerprint") is not None:
- self.hcloud_ssh_key = self.client.ssh_keys.get_by_fingerprint(
- self.module.params.get("fingerprint")
- )
- elif self.module.params.get("name") is not None:
- self.hcloud_ssh_key = self.client.ssh_keys.get_by_name(
- self.module.params.get("name")
- )
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _create_ssh_key(self):
- self.module.fail_on_missing_params(
- required_params=["name", "public_key"]
- )
- params = {
- "name": self.module.params.get("name"),
- "public_key": self.module.params.get("public_key"),
- "labels": self.module.params.get("labels")
- }
-
- if not self.module.check_mode:
- self.client.ssh_keys.create(**params)
- self._mark_as_changed()
- self._get_ssh_key()
-
- def _update_ssh_key(self):
- name = self.module.params.get("name")
- if name is not None and self.hcloud_ssh_key.name != name:
- self.module.fail_on_missing_params(
- required_params=["id"]
- )
- if not self.module.check_mode:
- self.hcloud_ssh_key.update(name=name)
- self._mark_as_changed()
-
- labels = self.module.params.get("labels")
- if labels is not None and self.hcloud_ssh_key.labels != labels:
- if not self.module.check_mode:
- self.hcloud_ssh_key.update(labels=labels)
- self._mark_as_changed()
-
- self._get_ssh_key()
-
- def present_ssh_key(self):
- self._get_ssh_key()
- if self.hcloud_ssh_key is None:
- self._create_ssh_key()
- else:
- self._update_ssh_key()
-
- def delete_ssh_key(self):
- self._get_ssh_key()
- if self.hcloud_ssh_key is not None:
- if not self.module.check_mode:
- self.client.ssh_keys.delete(self.hcloud_ssh_key)
- self._mark_as_changed()
- self.hcloud_ssh_key = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- public_key={"type": "str"},
- fingerprint={"type": "str"},
- labels={"type": "dict"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- required_one_of=[['id', 'name', 'fingerprint']],
- required_if=[['state', 'present', ['name']]],
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudSSHKey.define_module()
-
- hcloud = AnsibleHcloudSSHKey(module)
- state = module.params.get("state")
- if state == "absent":
- hcloud.delete_ssh_key()
- elif state == "present":
- hcloud.present_ssh_key()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key_info.py
deleted file mode 100644
index 531ba20a93..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_ssh_key_info.py
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_ssh_key_info
-short_description: Gather infos about your Hetzner Cloud ssh_keys.
-version_added: "2.8"
-description:
- - Gather facts about your Hetzner Cloud ssh_keys.
- - This module was called C(hcloud_ssh_key_facts) before Ansible 2.9, returning C(ansible_facts) and C(hcloud_ssh_key_facts).
- Note that the M(hcloud_ssh_key_info) module no longer returns C(ansible_facts) and the value was renamed to C(hcloud_ssh_key_info)!
-author:
- - Christopher Schmitt (@cschmitt-hcloud)
-options:
- id:
- description:
- - The ID of the ssh key you want to get.
- type: int
- name:
- description:
- - The name of the ssh key you want to get.
- type: str
- fingerprint:
- description:
- - The fingerprint of the ssh key you want to get.
- type: str
- label_selector:
- description:
- - The label selector for the ssh key you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud sshkey infos
- hcloud_ssh_key_info:
- register: output
-- name: Print the gathered infos
- debug:
- var: output.hcloud_ssh_key_info
-"""
-
-RETURN = """
-hcloud_ssh_key_info:
- description: The ssh key instances
- returned: Always
- type: complex
- contains:
- id:
- description: Numeric identifier of the ssh_key
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the ssh_key
- returned: always
- type: str
- sample: my-ssh-key
- fingerprint:
- description: Fingerprint of the ssh key
- returned: always
- type: str
- sample: 0e:e0:bd:c7:2d:1f:69:49:94:44:91:f1:19:fd:35:f3
- public_key:
- description: The actual public key
- returned: always
- type: str
- sample: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGpl/tnk74nnQJxxLAtutUApUZMRJxryKh7VXkNbd4g9 john@example.com"
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
-"""
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudSSHKeyInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_ssh_key_info")
- self.hcloud_ssh_key_info = None
-
- def _prepare_result(self):
- ssh_keys = []
-
- for ssh_key in self.hcloud_ssh_key_info:
- if ssh_key:
- ssh_keys.append({
- "id": to_native(ssh_key.id),
- "name": to_native(ssh_key.name),
- "fingerprint": to_native(ssh_key.fingerprint),
- "public_key": to_native(ssh_key.public_key),
- "labels": ssh_key.labels
- })
- return ssh_keys
-
- def get_ssh_keys(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_ssh_key_info = [self.client.ssh_keys.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_ssh_key_info = [self.client.ssh_keys.get_by_name(
- self.module.params.get("name")
- )]
- elif self.module.params.get("fingerprint") is not None:
- self.hcloud_ssh_key_info = [self.client.ssh_keys.get_by_fingerprint(
- self.module.params.get("fingerprint")
- )]
- elif self.module.params.get("label_selector") is not None:
- self.hcloud_ssh_key_info = self.client.ssh_keys.get_all(
- label_selector=self.module.params.get("label_selector"))
- else:
- self.hcloud_ssh_key_info = self.client.ssh_keys.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- fingerprint={"type": "str"},
- label_selector={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudSSHKeyInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_ssh_key_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_ssh_key_facts' module has been renamed to 'hcloud_ssh_key_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudSSHKeyInfo(module)
- hcloud.get_ssh_keys()
- result = hcloud.get_result()
-
- if is_old_facts:
- ansible_info = {
- 'hcloud_ssh_key_facts': result['hcloud_ssh_key_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_ssh_key_info': result['hcloud_ssh_key_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_subnetwork.py b/lib/ansible/modules/cloud/hcloud/hcloud_subnetwork.py
deleted file mode 100644
index 90fafd5fb6..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_subnetwork.py
+++ /dev/null
@@ -1,221 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_subnetwork
-
-short_description: Manage cloud subnetworks on the Hetzner Cloud.
-
-version_added: "2.9"
-
-description:
- - Create, update and delete cloud subnetworks on the Hetzner Cloud.
-
-author:
- - Lukas Kaemmerling (@lkaemmerling)
-
-options:
- network:
- description:
- - The ID or Name of the Hetzner Cloud Networks.
-
- type: str
- required: true
- ip_range:
- description:
- - IP range of the subnetwork.
- type: str
- required: true
- type:
- description:
- - Type of subnetwork.
- type: str
- required: true
- network_zone:
- description:
- - Name of network zone.
- type: str
- required: true
- state:
- description:
- - State of the subnetwork.
- default: present
- choices: [ absent, present ]
- type: str
-
-requirements:
- - hcloud-python >= 1.3.0
-
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a basic subnetwork
- hcloud_subnetwork:
- network: my-network
- ip_range: 10.0.0.0/16
- network_zone: eu-central
- type: server
- state: present
-
-- name: Ensure the subnetwork is absent (remove if needed)
- hcloud_subnetwork:
- network: my-network
- ip_range: 10.0.0.0/8
- network_zone: eu-central
- type: server
- state: absent
-"""
-
-RETURN = """
-hcloud_subnetwork:
- description: One Subnet of a Network
- returned: always
- type: complex
- contains:
- network:
- description: Name of the Network
- type: str
- returned: always
- sample: my-network
- ip_range:
- description: IP range of the Network
- type: str
- returned: always
- sample: 10.0.0.0/8
- type:
- description: Type of subnetwork
- type: str
- returned: always
- sample: server
- network_zone:
- description: Name of network zone
- type: str
- returned: always
- sample: eu-central
- gateway:
- description: Gateway of the subnetwork
- type: str
- returned: always
- sample: 10.0.0.1
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
- from hcloud.networks.domain import NetworkSubnet
-except ImportError:
- APIException = None
- NetworkSubnet = None
-
-
-class AnsibleHcloudSubnetwork(Hcloud):
- def __init__(self, module):
- super(AnsibleHcloudSubnetwork, self).__init__(module, "hcloud_subnetwork")
- self.hcloud_network = None
- self.hcloud_subnetwork = None
-
- def _prepare_result(self):
- return {
- "network": to_native(self.hcloud_network.name),
- "ip_range": to_native(self.hcloud_subnetwork.ip_range),
- "type": to_native(self.hcloud_subnetwork.type),
- "network_zone": to_native(self.hcloud_subnetwork.network_zone),
- "gateway": self.hcloud_subnetwork.gateway,
- }
-
- def _get_network(self):
- try:
- self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
- self.hcloud_subnetwork = None
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _get_subnetwork(self):
- subnet_ip_range = self.module.params.get("ip_range")
- for subnetwork in self.hcloud_network.subnets:
- if subnetwork.ip_range == subnet_ip_range:
- self.hcloud_subnetwork = subnetwork
-
- def _create_subnetwork(self):
- subnet = NetworkSubnet(
- ip_range=self.module.params.get("ip_range"),
- type=self.module.params.get('type'),
- network_zone=self.module.params.get('network_zone')
- )
-
- if not self.module.check_mode:
- try:
- self.hcloud_network.add_subnet(subnet=subnet).wait_until_finished()
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- self._mark_as_changed()
- self._get_network()
- self._get_subnetwork()
-
- def present_subnetwork(self):
- self._get_network()
- self._get_subnetwork()
- if self.hcloud_subnetwork is None:
- self._create_subnetwork()
-
- def delete_subnetwork(self):
- self._get_network()
- self._get_subnetwork()
- if self.hcloud_subnetwork is not None and self.hcloud_network is not None:
- if not self.module.check_mode:
- self.hcloud_network.delete_subnet(self.hcloud_subnetwork).wait_until_finished()
- self._mark_as_changed()
- self.hcloud_subnetwork = None
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- network={"type": "str", "required": True},
- network_zone={"type": "str", "required": True},
- type={"type": "str", "required": True},
- ip_range={"type": "str", "required": True},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudSubnetwork.define_module()
-
- hcloud = AnsibleHcloudSubnetwork(module)
- state = module.params["state"]
- if state == "absent":
- hcloud.delete_subnetwork()
- elif state == "present":
- hcloud.present_subnetwork()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_volume.py b/lib/ansible/modules/cloud/hcloud/hcloud_volume.py
deleted file mode 100644
index db141b264d..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_volume.py
+++ /dev/null
@@ -1,344 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_volume
-
-short_description: Create and manage block Volume on the Hetzner Cloud.
-
-version_added: "2.8"
-
-description:
- - Create, update and attach/detach block Volume on the Hetzner Cloud.
-
-author:
- - Christopher Schmitt (@cschmitt-hcloud)
-
-options:
- id:
- description:
- - The ID of the Hetzner Cloud Block Volume to manage.
- - Only required if no volume I(name) is given
- type: int
- name:
- description:
- - The Name of the Hetzner Cloud Block Volume to manage.
- - Only required if no volume I(id) is given or a volume does not exists.
- type: str
- size:
- description:
- - The size of the Block Volume in GB.
- - Required if volume does not yet exists.
- type: int
- automount:
- description:
- - Automatically mount the Volume.
- type: bool
- format:
- description:
- - Automatically Format the volume on creation
- - Can only be used in case the Volume does not exists.
- type: str
- choices: [xfs, ext4]
- location:
- description:
- - Location of the Hetzner Cloud Volume.
- - Required if no I(server) is given and Volume does not exists.
- type: str
- server:
- description:
- - Server Name the Volume should be assigned to.
- - Required if no I(location) is given and Volume does not exists.
- type: str
- delete_protection:
- description:
- - Protect the Volume for deletion.
- type: bool
- version_added: "2.10"
- labels:
- description:
- - User-defined key-value pairs.
- type: dict
- state:
- description:
- - State of the Volume.
- default: present
- choices: [absent, present]
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Create a Volume
- hcloud_volume:
- name: my-volume
- location: fsn1
- size: 100
- state: present
-- name: Create a Volume and format it with ext4
- hcloud_volume:
- name: my-volume
- location: fsn
- format: ext4
- size: 100
- state: present
-- name: Mount a existing Volume and automount
- hcloud_volume:
- name: my-volume
- server: my-server
- automount: yes
- state: present
-- name: Mount a existing Volume and automount
- hcloud_volume:
- name: my-volume
- server: my-server
- automount: yes
- state: present
-- name: Ensure the Volume is absent (remove if needed)
- hcloud_volume:
- name: my-volume
- state: absent
-"""
-
-RETURN = """
-hcloud_volume:
- description: The block Volume
- returned: Always
- type: complex
- contains:
- id:
- description: ID of the Volume
- type: int
- returned: Always
- sample: 12345
- name:
- description: Name of the Volume
- type: str
- returned: Always
- sample: my-volume
- size:
- description: Size in GB of the Volume
- type: int
- returned: Always
- sample: 1337
- linux_device:
- description: Path to the device that contains the Volume.
- returned: always
- type: str
- sample: /dev/disk/by-id/scsi-0HC_Volume_12345
- version_added: "2.10"
- location:
- description: Location name where the Volume is located at
- type: str
- returned: Always
- sample: "fsn1"
- labels:
- description: User-defined labels (key-value pairs)
- type: dict
- returned: Always
- sample:
- key: value
- mylabel: 123
- server:
- description: Server name where the Volume is attached to
- type: str
- returned: Always
- sample: "my-server"
- delete_protection:
- description: True if Volume is protected for deletion
- type: bool
- returned: always
- sample: false
- version_added: "2.10"
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud.volumes.domain import Volume
- from hcloud.servers.domain import Server
- import hcloud
-except ImportError:
- pass
-
-
-class AnsibleHcloudVolume(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_volume")
- self.hcloud_volume = None
-
- def _prepare_result(self):
- server_name = None
- if self.hcloud_volume.server is not None:
- server_name = self.hcloud_volume.server.name
-
- return {
- "id": to_native(self.hcloud_volume.id),
- "name": to_native(self.hcloud_volume.name),
- "size": self.hcloud_volume.size,
- "location": to_native(self.hcloud_volume.location.name),
- "labels": self.hcloud_volume.labels,
- "server": to_native(server_name),
- "linux_device": to_native(self.hcloud_volume.linux_device),
- "delete_protection": self.hcloud_volume.protection["delete"],
- }
-
- def _get_volume(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_volume = self.client.volumes.get_by_id(
- self.module.params.get("id")
- )
- else:
- self.hcloud_volume = self.client.volumes.get_by_name(
- self.module.params.get("name")
- )
- except hcloud.APIException as e:
- self.module.fail_json(msg=e.message)
-
- def _create_volume(self):
- self.module.fail_on_missing_params(
- required_params=["name", "size"]
- )
- params = {
- "name": self.module.params.get("name"),
- "size": self.module.params.get("size"),
- "automount": self.module.params.get("automount"),
- "format": self.module.params.get("format"),
- "labels": self.module.params.get("labels")
- }
- if self.module.params.get("server") is not None:
- params['server'] = self.client.servers.get_by_name(self.module.params.get("server"))
- elif self.module.params.get("location") is not None:
- params['location'] = self.client.locations.get_by_name(self.module.params.get("location"))
- else:
- self.module.fail_json(msg="server or location is required")
-
- if not self.module.check_mode:
- resp = self.client.volumes.create(**params)
- resp.action.wait_until_finished()
- [action.wait_until_finished() for action in resp.next_actions]
-
- self._mark_as_changed()
- self._get_volume()
-
- def _update_volume(self):
- try:
- size = self.module.params.get("size")
- if size:
- if self.hcloud_volume.size < size:
- if not self.module.check_mode:
- self.hcloud_volume.resize(size).wait_until_finished()
- self._mark_as_changed()
- elif self.hcloud_volume.size > size:
- self.module.warn("Shrinking of volumes is not supported")
-
- server_name = self.module.params.get("server")
- if server_name:
- server = self.client.servers.get_by_name(server_name)
- if self.hcloud_volume.server is None or self.hcloud_volume.server.name != server.name:
- if not self.module.check_mode:
- automount = self.module.params.get("automount", False)
- self.hcloud_volume.attach(server, automount=automount).wait_until_finished()
- self._mark_as_changed()
- else:
- if self.hcloud_volume.server is not None:
- if not self.module.check_mode:
- self.hcloud_volume.detach().wait_until_finished()
- self._mark_as_changed()
-
- labels = self.module.params.get("labels")
- if labels is not None and labels != self.hcloud_volume.labels:
- if not self.module.check_mode:
- self.hcloud_volume.update(labels=labels)
- self._mark_as_changed()
-
- delete_protection = self.module.params.get("delete_protection")
- if delete_protection is not None and delete_protection != self.hcloud_volume.protection["delete"]:
- if not self.module.check_mode:
- self.hcloud_volume.change_protection(delete=delete_protection).wait_until_finished()
- self._mark_as_changed()
-
- self._get_volume()
- except hcloud.APIException as e:
- self.module.fail_json(msg=e.message)
-
- def present_volume(self):
- self._get_volume()
- if self.hcloud_volume is None:
- self._create_volume()
- else:
- self._update_volume()
-
- def delete_volume(self):
- try:
- self._get_volume()
- if self.hcloud_volume is not None:
- if not self.module.check_mode:
- self.client.volumes.delete(self.hcloud_volume)
- self._mark_as_changed()
- self.hcloud_volume = None
- except hcloud.APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- size={"type": "int"},
- location={"type": "str"},
- server={"type": "str"},
- labels={"type": "dict"},
- automount={"type": "bool", "default": False},
- format={"type": "str",
- "choices": ['xfs', 'ext4'],
- },
- delete_protection={"type": "bool"},
- state={
- "choices": ["absent", "present"],
- "default": "present",
- },
- **Hcloud.base_module_arguments()
- ),
- required_one_of=[['id', 'name']],
- mutually_exclusive=[["location", "server"]],
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudVolume.define_module()
-
- hcloud = AnsibleHcloudVolume(module)
- state = module.params.get("state")
- if state == "absent":
- module.fail_on_missing_params(
- required_params=["name"]
- )
- hcloud.delete_volume()
- else:
- hcloud.present_volume()
-
- module.exit_json(**hcloud.get_result())
-
-
-if __name__ == "__main__":
- main()
diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_volume_info.py b/lib/ansible/modules/cloud/hcloud/hcloud_volume_info.py
deleted file mode 100644
index 3dce298584..0000000000
--- a/lib/ansible/modules/cloud/hcloud/hcloud_volume_info.py
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
-# 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: hcloud_volume_info
-
-short_description: Gather infos about your Hetzner Cloud Volumes.
-
-version_added: "2.8"
-description:
- - Gather infos about your Hetzner Cloud Volumes.
-
-author:
- - Lukas Kaemmerling (@LKaemmerling)
-
-options:
- id:
- description:
- - The ID of the Volume you want to get.
- type: int
- name:
- description:
- - The name of the Volume you want to get.
- type: str
- label_selector:
- description:
- - The label selector for the Volume you want to get.
- type: str
-extends_documentation_fragment: hcloud
-"""
-
-EXAMPLES = """
-- name: Gather hcloud Volume infos
- hcloud_volume_info:
- register: output
-- name: Print the gathered infos
- debug:
- var: output.hcloud_volume_info
-"""
-
-RETURN = """
-hcloud_volume_info:
- description: The Volume infos as list
- returned: always
- type: complex
- contains:
- id:
- description: Numeric identifier of the Volume
- returned: always
- type: int
- sample: 1937415
- name:
- description: Name of the Volume
- returned: always
- type: str
- sample: my-volume
- size:
- description: Size of the Volume
- returned: always
- type: str
- sample: 10
- linux_device:
- description: Path to the device that contains the Volume.
- returned: always
- type: str
- sample: /dev/disk/by-id/scsi-0HC_Volume_12345
- version_added: "2.10"
- location:
- description: Name of the location where the Volume resides in
- returned: always
- type: str
- sample: fsn1
- server:
- description: Name of the server where the Volume is attached to
- returned: always
- type: str
- sample: my-server
- delete_protection:
- description: True if the Volume is protected for deletion
- returned: always
- type: bool
- version_added: "2.10"
- labels:
- description: User-defined labels (key-value pairs)
- returned: always
- type: dict
-"""
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native
-from ansible.module_utils.hcloud import Hcloud
-
-try:
- from hcloud import APIException
-except ImportError:
- pass
-
-
-class AnsibleHcloudVolumeInfo(Hcloud):
- def __init__(self, module):
- Hcloud.__init__(self, module, "hcloud_volume_info")
- self.hcloud_volume_info = None
-
- def _prepare_result(self):
- tmp = []
-
- for volume in self.hcloud_volume_info:
- if volume is not None:
- server_name = None
- if volume.server is not None:
- server_name = volume.server.name
- tmp.append({
- "id": to_native(volume.id),
- "name": to_native(volume.name),
- "size": volume.size,
- "location": to_native(volume.location.name),
- "labels": volume.labels,
- "server": to_native(server_name),
- "linux_device": to_native(volume.linux_device),
- "delete_protection": volume.protection["delete"],
- })
-
- return tmp
-
- def get_volumes(self):
- try:
- if self.module.params.get("id") is not None:
- self.hcloud_volume_info = [self.client.volumes.get_by_id(
- self.module.params.get("id")
- )]
- elif self.module.params.get("name") is not None:
- self.hcloud_volume_info = [self.client.volumes.get_by_name(
- self.module.params.get("name")
- )]
- elif self.module.params.get("label_selector") is not None:
- self.hcloud_volume_info = self.client.volumes.get_all(
- label_selector=self.module.params.get("label_selector"))
- else:
- self.hcloud_volume_info = self.client.volumes.get_all()
-
- except APIException as e:
- self.module.fail_json(msg=e.message)
-
- @staticmethod
- def define_module():
- return AnsibleModule(
- argument_spec=dict(
- id={"type": "int"},
- name={"type": "str"},
- label_selector={"type": "str"},
- **Hcloud.base_module_arguments()
- ),
- supports_check_mode=True,
- )
-
-
-def main():
- module = AnsibleHcloudVolumeInfo.define_module()
-
- is_old_facts = module._name == 'hcloud_volume_facts'
- if is_old_facts:
- module.deprecate("The 'hcloud_volume_facts' module has been renamed to 'hcloud_volume_info', "
- "and the renamed one no longer returns ansible_facts", version='2.13')
-
- hcloud = AnsibleHcloudVolumeInfo(module)
-
- hcloud.get_volumes()
- result = hcloud.get_result()
- if is_old_facts:
- ansible_info = {
- 'hcloud_volume_facts': result['hcloud_volume_info']
- }
- module.exit_json(ansible_facts=ansible_info)
- else:
- ansible_info = {
- 'hcloud_volume_info': result['hcloud_volume_info']
- }
- module.exit_json(**ansible_info)
-
-
-if __name__ == "__main__":
- main()