2015-07-15 8 views
5

Ich muss Ansible-Module verwenden, um die Datei/etc/ssh/sshd_config zu bearbeiten - jedes Mal, wenn ich einen neuen Benutzer erstelle, möchte ich ihn an diese beiden anhängen Linien:Ansible: Einfügen eines einzelnen Wortes in eine bestehende Zeile in einer Datei

AllowUsers root osadmin <new_user> 
AllowGroups root staff <new_group> 

In diesem Moment würde Anregungen herzlich willkommen ich bin mit dem Shell-Modul einen sed-Befehl auszuführen, möchte aber lineinfile verwenden, wenn möglich

- shell: "sed -i '/^Allow/ s/$/ {{ user_name }}/' /etc/ssh/sshd_config" 

.

+1

Die Verwendung von 'sed -i' in solchen Dateien ist gefährlich. Verwenden Sie mindestens "-i.bak", um eine Sicherungskopie für alle Fälle zu erstellen. – fedorqui

+0

Ich möchte nicht sed verwenden, ich würde es gerne mit LineInfile Modul ersetzen –

+1

lineinfile ist oft ein Antipattern- in diesem Fall möchten Sie wahrscheinlich die sshd_config-Datei sowieso in Konfigurationsverwaltung bringen. – tedder42

Antwort

5

Sie könnten es in einem einzigen Spiel mit einem Zeilenumbruch tun, aber ich denke, es ist sauberer, zwei lineinfile Spiele dafür zu verwenden.

- hosts: '127.0.0.1' 
    vars: 
    usernames: 
     - larry 
     - curly 
     - moe 
    usergroups: 
     - stooges 
     - admins 
    tasks: 
    - lineinfile: 
     dest: /etc/ssh/sshd_config 
     regexp: '^AllowUsers' 
     line: "AllowUsers {{usernames | join(' ')}}" 
    - lineinfile: 
     dest: /etc/ssh/sshd_config 
     regexp: '^AllowGroups' 
     line: "AllowGroups {{usergroups | join(' ')}}" 

Beachten Sie, dass groups ein reserviertes Wort ist also nicht als Variablennamen verwenden, die.

10

Die replace module ersetzt alle Instanzen eines regulären Ausdrucksmusters in einer Datei. Schreiben Sie eine Aufgabe, die der Zeile AllowUsers entspricht, und ersetzen Sie sie durch die Originalzeile, an die der Benutzername angehängt ist. Um sicherzustellen, dass die Aufgabe idempotent ist, überprüft eine negative Lookahead-Assertion im regulären Ausdruck, ob der Benutzername bereits in der Zeile vorhanden ist. Zum Beispiel:

- name: Add user to AllowUsers 
    replace: 
    backup: yes 
    dest: /etc/ssh/sshd_config 
    regexp: '^(AllowUsers(?!.*\b{{ user_name }}\b).*)$' 
    replace: '\1 {{ user_name }}' 
+1

Die Regex in dieser Antwort funktioniert genauso gut für 'lineinfile', wenn Sie' backrefs: yes' verwenden. Ich kämpfte damit, bis ich diese Regex fand - stellt sich heraus, dass die geheime Sauce, die ich vermisste, das '\ b' war. – 2rs2ts

Verwandte Themen