1
0
Fork 0
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:
Daniele Fognini 2025-03-21 14:05:03 +01:00 committed by GitHub
parent 303cdeda74
commit 4534cf6b9d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 68 additions and 23 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- server - Add `created` state that creates a server but do not start it.

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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