Pokud za znakem '#' potřebujete nula nebo více mezer, mělo by stačit následující:
- name: Uncomment line from /etc/ssh/sshd_config
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^#\s*AuthorizedKeysFile.*$'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
Úpravou vašeho původního kódu je přidání \s*
a .*$
v regulárním výrazu.
Vysvětlení:
\s
- odpovídá bílým znakům (mezery, tabulátory, zalomení řádků a posuvy formuláře)
*
- určuje, že výraz nalevo od něj (\s
) může mít nula nebo více instancí ve shodě
.*
- odpovídá nule nebo více libovolnému znaku
$
- odpovídá konci řádku
Za prvé, používáte špatný jazyk. U Ansible mu neříkáte, co má dělat, ale definujete požadovaný stav. Takže by to nemělo být Uncomment line form /etc/ssh/sshd_config
, ale Ensure AuthorizedKeysFile is set to .ssh/authorized_keys
.
Za druhé, nezáleží na tom, jaký je počáteční stav (zda je řádek zakomentován nebo ne). Musíte zadat jeden jedinečný řetězec, který identifikuje řádek.
S sshd_config
to je možné jako AuthorizedKeysFile
direktiva se v souboru vyskytuje pouze jednou. S jinými konfiguračními soubory to může být obtížnější.
- name: Ensure AuthorizedKeysFile is set to .ssh/authorized_keys
lineinfile:
dest: /etc/ssh/sshd_config
regexp: AuthorizedKeysFile
line: 'AuthorizedKeysFile .ssh/authorized_keys'
Bude odpovídat libovolnému řádku obsahujícímu AuthorizedKeysFile
řetězec (bez ohledu na to, zda je komentován nebo ne, nebo kolik je tam mezer) a ujistěte se, že celý řádek je:
AuthorizedKeysFile .ssh/authorized_keys
Pokud byl řádek jiný, Ansible oznámí "změněný" stav.
Při druhém spuštění Ansible najde AuthorizedKeysFile
znovu a zjistit, že linka je již v požadovaném stavu, takže úlohu ukončí stavem "ok".
Jednou výhradou k výše uvedenému úkolu je, že pokud některý z řádků obsahuje komentář, jako je skutečný, záměrný komentář (například vysvětlení v angličtině obsahující řetězec AuthorizedKeysFile
), Ansible nahradí tento řádek hodnotou uvedenou v line
.