Ansible - перемещение ключей SSH между двумя узлами

ssh ansible ssh-keygen

2237 просмотра

1 ответ

17 Репутация автора

Вот проблема, над которой я работаю.

У меня есть сервер ansible У меня есть другой сервер M У меня есть другие серверы B1, B2, B3 ... все известны по ansible

У меня есть файл hosts, такой как этот

[CTRL]
M

[SLAVES]
B1
B2
B3

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

Вот что я попробовал:

- hosts: CTRL
  remote_user: root
  vars_prompt:
   - name: ssh_password
     prompt : Please enter password for ssh key copy on remote nodes
     private: yes
  tasks:
   - yum: name=sshpass state=present
     sudo: yes
   - name: generate ssh key on the controller
     shell : ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N /dev/null
   - name: copy ssh key to the other nodes
     shell : sshpass -p '{{ ssh_password }}' ssh-copy-id root@'{{ item }}'
     with_items: groups['SLAVES']
     delegate_to: "{{ groups['CTRL'][0] }}"

Генерация ключей работает, но как бы я ни работал, у меня проблема с копированием ключа на подчиненные хосты

failed: [M -> M] => (item=B1) => {"changed": true, "cmd": "sshpass -p 'mypassword' ssh-copy-id root@'B1'", "delta": "0:00:00.101102", "end": "2016-07-18 11:08:56.985623", "item": "B1", "rc": 6, "start": "2016-07-18 11:08:56.884521", "warnings": []}
failed: [M -> M] => (item=B2) => {"changed": true, "cmd": "sshpass -p 'mypassword' ssh-copy-id root@'B2'", "delta": "0:00:00.101102", "end": "2016-07-18 11:08:56.985623", "item": "B1", "rc": 6, "start": "2016-07-18 11:08:56.884521", "warnings": []}
failed: [M -> M] => (item=B3) => {"changed": true, "cmd": "sshpass -p 'mypassword' ssh-copy-id root@'B3'", "delta": "0:00:00.101102", "end": "2016-07-18 11:08:56.985623", "item": "B1", "rc": 6, "start": "2016-07-18 11:08:56.884521", "warnings": []}

Вы знаете, как я мог исправить свой код, или, может быть, у вас есть более простой способ сделать то, что я хочу сделать?

Спасибо.

Автор: Matthew Источник Размещён: 18.07.2016 09:51

Ответы (1)


2 плюса

43924 Репутация автора

Решение

Это более аккуратное решение без выборки файлов:

---
- hosts: M
  tasks:
    - name: generate key pair
      shell: ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N /dev/null
      args:
        creates: /root/.ssh/id_rsa 

    - name: test public key
      shell: ssh-keygen -l -f /root/.ssh/id_rsa.pub
      changed_when: false

    - name: retrieve public key
      shell: cat /root/.ssh/id_rsa.pub
      register: master_public_key
      changed_when: false

- hosts: SLAVES
  tasks:
    - name: add master public key to slaves
      authorized_key:
        user: root
        key: "{{ hostvars['M'].master_public_key.stdout }}"

Одно из возможных решений (мой первый ответ):

---
- hosts: M
  tasks:
    - name: generate key pair
      shell: ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N /dev/null

    - name: fetch public key
      fetch:
        src: /root/.ssh/id_rsa.pub
        dest: tmp/
        flat: yes

- hosts: SLAVES
  tasks:
    - name: add master public key to slaves
      authorized_key:
        user: root
        key: "{{ lookup('file', 'tmp/id_rsa.pub') }}"
Автор: Konstantin Suvorov Размещён: 18.07.2016 01:55
Вопросы из категории :
32x32