0

Hintergrund,ansible läuft einen Befehl von vielen lokal in einer Schleife

Ich versuche, eine Schleife, die iteriert über Hash aus qa.yml Datei lesen zu erstellen und für jeden Benutzer in der Liste es versucht, eine finden Datei auf dem lokalen Server (öffentlicher Schlüssel), sobald die Datei gefunden wurde, erstellt sie den Benutzer auf dem entfernten Rechner und kopiert den öffentlichen Schlüssel auf authorized_key auf dem entfernten Rechner.

Ich versuche, es in einer Art der Iteration zu implementieren, um die Schlüssel zu aktualisieren oder weitere Benutzerschlüssel hinzuzufügen, muss ich die .yml-Liste ändern und die öffentliche Schlüsseldatei an der richtigen Stelle platzieren. Allerdings kann ich die Funktion local_action + nicht finden.

--- 
- hosts: tag_Ansible_CLOUD_QA 

    vars_files: 
    - ../users/qa.yml 
    - ../users/groups.yml 
    remote_user: ec2-user 
    sudo: yes 

    tasks: 

    - name: Create groups 
    group: name="{{ item.key }}" state=present 
    with_dict: "{{ user_groups }}" 

    - name: Create remote users QA 
    user: name="{{ item.key }}" comment="user" group=users groups="qa" 
    with_dict: "{{ qa_users }}" 

    - name: Erase previous authorized keys QA 
    shell: rm -rf /home/"{{ item.key }}"/.ssh/authorized_keys 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users QA 
    local_action: 
     find: paths="{{'/opt/pubkeys/2016/q2/'}}" patterns="{{ item.key }}" 
     register: result 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', result) }}" 
    with_dict: "{{ qa_users }}" 

Hash:

qa_users: 
    user1: 
    name: User 1 
    user2: 
    name: User 2 

Antwort

1

Sie pauken zwei Aufgaben in einem einzigen Aufgabenelement in die letzte Aufgabe so ansible ist das nicht gehen zu mögen.

die Aufgabe Splitting sollte richtig funktionieren:

- name: Find keys 
    local_action: find paths="{{'/opt/pubkeys/2016/q2/'}}" patterns="{{ item.key }}" 
    register: result 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users QA 
    authorized_key: user="{{ item.0.key }}" key="{{ lookup('file', item.1.stdout) }}" 
    with_together: 
     - "{{ qa_users }}" 
     - result 

Die zweite Aufgabe dann die Wörterbuch Schleifen über, und das Ergebnis von der vorhergehenden Aufgabe, eine with_together Schleife, die die beiden Datenstrukturen in Schritt vorrückt durch.

Dies scheint jedoch eine weniger als ideale Möglichkeit, um Ihr Problem zu lösen.

Wenn man sieht, was hier Ihre Aufgaben versuchen, es zu tun, ersetzen Sie könnte einfach mit etwas wie folgt aus:

- name: Add public keys to remote users QA 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', '/opt/pubkeys/2016/q2/' + item.key) }}" 
    with_dict: 
     - "{{ qa_users }}" 

Sie können auch die thid Aufgabe entfernen, wo Sie die vorherigen Schlüssel des Benutzers gelöscht unten durch einfach mit dem exclusive Parameter des authorized_keys Modul:

- name: Add public keys to remote users QA 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', '/opt/pubkeys/2016/q2/' + item.key) }}" exclusive=yes 
    with_dict: 
     - "{{ qa_users }}" 

auch könnte es ein Fall von Ihnen versuchen zu vereinfachen Dinge in einer seltsamen Art und Weise für die Frage aber Ihre Datenstrukturen Sie verwenden sind weniger als ideal rechts n Also schaue ich mir das mal an, wenn das wirklich so aussieht.

+0

Danke für das Feedback und Vorschlag, den ich es wahrscheinlich folgen wird, aber ich bin neugierig, warum ich diesen Fehler werden immer wenn local_action ausgeführt wird: - Name: Find keys, ERROR: Syntaxfehler beim Laden des YAML-Skripts, credentials/distribute-public-key.yml Hinweis: Der Fehler kann tatsächlich vor dieser Position angezeigt werden: Zeile 41, Spalte 17 - Name: Schlüssel finden local_action: ^ –

+0

@DmitryR möchten Sie vielleicht jetzt mit meinem Schnitt versuchen. Das ursprüngliche Problem mit der Syntax local_action wurde nicht erkannt. Es ist immer noch unerprobt, also könnte es immer noch scheitern. – ydaetskcoR

-1

Danke @ydaetskcoR für den richtigen Ansatz teilt, hat die folgende Lösung die dynamische Verteilung öffentliche Schlüssel für mich, wenn Dateien auf dem lokalen Rechner mit Wohnsitz und auf entfernte EC2 Maschinen bereitgestellt:

--- 
- hosts: tag_Ansible_CLOUD_QA 

    vars_files: 
    - ../users/groups.yml 
    - ../users/qa.yml 
    remote_user: ec2-user 
    become: yes 
    become_method: sudo 

    tasks: 
    - name: Find user matching key files 
    become_user: jenkins 
    local_action: find paths="{{'/opt/pubkeys/2016/q1/'}}" patterns="{{ '*' + item.key + '*' }}" 
    register: pub_key_files 
    with_dict: "{{ qa_users }}" 

    - name: Create groups 
    group: name="{{ item.key }}" state=present 
    with_dict: "{{ user_groups }}" 

    - name: Allow test users to have passwordless sudo 
    lineinfile: "dest=/etc/sudoers state=present regexp='^%{{ item.key }} ALL=.*ALL.* NOPASSWD: ALL' line='%{{ item.key }} ALL=(ALL) NOPASSWD: ALL'" 
    with_dict: "{{ user_groups }}" 

    - name: Create remote users qa 
    user: name="{{ item.key }}" comment="user" group=users groups="qa" 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users qa 
    #debug: "msg={{ 'User:' + item.item.key + ' KeyFile:' + item.files.0.path }}" 
    authorized_key: user="{{ item.item.key }}" key="{{ lookup('file', item.files.0.path) }}" exclusive=yes 
    with_items: "{{ pub_key_files.results }}" 

Dies ist der Befehl Linie dynamische Bestandsaufnahme zu erhalten, basierend auf EC2 Schlagwörter:

ansible-playbook -i inventory/ec2.py --private-key <path to your key file> --extra-vars '{"QUATER":"q1"}' credentials/distribute-public-key.yml 
+0

Sie sollten nicht als Frage beantworten ...Sie kommentieren Antwort – confiq

+0

@confiq Es gibt eine Schaltfläche beantworten Sie Ihre Frage, die ich verwendet, und auch Sie können den Code nicht einfügen, da die Anzahl der Zeichen für Kommentare und keine Zeilentrennung Code-Hervorhebung begrenzt ist, nahm ich an, dass jemand sucht Eine solche Lösung wird die Antwort zu schätzen wissen, die den Fall löst. –