Ansible: вставить одно слово в существующую строку файла
Я должен использовать модули Ansible для редактирования файла /etc/ssh/sshd_config - каждый раз, когда я создаю нового пользователя, я хочу добавить его в эти две строки:
AllowUsers root osadmin <new_user>
AllowGroups root staff <new_group>
в данный момент я использую модуль оболочки для выполнения команды sed, но хотел бы использовать lineinfile, если это возможно
- shell: "sed -i '/^Allow/ s/$/ {{ user_name }}/' /etc/ssh/sshd_config"
какие предложения будут искренне признательны.
3 ответов
вы можете сделать это в одной пьесе с новой линией, но я думаю, что чище использовать два lineinfile
играет для этого.
- 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(' ')}}"
отметим, что groups
является зарезервированным словом, поэтому не используйте его в качестве имени переменной.
на заменить модуль заменит все экземпляры шаблона регулярного выражения в файле. Напишите задачу в соответствии с AllowUsers
строка и замените ее исходной строкой, добавленной с именем пользователя. Чтобы убедиться, что задача является идемпотентной, отрицательное утверждение lookahead в регулярном выражении проверяет, отображается ли имя пользователя в строке. Например:
- name: Add user to AllowUsers
replace:
backup: yes
dest: /etc/ssh/sshd_config
regexp: '^(AllowUsers(?!.*\b{{ user_name }}\b).*)$'
replace: ' {{ user_name }}'
это сработало для меня
- name: Add Group to AllowGroups
lineinfile:
dest=/etc/ssh/sshd_config
backup=True
backrefs=True
state=present
regexp='^(AllowGroups(?!.*\b{{ groupname }}\b).*)$'
line=' {{ groupname }}'