Назначьте несколько открытых ключей ssh ​​для определений пользователей с модулем авторизованным ключом в Ansible - PullRequest
2 голосов
/ 05 октября 2019

Вопрос:

Используя Ansible, как настроить несколько файлов открытого ключа (.pub) для развертывания в файле authorized_keys пользователя вместо использования одного файласодержащий список открытых ssh-ключей?


Сценарий и требования:

  • У меня есть несколько открытых ssh-ключей, сохраненных в виде .pub файловв центральном расположении
  • Я хочу создать новых пользователей из vars файла
  • , каждый пользователь должен иметь (нет / один конкретный / несколько) открытых ssh-ключей из набора .pub файлы, развернутые в соответствующие файлы authorized_keys
  • список развернутых файлов .pub может измениться из-за:
    • содержимое файла .pub изменилось в связи, например, с. скомпрометированный закрытый ключ
    • пользователю в файле vars должны быть назначены дополнительные файлы открытого ключа
  • Я не хочу просматривать файл "списка" для каждого пользователязаменить ключ

В настоящее время развернуто:

vars-file (vars/users.yml):

users:
  - username: "bob"
    sshkey: "{{ lookup('file', 'files/ssh_keys/bob.keys') }}"
    ...
  - username: "alice"
    sshkey: "{{ lookup('file', 'files/ssh_keys/alice.keys') }}"
    ...

содержимоеbob.keys:

ssh-rsa admin-ssh-key= admin
ssh-rsa support-a-ssh-key= support-a
ssh-rsa bobs-ssh-key= hi im bob

содержимое alice.keys:

ssh-rsa admin-ssh-key= admin
ssh-rsa alice-ssh-key= hi im alice
ssh-rsa accounting-clerk-ssh-key= checking your progress

Ответственная роль Файл main.yml:

 - name: Add SSH keys
  authorized_key:
    user: "{{ item.username }}"
    state: "{{ item.sshkeystate }}"
    key: "{{ item.sshkey }}"
    exclusive: yes
  with_items: "{{ users }}"
  tags: [add ssh keys]

Сценарий проблемы:

  • support-a ssh-ключ скомпрометирован, и все пользователи, имеющие этот открытый ключ в своем файле authorized_keys, должны быть заменены новым открытым ключом
  • Мне нужно (sed) просмотреть все keys файлы и заменить скомпрометированный открытый ключ новым

Я пытался:

vars-file:

users:
  - username: "bob"
  sshkey:
    - "{{ lookup('file', 'files/ssh_keys/admin.pub') }}"
    - "{{ lookup('file', 'files/ssh_keys/support_a.pub') }}"
    - "{{ lookup('file', 'files/ssh_keys/bob.pub') }}"
  ...
  - username: "alice"
  sshkey:
    - "{{ lookup('file', 'files/ssh_keys/admin.pub') }}"
    - "{{ lookup('file', 'files/ssh_keys/alice.pub') }}"
    - "{{ lookup('file', 'files/ssh_keys/accounting_clerk.pub') }}"

Тем не менее, я получаю эту ошибку при выполнении ANSIBLE роли: "msg": "invalid key specified: ['ssh-rsa admin-ssh-key= admin', 'ssh-rsa support-a-ssh-key= support-a', 'ssh-rsa bobs-ssh-key= hi im bob']"

Я также пробовал что-то вроде этого (https://stackoverflow.com/a/54079374) решение, но я думаю,Сценарий и требования немного отличаются, и в моем сценарии нет ничего общего с selectattr() (я думаю).


Может кто-нибудь указать мне, как решить эту проблему, или я иду в совершенно неправильном направлении? ? Приветствия.

1 Ответ

0 голосов
/ 05 октября 2019

Как я могу судить, единственная часть, которая отличается в вашей игровой книге от той, на которую вы ссылаетесь, - это часть "\n".join(), которая сворачивает список в один текстовый блок. Как верно указывает ansible, вы предоставляете list[str] атрибуту, который ожидает str

Я не верю, что в ваших обстоятельствах вам нужно использовать selectattr или любую фильтрацию, потому что вы хотите, чтобы всеключи все время. Таким образом:

- name: Add SSH keys
  authorized_key:
    user: "{{ item.username }}"
    state: "{{ item.sshkeystate }}"
    key: '{{ item.sshkey | join("\n") }}'
    exclusive: yes
  with_items: "{{ users }}"
  tags: [add ssh keys]
...