2015-07-15 10 views
5

Devo usare i moduli Ansible per modificare il file/etc/ssh/sshd_config - ogni volta che creo un nuovo utente voglio aggiungerlo a questi due linee:Ansible: inserisci una singola parola su una riga esistente in un file

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

In questo momento sto usando il modulo di shell per eseguire un comando sed ma vorrebbero utilizzare lineinfile, se possibile

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

Ogni suggerimento sarà sinceramente apprezzato.

+1

L'utilizzo di 'sed -i' in tali file è pericoloso. Almeno, usare '-i.bak' per avere un backup per ogni evenienza. – fedorqui

+0

Non voglio usare sed, mi piacerebbe sostituirlo se possibile con il modulo lineinfile –

+1

lineinfile è spesso un antipattern- in questo caso, probabilmente si vuole comunque portare il file sshd_config all'interno della gestione della configurazione. – tedder42

risposta

5

Si potrebbe fare in un gioco singolo con un ritorno a capo, ma penso che sia più pulito utilizzare due giochi lineinfile per questo.

- 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(' ')}}" 

Nota che groups è una parola riservata in modo da non utilizzare che come un nome di variabile.

10

replace module sostituirà tutte le occorrenze di un modello di espressione regolare all'interno di un file. Scrivere un'attività per abbinare la linea AllowUsers e sostituirla con la linea originale aggiunta con il nome utente. Per garantire che l'attività sia idempotente, un'asserzione lookahead negativa nell'espressione regolare controlla se il nome utente appare già nella riga. Ad esempio:

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

L'espressione regolare in questa risposta funziona anche con 'lineinfile' se si utilizza' backrefs: yes'. Stavo lottando con questo fino a quando ho trovato questo regex - si scopre la salsa segreta mi mancava era il '\ b'. – 2rs2ts

Problemi correlati