summaryrefslogtreecommitdiff
path: root/roles/cloud/install/tasks/hcloud.yml
blob: 49bdef1c456688b730ee9ecc765c5c5ed3d10910 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
---
- name: retrieve ssh key ids
  delegate_to: localhost
  check_mode: no
  uri:
    url: "https://api.hetzner.cloud/v1/ssh_keys"
    method: GET
    headers:
      Authorization: "Bearer {{ install.cloud.credentials.token }}"
    status_code: 200
  register: sshkeys

- name: retrieve server id and check if rescue mode is already active
  delegate_to: localhost
  check_mode: no
  uri:
    url: "https://api.hetzner.cloud/v1/servers?name={{ install.cloud.server_name | default(inventory_hostname) }}"
    method: GET
    headers:
      Authorization: "Bearer {{ install.cloud.credentials.token }}"
    status_code: 200
  register: serverstatus

- name: do not continue if we found no or multiple servers
  when: (serverstatus.json.servers | length) != 1
  fail:
    msg: "hcloud API returned {{ serverstatus.json.servers | length }} servers"

- name: do not continue in check mode
  when: ansible_check_mode | bool
  fail:
    msg: "can not bootstrap new servers in check mode"

- name: display warning message
  pause:
    prompt: |
      *** Danger ****
      will be bootstraping host {{ inventory_hostname }} with main IP {{ serverstatus.json.servers[0].public_net.ipv4.ip }} ...
      ALL DATA WILL BE LOST!!! press CTRL-C then A to abort.
    seconds: 15

### TODO: for now we add all ssh keys that are installed for this project - this might not be a good idea!
- name: activate rescue mode
  when: not serverstatus.json.servers[0].rescue_enabled
  delegate_to: localhost
  uri:
    url: "https://api.hetzner.cloud/v1/servers/{{ serverstatus.json.servers[0].id }}/actions/enable_rescue"
    method: POST
    body: "{{ {'type': 'linux64', 'ssh_keys': (sshkeys.json.ssh_keys | map(attribute='id') | list) } | to_nice_json }}"
    headers:
      Authorization: "Bearer {{ install.cloud.credentials.token }}"
      Content-Type: "application/json"
    status_code: 201

- name: wait for rescue mode activation
  pause:
    seconds: 5

- name: do a hardware reset
  delegate_to: localhost
  uri:
    url: "https://api.hetzner.cloud/v1/servers/{{ serverstatus.json.servers[0].id }}/actions/reset"
    method: POST
    headers:
      Authorization: "Bearer {{ install.cloud.credentials.token }}"
    status_code: 201

### TODO: would be nice to get the SSH host key from robot
- name: completely ignore ssh host keys for now
  set_fact:
    old_ansible_ssh_extra_args: "{{ ansible_ssh_extra_args | default('') }}"
    ansible_ssh_extra_args: "{{ ansible_ssh_extra_args | default('') }} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

- name: wait for rescue system to start up
  wait_for_connection:
    delay: 10
    timeout: 300

- include_tasks: hetzner_installimage.yml

- name: reboot
  shell: sleep 2 && shutdown -r now "triggered by ansible after running installimage"
  async: 1
  poll: 0
  ignore_errors: True
  changed_when: True