Можно ли использовать 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...