Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:sysadmin:tools:hcloud-ansible

hcloud + ansible: Ansible für die Hetzner Cloud

Für die Hetzner-Cloud gibt es ein Kommandozeilentool, noch schöner finde ich die Steuerung aber über Ansible!

Voraussetzung:

getestet mit ansible 2.10.0.dev0 mit python3.7 und hcloud 1.6.3 (2020-01)

Erster Start: Zeige einen Server den du schon in der Hetzner Cloud hast

Entspannt ausprobieren, ob das mit dem Token usw. auch so funktioniert. Der Servername wird hier als Variable "cloudserver" auf der Kommandozeile übergeben

Playbook

---
# list_hcloud_server.yml
# hcloud list a server
- name: list hcloud server | test
  hosts: localhost
  connection: local
  gather_facts: false
  user: root
  vars_files:
    - vars/hcloud_token.yml

  tasks:
  - name: list server
    hcloud_server_info:
      api_token: "{{ hcloud_token }}"
      name: "{{ cloudserver }}"

Ausgelagerte Datei mit dem Api-Token

API Token NIE im git einchecken!

Deshalb am besten auserhalb des git-Baums (auf einer verschlüsselten Festplatte) ablegen.

Bei Bedarf einfach einen Symlink an die richtige Stelle machen.

Alternativ: Ansible Vault verwenden.2)

--- 
# var/hcloud_token.yml
# hetzner cloud (hcloud) api token for project test
hcloud_token: "PleaseMoveYourRealApiTokenOutOfYourGitPathAndSymlink1234567890ab"

Aufruf mit Extra-Var

ansible-playbook -v list_hcloud_server.yml --extra-vars "cloudserver=myserver"

Using /home/youruser/.ansible.cfg as config file

PLAY [list hcloud server | test] ************************************************

TASK [list server] **************************************************************
ok: [localhost] => {"changed": false, "hcloud_server_info": [{"backup_window":
"02-06", "datacenter": "nbg1-dc1", "delete_protection": true, "id": "1493124",
"image": "ubuntu-18.04", "ipv4_address": "203.0.113.16", "ipv6":
"2001:db8:1234:5678::/64", "labels": {}, "location": "nbg1", "name": "myserver",
"rebuild_protection": true, "rescue_enabled": false, "server_type": "cx11",
"status": "running"}]}

PLAY RECAP **********************************************************************
localhost: ok=1  changed=0 unreachable=0  failed=0 skipped=0  rescued=0 ignored=0

Server mit Extra-Festplatte (Volume) anlegen

Playbook

---

- name: create hcloud server with attached disk volume
  hosts: localhost
  connection: local
  gather_facts: false
  user: root
  vars_files:
    - vars/hcloud_token.yml
    - "../../../host_vars/{{ cloudserver }}.yml"   # there the host var file lives

  tasks:
  - name: list server
    hcloud_server_info:
      api_token: "{{ hcloud_token }}"
      name: "{{ cloudserver }}"

  - name: create server
    hcloud_server:
      api_token: "{{ hcloud_token }}"
      name: "{{ hostname }}"
      server_type: "{{ h_server_type }}"
      image: "{{ h_server_image }}"
      location: "{{ h_server_location }}"
      ssh_keys: "{{ h_server_ssh_keys }}"
      state: present
    register: server

  - name: attach disk volume
    hcloud_volume:
      api_token: "{{ hcloud_token }}"
      name: "{{ h_volume_name }}"
      size: "{{ h_volume_size }}"
      format: "{{ h_volume_format }}"
      server: "{{ server.hcloud_server.name }}"
      automount: no   # does not mount to the correct place
      state: present
    when: h_volume_size is defined

  - name: list server
    hcloud_server_info:
      api_token: "{{ hcloud_token }}"
      name: "{{ cloudserver }}"

  - name: print  status
    debug:
      msg:
        - "finished creating {{ server.hcloud_server.name }}"
        - "id: {{ server.hcloud_server.id }}"
        - "type:        {{ server.hcloud_server.server_type }}"
        - "status:      {{ server.hcloud_server.status }}"
        - "datacenter:  {{ server.hcloud_server.datacenter }}"
        - "{{ cloudserver }}  IN A     {{ server.hcloud_server.ipv4_address}}"
        - "{{ cloudserver }}  IN AAAA  {{ server.hcloud_server.ipv6 }}"

Host Vars: Variablen für einen bestimmen neuen Cloud Server

../../../host_vars/testserver.yml

---
hostname: "testserver"
 
# hcloud - Hetzner Cloud
h_server_location: "nbg1"
h_server_type: "cx11"
h_server_image: "ubuntu-18.04"
h_server_ssh_keys:
  - anna_beispiel_salbei_19_pub
  - peter_example_thymian_20_pub

h_volume_name: "testserver-data"
h_volume_size: 10   #in GB
h_volume_format: "ext4"

Installation

$ ansible-playbook create_hcloud_server.yml --extra-vars "cloudserver=testserver"

PLAY [create hcloud server with attached disk volume]  ************************

TASK [list server] ************************************************************
ok: [localhost]

TASK [create server] **********************************************************
changed: [localhost]

TASK [attach disk volume] *****************************************************
changed: [localhost]

TASK [list server] ************************************************************
ok: [localhost]

TASK [print  status] **********************************************************
ok: [localhost] => {
    "msg": [
        "finished creating testserver",
        "id: 7654321",
        "type:        cx11",
        "status:      running",
        "datacenter:  nbg1-dc3",
        "testserver  IN A     203.0.113.49",
        "testserver  IN AAAA  2001:db8:5678:9abc::/64 "
    ]
}

PLAY RECAP ********************************************************************
localhost : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1)
Wenn ich die Fehlermeldungen mit python2 richtig interpretiert hatte, will irgendein Python-Modul da gerne Python3. Und Zeit wird es ja sowieso, auf Python3 umzusteigen …
2)
Vielen Dank an Falk Stern für den Hinweis zu Ansible Vault!
de/sysadmin/tools/hcloud-ansible.txt · Zuletzt geändert: 2020-01-30 22:10 von hella

Seiten-Werkzeuge

Mastodon Twitter