feat: setup servers on hetzner cloud
commit
6c50019d6d
@ -0,0 +1,18 @@
|
|||||||
|
# Prepare ansible Installation
|
||||||
|
Install ansible with Python.
|
||||||
|
|
||||||
|
pip3 install ansible
|
||||||
|
|
||||||
|
Install library jmespath (https://jmespath.org/). Will be used to parse JSON data.
|
||||||
|
|
||||||
|
pip3 install jmespath
|
||||||
|
|
||||||
|
Install ansible role for managing hetzner cloud servers.
|
||||||
|
|
||||||
|
pip3 install hcloud
|
||||||
|
ansible-galaxy collection install hetzner.hcloud
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
Create/Start servers for stage-dev
|
||||||
|
|
||||||
|
ansible-playbook -i stage-dev provisioning.yml --vault-password-file ~/vault-pass
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
domain: smardigo.digital
|
||||||
|
|
||||||
|
hetzner_server_type: cx11
|
||||||
|
hetzner_server_image: ubuntu-20.04
|
||||||
|
|
||||||
|
hetzner_ssh_keys:
|
||||||
|
- sven.ketelsen@arxes-tolina.de
|
||||||
|
|
||||||
|
#hetzner_authentication_token: "< see vault >"
|
||||||
|
#digitalocean_authentication_token: "< see vault >"
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
62366361333863393564663466393361633166613434303036363563306634316161326432336262
|
||||||
|
3331653631666639623366326238323465333736653532660a333335643632353633303037663631
|
||||||
|
37636163613537313035633433313439326134303532346434373533643865343466336433643837
|
||||||
|
3764666639343265630a393463306363653962333561353161336264306664656163386232333438
|
||||||
|
39396232303938393961393065306433643232343766356235363562623431623437613134353135
|
||||||
|
38633433643365613434636531616134303835626661643835633437343262646534346562663165
|
||||||
|
39393762333565336339663130383461383931643165386635376532316137366165356336353964
|
||||||
|
65656235626362353937373065386131386139663334653438376138353436613434343639646134
|
||||||
|
62663936323033366265316361343039383531376230396466366331383632383163646433316631
|
||||||
|
62356364303662366630396535626232613566336430616536623561623333643333393434613863
|
||||||
|
62336632333465366363303164373331336436393830636133366263383163336362343366653762
|
||||||
|
39643762393864626366383731626366643831653238303532663964363537393031663836343338
|
||||||
|
34643735306335313030343664313361356361316633613530353361346232326261366239383662
|
||||||
|
6163326466643334646436383366363531633066313335323336
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
hetzner_server_type: cx21
|
||||||
|
|
||||||
|
hetzner_ssh_keys:
|
||||||
|
- stefan@curow.de
|
||||||
|
- sven.ketelsen@arxes-tolina.de
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
hetzner_server_type: cx21
|
||||||
|
|
||||||
|
hetzner_ssh_keys:
|
||||||
|
- stefan@curow.de
|
||||||
|
- sven.ketelsen@arxes-tolina.de
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
hetzner_server_type: cx21
|
||||||
|
|
||||||
|
hetzner_ssh_keys:
|
||||||
|
- stefan@curow.de
|
||||||
|
- sven.ketelsen@arxes-tolina.de
|
||||||
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPiWNJzb4vqgkjsRjl1C5oTQbyEvsBPfBuVf3AL9Ssw7RJb8hl3VqVegJ1HqNe1/j4R04a53ND5qy93GBAYOI3iNKiWq2Cd9DM9QHN+EiNG7eo0wkr/VhBh5bh6knn12RXX1T0xnR9jeB3rIQWyJyR+PTSEz4oul+QjlKB8uO7LLmsoqVpVqGhj7xtoVIEfJPMCEBMjj/jc3rGK1ezrXBGCTFEQPl5b+XRy9kybv5hf6W02yPm82RRozG3/3zObiNPX/ajt5mHB09CTq5JLeLFlfftpcLEON1CDpzACm7cIvnYoHKltaGjkZaprxpPApkKLiPe8zVUYiG0wt5qYUXS/AQ5u6I0vFA+5H3fEYZMalp4fwf4OWFxqJQH97sivQe/q7SnOA70GiClri9qWt6r6/LP7du7UySvOWVX8R6CuD3OdaAHXng1UWLDwqP9r2XshQIVo90vz9vLVP2k7bBchxignmD7WL4VnEG5bhhf487xhK3+YCG8TWtGO8MXDp0= pheise@fedora-vm
|
||||||
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAscASzHdu85wUZUNYLHNJSbee3uQxApRXBV90twEFdUI8I4MmKVeGOi5zTat4VXqAGFgJ8CAUGM1rwC6azi1SDzikPVbV8QtqeRK1P1KVkknyBepe4t/DrhelQudJ2VM2wuDgCtbHWgvVfh3vd7IF5pThPke/oa8H2rACfM8pSTpn5AVPnTotM/8aTgEt1YDoDS+59CG/mGCMTvZ/EkYhIVIFEkNcaMn0Xwx0q3X2VuanA5Zu6BClybwE45A/kRZo7nXtEa33Mvr2yqkoC9DRP9l3d1K2wiIn3X8DBsgM+ZWsriS8Tt7UzOyHzyu7+ZlEvb4ek6ta/weKMbtJl/X3VQ== scurow
|
||||||
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDiP5IHm3hTbO/DBEwVoEFvbiOX56d67Q4fPWkmJlLAygQ40kRJj2ijzYNCryh4JSxXxOVu42c79Lzyxt1h/OhayGOatdAyEe/GIQB0YI4G5UmIxZecZCxOT3Uqj4j0+LDHH8QFkJUI59FpznM9VezwciL2Dxc2dA8lrEtKJVoZuCxHSx84GwzqBZdIhyNSSGvXu/ZP/KpT8ACAx5F5PJ3D+B+3pYuYLnzsYJ8Y4RYCoQ8bIX89txJ7bF2lrMmPeE3t2ms4bAh+QbohED0SksQKt1xEt9gt/Be+cRdrdts5XYfdKyd4iAFtzuRVOUTt4OcwqrFsiDeJRLK8taMH9Fz sven.ketelsen@arxes-tolina.de
|
||||||
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHgUkCCGkqAYt+WsTs0jnjVsZfIJdQoStX6hvV3l4K7UBJyGBmg7NxAZk053GYs2R6Ryg3S/Hqe4JeGX1XSxJTtpzPusBmvrEl4ei94h6F6IxeAyTjMrks3uS/n7awz4j6VcDW2OoHMbFl6VP8KPiWCjChG4Kz9peg9FhwFi9THlgr4cgSMjPjOfSoL43xWVOx+NC/JyFCBXD//WzsB02ceC71GG4W3RW8gAgNW9JOgdihP+qkA6oh68MBEPWr5uUolfoyQLSTGpE//YDCqgXyKCG1+bJ4UOZ3UC0nYayY/hWUIkPxHbZ5zCTYZ2Z2ah5u/QxGOryHFENbAu46MeKzPtoY3bfqfnfmB6C/rWTqUKIPBaKgaI104Lo1C+nmwhOiSewEKFZgoAzCoRWP+HoCDSceJyW9VlgoFR30nfFOaTnJ9N3um0YRZ+B5jDJOXE2+MoKBybfm/Johh/RKVWJvlrgUl7YuTTK0hd03FdRYEytReY/eQyNyXjqo9qmKwBk= vanphuong.ma@4K6N2X2
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: 'apply setup to {{ host | default("all") }}'
|
||||||
|
hosts: '{{ host | default("all") }}'
|
||||||
|
serial: "{{ serial_number | default(1) }}"
|
||||||
|
gather_facts: no
|
||||||
|
become: no
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: "Check if ansible version is at least 2.10.x"
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_version.major >= 2
|
||||||
|
- ansible_version.minor >= 10
|
||||||
|
msg: "The ansible version has to be at least ({{ ansible_version.full }})"
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- role: hcloud
|
||||||
|
when: "'hcloud' in group_names"
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Read DNS entry for {{ record_name }}.{{ domain }} from digitalocean
|
||||||
|
uri:
|
||||||
|
url: "https://api.digitalocean.com/v2/domains/{{ domain }}/records?name={{ record_name }}.{{ domain }}"
|
||||||
|
headers:
|
||||||
|
accept: application/json
|
||||||
|
authorization: Bearer {{ digitalocean_authentication_token }}
|
||||||
|
return_content: yes
|
||||||
|
register: domain_records_response
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: Save DNS entry as variable (fact)
|
||||||
|
set_fact:
|
||||||
|
domain_records_response_json: "{{ domain_records_response.json }}"
|
||||||
|
|
||||||
|
- name: Parse DNS entry for {{ record_name }}.{{ domain }}
|
||||||
|
set_fact:
|
||||||
|
domain_record: "{{ domain_records_response_json.domain_records | json_query(jmesquery) | first | default({'name': '-', 'ip': '-'}) }}"
|
||||||
|
vars:
|
||||||
|
jmesquery: '[*].{id: id, name: name, ip: data}'
|
||||||
|
|
||||||
|
- name: Print DNS entry for {{ record_name }}.{{ domain }}
|
||||||
|
debug:
|
||||||
|
msg: "{{ domain_record }}"
|
||||||
|
|
||||||
|
- name: Delete DNS entry for <{{ record_name }}> if necessary
|
||||||
|
uri:
|
||||||
|
method: DELETE
|
||||||
|
url: "https://api.digitalocean.com/v2/domains/{{ domain }}/records/{{ domain_record.id }}"
|
||||||
|
headers:
|
||||||
|
authorization: Bearer {{ digitalocean_authentication_token }}
|
||||||
|
return_content: yes
|
||||||
|
status_code: 204
|
||||||
|
when:
|
||||||
|
domain_record.ip != '-'
|
||||||
|
and record_data != domain_record.ip
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: Create DNS entry for <{{ record_name }}> if necessary
|
||||||
|
uri:
|
||||||
|
method: POST
|
||||||
|
url: "https://api.digitalocean.com/v2/domains/{{ domain }}/records"
|
||||||
|
headers:
|
||||||
|
authorization: Bearer {{ digitalocean_authentication_token }}
|
||||||
|
body: '{{ create_record | to_json }}'
|
||||||
|
body_format: json
|
||||||
|
return_content: yes
|
||||||
|
status_code: 201
|
||||||
|
vars:
|
||||||
|
create_record:
|
||||||
|
type: 'A'
|
||||||
|
ttl: 1800
|
||||||
|
data: "{{ record_data }}"
|
||||||
|
name: "{{ record_name }}"
|
||||||
|
when:
|
||||||
|
domain_record.ip == '-'
|
||||||
|
or record_data != domain_record.ip
|
||||||
|
or record_name != domain_record.name
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
### tags:
|
||||||
|
|
||||||
|
- name: Create a new server {{ inventory_hostname }}
|
||||||
|
hcloud_server:
|
||||||
|
api_token: "{{ hetzner_authentication_token }}"
|
||||||
|
name: "{{ inventory_hostname }}"
|
||||||
|
server_type: "{{ hetzner_server_type }}"
|
||||||
|
image: "{{ hetzner_server_image }}"
|
||||||
|
ssh_keys: "{{ hetzner_ssh_keys }}"
|
||||||
|
state: present
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: Gather current server infos
|
||||||
|
hcloud_server_info:
|
||||||
|
api_token: "{{ hetzner_authentication_token }}"
|
||||||
|
register: hetzner_server_infos
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: Save current server infos as variable (fact)
|
||||||
|
set_fact:
|
||||||
|
hetzner_server_infos_json: "{{ hetzner_server_infos.hcloud_server_info }}"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: Read ip for {{ inventory_hostname }}
|
||||||
|
set_fact:
|
||||||
|
stage_server_ip: "{{ item.ipv4_address }}"
|
||||||
|
when: item.name == inventory_hostname
|
||||||
|
with_items: "{{ hetzner_server_infos_json }}"
|
||||||
|
|
||||||
|
- name: Print the gathered infos
|
||||||
|
debug:
|
||||||
|
var: stage_server_ip
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
|
||||||
|
- name: "Setup DNS configuration for {{ inventory_hostname }}"
|
||||||
|
include_role:
|
||||||
|
name: _digitalocean
|
||||||
|
tasks_from: domain
|
||||||
|
vars:
|
||||||
|
record_data: "{{ stage_server_ip }}"
|
||||||
|
record_name: "{{ inventory_hostname }}"
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
### tags:
|
||||||
|
|
||||||
|
- name: Ensure the server {{ inventory_hostname }} is {{ hetzner_state }}
|
||||||
|
hcloud_server:
|
||||||
|
api_token: "{{ hetzner_authentication_token }}"
|
||||||
|
name: "{{ inventory_hostname }}"
|
||||||
|
state: "{{ hetzner_state }}"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
[hcloud]
|
||||||
|
dev-elastic-stack-01
|
||||||
|
dev-elastic-stack-02
|
||||||
|
dev-elastic-stack-03
|
||||||
|
|
||||||
|
[stage_dev:children]
|
||||||
|
hcloud
|
||||||
|
|
||||||
|
[all:children]
|
||||||
|
stage_dev
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: 'apply setup to {{ host | default("all") }}'
|
||||||
|
hosts: '{{ host | default("all") }}'
|
||||||
|
serial: "{{ serial_number | default(5) }}"
|
||||||
|
gather_facts: no
|
||||||
|
become: no
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: "Check if ansible version is at least 2.10.x"
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_version.major >= 2
|
||||||
|
- ansible_version.minor >= 10
|
||||||
|
msg: "The ansible version has to be at least ({{ ansible_version.full }})"
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- role: hetzner-state
|
||||||
|
vars:
|
||||||
|
hetzner_state: 'started'
|
||||||
|
when: "'hcloud' in group_names"
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: 'apply setup to {{ host | default("all") }}'
|
||||||
|
hosts: '{{ host | default("all") }}'
|
||||||
|
serial: "{{ serial_number | default(5) }}"
|
||||||
|
gather_facts: no
|
||||||
|
become: no
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: "Check if ansible version is at least 2.10.x"
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_version.major >= 2
|
||||||
|
- ansible_version.minor >= 10
|
||||||
|
msg: "The ansible version has to be at least ({{ ansible_version.full }})"
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- role: hetzner-state
|
||||||
|
vars:
|
||||||
|
hetzner_state: 'stopped'
|
||||||
|
when: "'hcloud' in group_names"
|
||||||
Loading…
Reference in New Issue