Ansible: проверить, содержит ли файл только заданные строки, не более

Используя Ansible, я стараюсь убедиться, что файлы .ssh/authorized_keys наших серверов содержат только заданный набор ключей ssh. Независимо от аранжировки.

  1. Если чего-то не хватает, добавьте его (нет проблем, lineinfile)
  2. Если кто-то еще подсунул лишний ключ (которого нет в списке with_items), удалите его и верните какое-нибудь предупреждение или что-то в этом роде. Что ж... "изменено" тоже может быть приемлемым, но было бы неплохо как-то различать "отсутствующие" и "проникшие" строки.

Первая часть проста:

- name: Ensure ssh authorized_keys contains the right users
  lineinfile:
    path: /root/.ssh/authorized_keys
    owner: root
    group: root
    mode: 0600
    state: present
    line: '{{ item }}'

  with_items:
    - ssh-rsa AABBCC112233... [email protected]
    - ssh-rsa DDEEFF112233... [email protected]

А вот вторая часть выглядит сложнее. По крайней мере, сделать это с помощью короткого и элегантного кода.

Любые идеи?


person Julen Larrucea    schedule 02.11.2017    source источник
comment
lineinfile вам не друг.   -  person tedder42    schedule 02.11.2017
comment
почему бы просто не всегда перезаписывать цель исходным файлом?   -  person Neil McGuigan    schedule 02.11.2017
comment
@NeilMcGuigan: Это может сработать, но тогда я не узнаю, отсутствует ли какой-то ключ или есть лишний.   -  person Julen Larrucea    schedule 02.11.2017


Ответы (1)


Существует authorized_key_module, и он имеет exclusive вариант.
Но обратите внимание, что exclusive не работает с with_items.

Используйте что-то вроде этого:

- name: Ensure ssh authorized_keys contains the right users
  authorized_key:
    user: root
    state: present
    exclusive: yes
    key: '{{ ssh_keys | join("\n") }}'
  vars:
    ssh_keys:
      - ssh-rsa AABBCC112233... [email protected]
      - ssh-rsa DDEEFF112233... [email protected]         

Проверьте перед использованием!

Если у вас есть ключи в файлах, вы можете найти этот ответ полезным.

person Konstantin Suvorov    schedule 02.11.2017
comment
Ух ты! это хорошо! Но как определить переменную ssh_keys? Я пробовал использовать многострочную строку, и она просто разбивается на символы с символами новой строки... Будет ли это эквивалентно использованию файла ключа с параметром with_file? - person Julen Larrucea; 02.11.2017
comment
Извините, забыл определить. Также, если у вас есть ключи в файлах, я добавил ссылку на другой ответ. - person Konstantin Suvorov; 03.11.2017
comment
Благодарю вас! это именно то, что я хотел. - person Julen Larrucea; 03.11.2017
comment
Работает как шарм. Благодарю вас! - person Balázs Lengyák; 23.08.2019