Можно ли использовать Ansible authorized key exclusive с несколькими ключами?

Я довольно новичок в использовании Ansible и читал здесь и google и еще не нашли ответа.

мой сценарий заключается в том, что у меня есть 1 пользователь на сервере, но 2-3 разных ключа pub, которые нужно поместить в файл authorized_keys.

Я могу успешно удалить все ключи или добавить ключи с помощью этого скрипта:

---
  - hosts: all

 tasks:
  - name: update SSH keys
    authorized_key:
     user: <user>
     key: "{{ lookup('file', item) }}"
     state: present
     #exclusive: yes
    with_fileglob:
      - ../files/pub_keys/*.pub

С present флаг он читает и добавляет все ключи. С absent флаг удаляет все ключи включенный.

проблема в том, что у меня есть старый ключ, который находится только на сервере, и я хочу удалить/перезаписать его и для будущих развертываний перезаписать любые несанкционированные ключи, которые могут быть на сервере, а не в моем playbook.

С exclusive флаг он принимает только последний ключ и добавляет его. Это было бы фантастично, если бы он зациклился и повторно добавил все ключи. Если есть способ сделать это в Анзибль, я не нашел его.

есть ли способ обойти паб файлы и используйте exclusive вариант в то же время?

3 ответов


есть ли способ зацикливаться на файлах pub и одновременно использовать эксклюзивную опцию?

нет. Существует примечание о петлях и эксклюзиве в docs:

эксклюзив: удалить ли все другие не указанные ключи из файла authorized_keys. Несколько ключей можно указать в одном значении строки ключа, разделив их по новым строкам. Этот параметр не знает цикла, поэтому, если вы используете with_, он будет эксклюзив на итерацию цикла, если вы хотите несколько ключей в файле, вам нужно передать их все ключу в одном пакете, как указано выше.

таким образом, вам нужно присоединиться ко всем вашим ключам и отправить их все сразу.
Что-то вроде этого:--4-->

- name: update SSH keys
  authorized_key:
    user: <user>
    key: "{{ lookup('pipe','cat ../files/pub_keys/*.pub') }}"
    state: present
    exclusive: yes

проверить этот код перед запуском в производство!


если вы хотите избежать pipe поиск (например, поскольку путь не относится к роли), вы также можете использовать комбинацию file и fileglob запросы:

- name: update SSH keys
  authorized_key:
    user: <user>
    key:  "{% for key in lookup('fileglob', 'pub_keys/*.pub').split(',') %}{{ lookup('file', key) ~ '\n'}}{% endfor %}"
    state: present
    exclusive: yes

Если вы держите своих пользователей внутри переменной, вы можете использовать это:

---

- hosts: all
  vars_files:
    - roles/users/vars/main.yml
  tasks:
    - name: Allow other users to login to the account
      authorized_key:
        user: user_name
        exclusive: yes
        key: "{{ developers|map(attribute='publish_ssh_key')|join('\n') }}"

на roles/users/vars/main.yml выглядит так:

---

developers:
  - name: user1
    publish_ssh_key: ssh-rsa AAAA...
  - name: user2
    publish_ssh_key: ssh-rsa AAAA...