2016-08-10 2 views
4

Я довольно новичок в использовании Ansible и читаю here и google и еще не нашел ответ.Можно ли использовать Ansible authorized_key exclusive с несколькими ключами?

Мой сценарий заключается в том, что у меня есть 1 пользователь на сервере, но 2-3 разных ключа паба, которые нужно поместить в файл 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 он берет последний ключ и добавляет его. Это было бы фантастически, если бы оно зацикливало и возвращало все ключи. Если в Ansible есть способ сделать это, я его не нашел.

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

ответ

7

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

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

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

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

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

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

+0

О, мужчина, ты спасатель! Прекрасно работает! Я только что открыл материал 'lookup', но пытался понять это. Большое спасибо! – Valien

1

Если держите ваши пользователи внутри переменной, которую вы могли бы использовать это:

--- 

- 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... 
+0

Это добавляет только последний ключ, но в соответствии с документами он должен работать. «Несколько ключей могут быть указаны в одном ключевом значении строки, разделив их на новые строки» http://docs.ansible.com/ansible/authorized_key_module.html Вы знаете, почему это сломано? – goetzc

+0

@goetzc Я не знаю :-( – czerasz

+0

Эй, это было то, что у меня были тестовые ключи, где одинаковые, только с другим комментарием, а затем Ansible добавили только последнее :) – goetzc

0

Если вы хотите, чтобы избежать 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 
Смежные вопросы