2017-02-02 11 views
1

ich eine Zeile in der Datei sshd_config unter Verwendung ansible Kommentar- will und ich habe folgende Arbeitskonfiguration:ansible uncomment Zeile in der Datei

- name: Uncomment line from /etc/ssh/sshd_config 
    lineinfile: 
     dest: /etc/ssh/sshd_config 
     regexp: '^#AuthorizedKeysFile' 
     line: 'AuthorizedKeysFile .ssh/authorized_keys' 

jedoch diese Konfiguration funktioniert nur, wenn die Linie von #AuthorizedKeysFile beginnt, aber es gewann Es funktioniert nicht, wenn die Zeile mit # AuthorizedKeysFile oder # AuthorizedKeysFile beginnt (Leerzeichen zwischen und den Wörtern).

Wie kann ich die Regexp so konfigurieren, dass nach "#" keine Leerzeichen berücksichtigt werden?


Ich habe versucht, eine andere lineinfile Option mit einem Leerzeichen nach ‚#‘ hinzuzufügen, aber das ist keine gute Lösung:

- name: Uncomment line from /etc/ssh/sshd_config 
    lineinfile: 
     dest: /etc/ssh/sshd_config 
     regexp: '# AuthorizedKeysFile' 
     line: 'AuthorizedKeysFile .ssh/authorized_keys' 
+0

Bitte teilen, was haben Sie versucht? –

Antwort

3

Wenn Sie kein oder mehr weiße Leerzeichen nach dem Zeichen ‚#‘, sollte die folgend genügen:

- name: Uncomment line from /etc/ssh/sshd_config 
    lineinfile: 
     dest: /etc/ssh/sshd_config 
     regexp: '^#\s*AuthorizedKeysFile.*$' 
     line: 'AuthorizedKeysFile .ssh/authorized_keys' 

Die Änderung zum ursprünglichen Code ist die Zugabe der \s* und die .*$ in der Regex.

Erläuterung:

\s - Spiele Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche und Form-Feeds)

* - gibt an, dass der Ausdruck auf sie verlassen hat (\s) keine oder mehrere Instanzen in einem Spiel haben kann

.* - entspricht null oder mehr beliebige Zeichen

$ - stimmt mit dem Ende der Linie

+0

+: Es wird über die gewünschte Zeile und nicht in möglichen Kommentaren arbeiten. -: Es wird nicht mit einem guten Zustand enden. –

+1

Es sollte nicht im OK-Zustand enden, da es die Datei geändert hat. Der erste Lauf wird geändert. Zweiter Lauf wird übersprungen, da es nicht mit der Regex übereinstimmt. –

+0

Ich bin mir nicht sicher, warum das wichtig ist? –

4

Erstens Sie die falsche Sprache verwenden. Mit Ansible sagen Sie nicht, was zu tun ist, sondern definieren den gewünschten Zustand. Es sollte also nicht Uncomment line form /etc/ssh/sshd_config, sondern Ensure AuthorizedKeysFile is set to .ssh/authorized_keys sein.

Zweitens ist es egal, was der Ausgangszustand ist (wenn die Zeile kommentiert ist oder nicht). Sie müssen eine eindeutige Zeichenfolge angeben, die die Zeile identifiziert.

Mit sshd_config ist dies möglich, da die AuthorizedKeysFile Direktive nur einmal in der Datei vorkommt. Bei anderen Konfigurationsdateien könnte dies schwieriger sein.

- name: Ensure AuthorizedKeysFile is set to .ssh/authorized_keys 
    lineinfile: 
    dest: /etc/ssh/sshd_config 
    regexp: AuthorizedKeysFile 
    line: 'AuthorizedKeysFile .ssh/authorized_keys' 

Es wird jede Zeile AuthorizedKeysFile String mit übereinstimmen (unabhängig davon, ob es oder nicht ist kommentiert, oder wie viele Räume gibt es) und die volle Linie ist sicherzustellen, dass:

AuthorizedKeysFile .ssh/authorized_keys

Wenn die Leitung waren anders, wird Ansible "geänderten" Zustand melden.

Beim zweiten Durchlauf wird Ansible die AuthorizedKeysFile erneut finden und feststellen, dass sich die Zeile bereits im gewünschten Status befindet, sodass die Task mit dem Status "OK" beendet wird.


Ein Nachteil der obigen Aufgabe besteht darin, dass, wenn eine der Linien einen Kommentar wie ein echten, vorsätzlicher Kommentar enthält (zum Beispiel einer Erklärung in englischer Sprache die Zeichenfolge AuthorizedKeysFile enthält), ansible diese Zeile mit der ersetzen Wert angegeben in line.

+0

+: Bei der zweiten Ausführung wird Ansible das AuthorizedKeysFile erneut finden und feststellen, dass sich die Zeile bereits im gewünschten Status befindet. Daher wird die Aufgabe mit dem Status "OK" beendet. -: Ein Vorbehalt mit der obigen Aufgabe: Wenn eine der Zeilen einen Kommentar enthält, kann Ansible diese Zeile durch den in Zeile angegebenen Wert ersetzen. –

+1

Sie sollten Ansible nicht verwenden, um vorhandene Dateien zu ändern, wenn Sie nicht genau wissen, was Sie tun. Verwenden Sie stattdessen Vorlagen. – techraf

+0

Vorlagen eignen sich am besten für vollständige Dateien. Wenn Sie Teile einer Datei modifizieren, ist lineinfile absolut akzeptabel, genau das ist es, wofür es gedacht ist. –

Verwandte Themen