it-swarm.com.ru

ansible ssh Подскажите вопрос о известных_хостах

Я использую 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

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

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

Следовательно, как я могу подавить запрос, выдаваемый 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. Как я могу передать настройки (что есть в файле конфигурации) в качестве параметров/опций для ansible в командной строке, чтобы он будет запускаться впервые на новой машине (без запроса/в зависимости от записи файла known_hosts на исходной машине для целевой машины?

33
Arun Sangal

Ответные документы имеют раздел об этом . Цитирование:

В 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".

38
Ben Whaley

Для обновления локального known_hosts файл, я использовал комбинацию ssh-keyscanDig для преобразования имени хоста в IP-адрес) и ответного модуля known_hosts следующим образом: (имя файла 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

)

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

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

29
Stepan Vavra

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

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

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

(Демонстрируется здесь, как вы найдете после подготовка к ec2 .)

16
Xiong Chiamiov

После правильного ответа @Stepan Vavra. Укороченная версия:

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

Не будет делать что-то вроде этой работы для заправки файла 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.

5
Nick Istre

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

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

/etc/ssh/ssh_config

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

StrictHostKeyChecking no

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

Предупреждение: Ansible больше не будет выполнять проверку ключа хоста SSH для любых соединений с вышеуказанными настройками

1
dsaydon