Das Verteilen von SSH-Keys mit Ansible ist mit Hilfe des Moduls authorized_key – Adds or removes an SSH authorized key eine einfach Sache, schöner wird es aber, wenn man pro Host verschiedene SSH-Keys festlegen kann und die SSH-Keys Personen zuordnen kann, ohne dass diese im Kommentarfeld hinter dem Key auf dem Ziel-Host landen
Das einfache Ansible-Playbook zeigt, wie das geht - und zwar am Beispiel eines Funktions-Accounts, in dem mehrere SSH-Keys hinterlegt werden.
Ich behaupte übrigens nicht, dass Funktions-Accounts mit mehreren SSH-Keys "best practise sind", aber manchmal muss man eben auch diese Anforderung lösen.
Vorüberlegungen / Anforderungen
Meiner Überlegung für das hier gezeigte Playbook liegen folgende Anforderungen zugrunde:
- Ich möchte pro Ziel-Host festlegen können, welche SSH-Keys verteilt werden
- Ich möchte, dass nur die Keys auf dem Ziel-Host landen, nicht aber Informationen darüber, wem der Schlüssel zugeordnet ist
- Ich möchte auf dem Ansible-Host sehen können, welcher Person oder Rolle der SSH-Key zugeordnet ist
- Das Playbook soll SSH-Keys, die ich entferne, auch auf dem Ziel-Host entfernen,
Es soll also sichergestellt sein, dass nur die SSH-Keys auf dem System zum Einsatz kommen, die ich auf dem Ansible-Host angebe
Wie erreichen wir das?
Folgende Wege habe ich zur Zielerreichung gewählt:
- Die Keys lege ich (u.a. zur Übersichtlichkeit) in einen Ordner.
In diesem Ordner lasse ich Ansible wie folgt danach suchen:- Suche nach einer Datei <NamedesZielHosts>.yaml und benutze diese
- Falls Du diese nicht findest, benutze eine Standard-Datei
- Die Daten werden in einer Datei abgelegt, in der folgende Informationen in Feldern abgelegt werden:
- Name oder Rolle, der/die dem SSH-Key zugeordnet ist
- SSH-Key
- Es wird nur der SSH-Key durch das Playbook ausgelesen und somit landet auch nur der SSH-Key auf dem Ziel-System, durch das Feld mit Name/Rolle erhalte ich aber mehr Informationen
- Es kommt eine Option des Moduls authorized_key – Adds or removes an SSH authorized key namens "exclusive" zum Einsatz, die dies sicherstellt.
Das Playbook
Die jeweils neueste Version findest Du hier auf Github.
---
- hosts: testfileservers
remote_user: devopuser
tasks:
- name: Read variables
include_vars: '{{ item }}'
with_first_found:
- files:
- "{{ inventory_hostname }}.yml"
- "default.yml"
paths: "./vars/"
- name: Deploy SSH-Keys to remote host
authorized_key:
user: functionaccount
key: "{{ keystodeploy|map(attribute='sshkey')|join('\n') }}"
exclusive: true
Die Daten
Die SSH-Keys werden so abgelegt:
---
keystodeploy:
- name: Petra Meier
sshkey: ssh-rsa AAAABCe233e423...
- name: Horst Lehmann
sshkey: ssh-rsa AAAABDdsds...
Clone Dir am besten das Repository auf hier auf Github und probiere es selbst aus.