Ansible ssh prompt known_hosts проблема - программирование

Ansible ssh prompt known_hosts проблема

Я запускаю Ansible playbook, и он отлично работает на одной машине.

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

17:04:34 PLAY [appservers] ************************************************************* 
17:04:34 
17:04:34 GATHERING FACTS *************************************************************** 
17:04:34 fatal: [server02.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 fatal: [server01.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 
17:04:34 TASK: [common | remove old ansible-tmp-*] ************************************* 
17:04:34 FATAL: no hosts matched or all hosts have already failed -- aborting
17:04:34 
17:04:34 
17:04:34 PLAY RECAP ******************************************************************** 
17:04:34            to retry, use: --limit @/var/lib/jenkins/site.retry
17:04:34 
17:04:34 server01.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 server02.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 
17:04:34 Build step 'Execute shell' marked build as failure
17:04:34 Finished: FAILURE

Эта ошибка может быть решена, если я сначала перейду на исходный компьютер (откуда я запускаю загружаемую книгу) и вручную ssh на целевую машину (как данный пользователь) и введите "да" для записи файла known_hosts.

Теперь, если во второй раз я запускаю одну и ту же загружаемую плейбук, она работает без ошибок.

Поэтому, как я могу подавить подсказку о том, что SSH дает при создании записи ssh known_hosts в первый раз для данного пользователя (папка ~/.ssh, файл known_hosts)?

Я нашел, что могу сделать это, если я использую следующие записи конфигурации в файле ~.ssh/config.

~/.ssh/конфигурации

# For vapp virtual machines
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  User kobaloki
  LogLevel ERROR

то есть. если я поместил вышеуказанный код в файл пользователя ~/.ssh/config на удаленном компьютере и впервые попробую Ansible playbook, мне не будет предложено ввести "да", и playbook будет успешно работать (без необходимости использования пользователя вручную создать запись файла known_hosts с исходного компьютера на целевую/удаленную машину).

Мои вопросы: 1. Какие проблемы безопасности я должен позаботиться, если я пойду ~/.ssh/config way 2. Как передать параметры (что там в файле конфигурации) в качестве параметров/параметров в доступную в командной строке, чтобы он запускался впервые на новом компьютере (без запроса/в зависимости от записи файла known_hosts на исходной машине для целевой машины?

4b9b3361

Ответ 1

В этих документах есть раздел об этом. Цитирование:

Ansible 1.2.1 и более поздние версии по умолчанию имеют проверку ключа хоста.

Если хост переустановлен и имеет другой ключ в 'known_hosts, это приведет к сообщению об ошибке до тех пор, пока не будет исправлено. Если хост не изначально находится в 'known_hosts, это приведет к подсказке для подтверждения ключа, что приведет к интерактивному опыту при использовании Ansible, скажем, cron. Возможно, вы не захотите этого.

Если вы понимаете последствия и хотите отключить это поведение, вы можете сделать это, отредактировав /etc/ansible/ansible.cfg или ~/.ansible.cfg:

[defaults]
host_key_checking = False

В качестве альтернативы это может быть задано переменной среды:

$ export ANSIBLE_HOST_KEY_CHECKING=False

Также обратите внимание, что проверка ключа хоста в режиме paramiko достаточно медленная, поэтому при использовании этой функции рекомендуется переключиться на 'ssh.

Ответ 2

Чтобы обновить локальный файл known_hosts, я закончил использование комбинации ssh-keyscandig для разрешения имени хоста на IP-адрес) и доступного модуля known_hosts следующим образом: (filename ssh-known_hosts.yml)

- name: Store known hosts of 'all' the hosts in the inventory file
  hosts: localhost
  connection: local

  vars:
    ssh_known_hosts_command: "ssh-keyscan -T 10"
    ssh_known_hosts_file: "{{ lookup('env','HOME') + '/.ssh/known_hosts' }}"
    ssh_known_hosts: "{{ groups['all'] }}"

  tasks:

  - name: For each host, scan for its ssh public key
    shell: "ssh-keyscan {{ item }},`dig +short {{ item }}`"
    with_items: "{{ ssh_known_hosts }}"
    register: ssh_known_host_results
    ignore_errors: yes

  - name: Add/update the public key in the '{{ ssh_known_hosts_file }}'
    known_hosts:
      name: "{{ item.item }}"
      key: "{{ item.stdout }}"
      path: "{{ ssh_known_hosts_file }}"
    with_items: "{{ ssh_known_host_results.results }}"

Чтобы выполнить такой yml, сделайте

ANSIBLE_HOST_KEY_CHECKING=false ansible-playbook path/to/the/yml/above/ssh-known_hosts.yml

В результате для каждого хоста в инвентаре все поддерживаемые алгоритмы будут добавлены/обновлены в файле known_hosts по имени хоста, записи пары ipaddress; таких как

atlanta1.my.com,10.0.5.2 ecdsa-sha2-nistp256 AAAAEjZHN ... NobYTIGgtbdv3K+w=
atlanta1.my.com,10.0.5.2 ssh-rsa AAAAB3NaC1y ... JTyWisGpFeRB+VTKQ7
atlanta1.my.com,10.0.5.2 ssh-ed25519 AAAAC3NaCZD ... UteryYr
denver8.my.com,10.2.13.3 ssh-rsa AAAAB3NFC2 ... 3tGDQDSfJD
...

(При условии, что файл инвентаризации выглядит следующим образом:

[master]
atlanta1.my.com
atlanta2.my.com

[slave]
denver1.my.com
denver8.my.com

)

В отличие от ответа Xiong, это будет правильно обрабатывать содержимое файла known_hosts.

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

Ответ 3

Отключение проверки ключа хоста - это плохая идея с точки зрения безопасности, так как она открывает вам атаки "человек-в-середине".

Если вы можете предположить, что текущая сеть не скомпрометирована (то есть, когда вы ssh на машине в первый раз и представлены ключ, этот ключ на самом деле является машиной, а не атакующим), тогда вы может использовать ssh-keyscan и оболочный модуль для добавьте ключи новых серверов в ваш файл известных хостов (отредактируйте: ответ Степана делает это лучше):

- name: accept new ssh fingerprints
  shell: ssh-keyscan -H {{ item.public_ip }} >> ~/.ssh/known_hosts
  with_items: ec2.instances

(Продемонстрировано здесь, как вы можете найти после ec2 provisioning.)

Ответ 4

Следуя @Stepan Vvra правильному ответу. Более короткая версия:

- known_hosts:
    name: "{{ item }}"
    key: "{{ lookup('pipe', 'ssh-keyscan {{ item }},`dig +short {{ item }}`') }}"
  with_items:
   - google.com
   - github.com

Ответ 5

вы также можете установить это на уровне сервера. вам нужно будет настроить конфигурационный файл ssh, чтобы избежать проверки ssh:

отредактируйте путь к файлу:

/etc/ssh/ssh_config

теперь раскомментируйте строку:

StrictHostKeyChecking no

сохранить изменения и что он

Ответ 6

Не делал бы что-то вроде этой работы для заливки файла known_hosts:

ANSIBLE_HOST_KEY_CHECKING=false ansible all -m ping

Это должно подключаться к каждому узлу в инвентаре, обновляя файл known_hosts для каждого хоста без необходимости вводить "да" для каждого приглашения, а затем запускает модуль "ping" на каждом хосте?

Быстрый тест (удаление моего файла known_hosts, а затем выполнение вышеуказанного, выполненного на экземпляре Ubuntu 16.04), как представляется, заполняет файл known_hosts их текущими отпечатками пальцев.

Решение @Stepan Vavra не работало для меня, поскольку я использовал псевдонимы (был подключен к внутренним IP-адресам, у которых не было DNS-сервера), поэтому я хотел, чтобы более описательные имена ссылались на каждый хост в инвентаре и с переменной ansible_host указывать фактический IP для каждого). Выполнение вышеизложенного было намного проще и загрузило мой файл known_hosts без необходимости отключать проверку ключа хоста в ansible или ssh.