2016-08-10 4 views
4

Ich bin ziemlich neu in der Verwendung von Ansible und habe gelesen here und google und habe noch keine Antwort gefunden.Ist es möglich, Ansible authorized_key exclusive mit mehreren Schlüsseln zu verwenden?

Mein Szenario ist, dass ich 1 Benutzer auf einem Server habe, aber 2-3 verschiedene Pub-Schlüssel, die in seine authorized_keys-Datei einfügen müssen.

Ich kann alle Schlüssel erfolgreich entfernen, oder fügen Sie alle Schlüssel mit diesem Skript:

--- 
    - hosts: all 

tasks: 
    - name: update SSH keys 
    authorized_key: 
    user: <user> 
    key: "{{ lookup('file', item) }}" 
    state: present 
    #exclusive: yes 
    with_fileglob: 
     - ../files/pub_keys/*.pub 

Mit der present Flagge liest und fügt alle Schlüssel. Mit dem Flag absent werden alle aufgelisteten Schlüssel entfernt.

Problem ist, dass ich einen alten Schlüssel habe, der nur auf dem Server ist und ich möchte es entfernen/überschreiben und für zukünftige Bereitstellungen alle nicht autorisierten Schlüssel überschreiben, die auf dem Server und nicht in meinem Playbook sind.

Mit dem exclusive Flag nimmt es nur den letzten Schlüssel und fügt es hinzu. Dies wäre fantastisch, wenn es alle Schlüssel schlüsselt und alle Schlüssel wiedergibt. Wenn es einen Weg gibt, dies in Ansible zu tun, habe ich es nicht gefunden.

Gibt es eine Möglichkeit, über Pub-Dateien zu schleifen und die Option exclusive gleichzeitig zu verwenden?

Antwort

7

Gibt es eine Möglichkeit, über Pub-Dateien zu schleifen und die exklusive Option gleichzeitig zu verwenden?

Nein, es ist eine Notiz über Loops und exklusiv in der docs:

exklusiv: Ob alle anderen nicht spezifizierten Schlüssel aus der authorized_keys Datei zu entfernen. Mehrere Schlüssel können in einem einzelnen Schlüsselfolgenwert angegeben werden, indem sie durch Zeilenumbrüche getrennt werden. Diese Option ist nicht loop-fähig. Wenn Sie also with_ verwenden, wird es exklusiv für jede Schleife der Schleife verwendet. Wenn Sie mehrere Schlüssel in der Datei haben wollen, müssen Sie sie alle wie oben erwähnt in einem einzelnen Batch eingeben.

Sie müssen also alle Ihre Schlüssel beitreten und alle gleichzeitig senden.
Etwas wie folgt aus:

- name: update SSH keys 
    authorized_key: 
    user: <user> 
    key: "{{ lookup('pipe','cat ../files/pub_keys/*.pub') }}" 
    state: present 
    exclusive: yes 

Überprüfen Sie diesen Code, bevor in Produktion!

+0

Oh Mann, du bist ein Lebensretter! Funktioniert super! Ich habe gerade das 'Lookup'-Zeug entdeckt, aber ich versuchte es zu verstehen. Vielen Dank! – Valien

1

Wenn Ihr Halten Sie Ihre Benutzer innerhalb einer Variablen können Sie verwenden:

--- 

- hosts: all 
    vars_files: 
    - roles/users/vars/main.yml 
    tasks: 
    - name: Allow other users to login to the account 
     authorized_key: 
     user: user_name 
     exclusive: yes 
     key: "{{ developers|map(attribute='publish_ssh_key')|join('\n') }}" 

Die roles/users/vars/main.yml sieht wie folgt aus:

--- 

developers: 
    - name: user1 
    publish_ssh_key: ssh-rsa AAAA... 
    - name: user2 
    publish_ssh_key: ssh-rsa AAAA... 
+0

Dies fügt nur den letzten Schlüssel hinzu, aber laut den Dokumenten sollte es funktionieren "Mehrere Schlüssel können in einem einzelnen Schlüsselfolgenwert angegeben werden, indem sie durch Zeilenumbrüche getrennt werden" http://docs.ansible.com/ansible/authorized_key_module.html Weißt du, warum es kaputt ist? – goetzc

+0

@goetzc Ich weiß nicht :-( – czerasz

+0

Hey, es war, dass ich Testschlüssel hatte, die identisch waren, nur mit einem anderen Kommentar, und dann Ansible nur den letzten hinzugefügt :) – goetzc

0

Wenn Sie die pipe Lookup (zB vermeiden wollen, weil Der Pfad ist nicht relativ zur Rolle). Sie können auch eine Kombination aus file und fileglob Suchvorgängen verwenden:

- name: update SSH keys 
    authorized_key: 
    user: <user> 
    key: "{% for key in lookup('fileglob', 'pub_keys/*.pub').split(',') %}{{ lookup('file', key) ~ '\n'}}{% endfor %}" 
    state: present 
    exclusive: yes 
Verwandte Themen