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 }}'