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