mirror of
https://github.com/ansible-collections/hetzner.hcloud.git
synced 2026-02-04 08:01:49 +00:00
feat: add new created state for idempotent server creation (#606)
##### SUMMARY Add a new state for server creation without immediate start, to allow idempotent network customization before starting ##### ISSUE TYPE - Feature Pull Request ##### COMPONENT NAME server --------- Co-authored-by: jo <ljonas@riseup.net>
This commit is contained in:
parent
303cdeda74
commit
4534cf6b9d
16 changed files with 68 additions and 23 deletions
2
changelogs/fragments/server-add-created-state.yml
Normal file
2
changelogs/fragments/server-add-created-state.yml
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- server - Add `created` state that creates a server but do not start it.
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
image: debian-12
|
image: debian-12
|
||||||
enable_ipv4: false
|
enable_ipv4: false
|
||||||
enable_ipv6: false
|
enable_ipv6: false
|
||||||
state: stopped # A server without networking cannot be started!
|
state: created # A server without networking cannot be started!
|
||||||
loop: "{{ servers }}"
|
loop: "{{ servers }}"
|
||||||
|
|
||||||
- name: Attach private IP to servers
|
- name: Attach private IP to servers
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ options:
|
||||||
description:
|
description:
|
||||||
- State of the server.
|
- State of the server.
|
||||||
default: present
|
default: present
|
||||||
choices: [ absent, present, restarted, started, stopped, rebuild ]
|
choices: [ absent, present, created, restarted, started, stopped, rebuild ]
|
||||||
type: str
|
type: str
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- hetzner.hcloud.hcloud
|
- hetzner.hcloud.hcloud
|
||||||
|
|
@ -462,7 +462,7 @@ class AnsibleHCloudServer(AnsibleHCloud):
|
||||||
elif self.module.params.get("location") is None and self.module.params.get("datacenter") is not None:
|
elif self.module.params.get("location") is None and self.module.params.get("datacenter") is not None:
|
||||||
params["datacenter"] = self._client_get_by_name_or_id("datacenters", self.module.params.get("datacenter"))
|
params["datacenter"] = self._client_get_by_name_or_id("datacenters", self.module.params.get("datacenter"))
|
||||||
|
|
||||||
if self.module.params.get("state") == "stopped":
|
if self.module.params.get("state") == "stopped" or self.module.params.get("state") == "created":
|
||||||
params["start_after_create"] = False
|
params["start_after_create"] = False
|
||||||
|
|
||||||
if not self.module.check_mode:
|
if not self.module.check_mode:
|
||||||
|
|
@ -944,7 +944,7 @@ class AnsibleHCloudServer(AnsibleHCloud):
|
||||||
rebuild_protection={"type": "bool"},
|
rebuild_protection={"type": "bool"},
|
||||||
placement_group={"type": "str"},
|
placement_group={"type": "str"},
|
||||||
state={
|
state={
|
||||||
"choices": ["absent", "present", "restarted", "started", "stopped", "rebuild"],
|
"choices": ["absent", "present", "created", "restarted", "started", "stopped", "rebuild"],
|
||||||
"default": "present",
|
"default": "present",
|
||||||
},
|
},
|
||||||
**super().base_module_arguments(),
|
**super().base_module_arguments(),
|
||||||
|
|
@ -965,6 +965,9 @@ def main():
|
||||||
hcloud.delete_server()
|
hcloud.delete_server()
|
||||||
elif state == "present":
|
elif state == "present":
|
||||||
hcloud.present_server()
|
hcloud.present_server()
|
||||||
|
hcloud.start_server()
|
||||||
|
elif state == "created":
|
||||||
|
hcloud.present_server()
|
||||||
elif state == "started":
|
elif state == "started":
|
||||||
hcloud.present_server()
|
hcloud.present_server()
|
||||||
hcloud.start_server()
|
hcloud.start_server()
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,5 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
labels:
|
labels:
|
||||||
firewall: "{{ hcloud_firewall_name }}"
|
firewall: "{{ hcloud_firewall_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_firewall
|
- name: Create test_firewall
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
labels:
|
labels:
|
||||||
key: value
|
key: value
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_firewall
|
- name: Create test_firewall
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: main_server
|
register: main_server
|
||||||
- name: verify setup server
|
- name: verify setup server
|
||||||
assert:
|
assert:
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: main_server2
|
register: main_server2
|
||||||
- name: verify setup another server
|
- name: verify setup another server
|
||||||
assert:
|
assert:
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_snapshot
|
- name: Create test_snapshot
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_load_balancer
|
- name: Create test_load_balancer
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_load_balancer
|
- name: Create test_load_balancer
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
enable_ipv4: false
|
enable_ipv4: false
|
||||||
enable_ipv6: false
|
enable_ipv6: false
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
ipv6: "{{primaryIPv6.hcloud_primary_ip.id}}"
|
ipv6: "{{primaryIPv6.hcloud_primary_ip.id}}"
|
||||||
ssh_keys:
|
ssh_keys:
|
||||||
- "{{ hcloud_ssh_key_name }}"
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: result
|
register: result
|
||||||
- name: verify test create server with primary ips
|
- name: verify test create server with primary ips
|
||||||
assert:
|
assert:
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
enable_ipv6: false
|
enable_ipv6: false
|
||||||
ssh_keys:
|
ssh_keys:
|
||||||
- "{{ hcloud_ssh_key_name }}"
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: result
|
register: result
|
||||||
- name: verify test create server with primary ips
|
- name: verify test create server with primary ips
|
||||||
assert:
|
assert:
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
- "{{ primaryNetwork.hcloud_network.name }}"
|
- "{{ primaryNetwork.hcloud_network.name }}"
|
||||||
ssh_keys:
|
ssh_keys:
|
||||||
- "{{ hcloud_ssh_key_name }}"
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: result
|
register: result
|
||||||
- name: verify test create server with primary network
|
- name: verify test create server with primary network
|
||||||
assert:
|
assert:
|
||||||
|
|
@ -92,7 +92,7 @@
|
||||||
- "{{ secondaryNetwork.hcloud_network.id }}"
|
- "{{ secondaryNetwork.hcloud_network.id }}"
|
||||||
ssh_keys:
|
ssh_keys:
|
||||||
- "{{ hcloud_ssh_key_name }}"
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: result
|
register: result
|
||||||
- name: verify test update server by adding secondary network
|
- name: verify test update server by adding secondary network
|
||||||
assert:
|
assert:
|
||||||
|
|
@ -112,7 +112,47 @@
|
||||||
- "{{ secondaryNetwork.hcloud_network.id }}"
|
- "{{ secondaryNetwork.hcloud_network.id }}"
|
||||||
ssh_keys:
|
ssh_keys:
|
||||||
- "{{ hcloud_ssh_key_name }}"
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
|
register: result
|
||||||
|
- name: verify test update server idem
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- result is not changed
|
||||||
|
|
||||||
|
- name: test server can now be started
|
||||||
|
hetzner.hcloud.server:
|
||||||
|
name: "{{ hcloud_server_name }}"
|
||||||
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
|
datacenter: "{{ hcloud_datacenter_name }}"
|
||||||
|
image: "{{ hcloud_image_name }}"
|
||||||
|
enable_ipv4: false
|
||||||
|
enable_ipv6: false
|
||||||
|
private_networks:
|
||||||
|
- "{{ primaryNetwork.hcloud_network.name }}"
|
||||||
|
- "{{ secondaryNetwork.hcloud_network.id }}"
|
||||||
|
ssh_keys:
|
||||||
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
|
state: started
|
||||||
|
register: result
|
||||||
|
- name: verify test server can now be started
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- result is changed
|
||||||
|
|
||||||
|
- name: test update server idem
|
||||||
|
hetzner.hcloud.server:
|
||||||
|
name: "{{ hcloud_server_name }}"
|
||||||
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
|
datacenter: "{{ hcloud_datacenter_name }}"
|
||||||
|
image: "{{ hcloud_image_name }}"
|
||||||
|
enable_ipv4: false
|
||||||
|
enable_ipv6: false
|
||||||
|
private_networks:
|
||||||
|
- "{{ primaryNetwork.hcloud_network.name }}"
|
||||||
|
- "{{ secondaryNetwork.hcloud_network.id }}"
|
||||||
|
ssh_keys:
|
||||||
|
- "{{ hcloud_ssh_key_name }}"
|
||||||
|
state: created
|
||||||
register: result
|
register: result
|
||||||
- name: verify test update server idem
|
- name: verify test update server idem
|
||||||
assert:
|
assert:
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,18 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
labels:
|
labels:
|
||||||
key: value
|
key: value
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
||||||
- name: Create test_server2 (stopped + without ip)
|
- name: Create test_server2 (without ip)
|
||||||
hetzner.hcloud.server:
|
hetzner.hcloud.server:
|
||||||
name: "{{ hcloud_server_name }}2"
|
name: "{{ hcloud_server_name }}2"
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
labels:
|
labels:
|
||||||
key: value
|
key: value
|
||||||
enable_ipv4: false
|
enable_ipv4: false
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,5 @@
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
register: test_server
|
register: test_server
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
name: "{{hcloud_server_name}}"
|
name: "{{hcloud_server_name}}"
|
||||||
server_type: "{{ hcloud_server_type_name }}"
|
server_type: "{{ hcloud_server_type_name }}"
|
||||||
image: "{{ hcloud_image_name }}"
|
image: "{{ hcloud_image_name }}"
|
||||||
state: stopped
|
state: created
|
||||||
location: "{{ hcloud_location_name }}"
|
location: "{{ hcloud_location_name }}"
|
||||||
register: vol_server
|
register: vol_server
|
||||||
- name: verify setup server
|
- name: verify setup server
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue