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:

  1. Ich möchte pro Ziel-Host festlegen können, welche SSH-Keys verteilt werden
  2. Ich möchte, dass nur die Keys auf dem Ziel-Host landen, nicht aber Informationen darüber, wem der Schlüssel zugeordnet ist
  3. Ich möchte auf dem Ansible-Host sehen können, welcher Person oder Rolle der SSH-Key zugeordnet ist
  4. 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:

  1. Die Keys lege ich (u.a. zur Übersichtlichkeit) in einen Ordner.
    In diesem Ordner lasse ich Ansible wie folgt danach suchen:
    1. Suche nach einer Datei <NamedesZielHosts>.yaml und benutze diese
    2. Falls Du diese nicht findest, benutze eine Standard-Datei 
  2. Die Daten werden in einer Datei abgelegt, in der folgende Informationen in Feldern abgelegt werden:
    1. Name oder Rolle, der/die dem SSH-Key zugeordnet ist
    2. SSH-Key
  3. 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
  4. 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.