ansible ssh invite les hôtes connus question

j'exécute un playbook possible et il fonctionne très bien sur une machine.

sur une nouvelle machine quand j'essaie pour la première fois, j'obtiens l'erreur suivante.

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

cette erreur peut être résolue, si je vais d'abord à la machine source (d'où j'exécute le playbook) et manuellement ssh à la machine cible (en tant qu'utilisateur donné) et entre "Oui" pour l'entrée de fichier known_hosts.

Maintenant, si je lance le même ansible playbook deuxième temps, il fonctionne sans erreur.

par conséquent, comment puis-je supprimer l'invite ce que SSH donne tout en faisant l'entrée SSH known_hosts pour la première fois pour un utilisateur donné (~/.ssh dossier, le fichier known_hosts)?

j'ai trouvé que je peux le faire si j'utilise les entrées de configuration suivantes dans ~/.SSH / config fichier.

~/.SSH / config

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

c'est à dire si je place le code ci-dessus à l'utilisateur ~/.fichier SSH / config d'une machine distante et essayer un playbook possible pour la première fois, je ne vais pas soyez invité à entrer " Oui " et playbook s'exécutera avec succès (sans exiger de l'utilisateur de créer manuellement une entrée de fichier known_hosts de la machine source à la machine cible/distante).

Mes questions: 1. Quelles questions de sécurité je devrais prendre soin si je vais~/.ssh/config façon 2. Comment puis-je passer les paramètres (qu'est-ce qu'il y a dans le fichier de configuration) comme paramètres/options à une possible en ligne de commande pour qu'elle tourne pour la première fois sur une nouvelle machine (sans demander / en fonction de la l'entrée de fichier known_hosts sur la machine source de la machine cible?

21
demandé sur Arun Sangal 2015-05-14 01:15:07

6 réponses

les docs ansibles ont un article sur ce. Le cite:

Ansible 1.2.1 et plus tard ont la vérification des clés hôtes activée par défaut.

si un hôte est réinstallé et a une clé différente dans 'known_hosts', cela résultera en un message d'erreur jusqu'à ce qu'il soit corrigé. Si un hôte n'est pas initialement dans "known_hosts", cela se traduira par une demande de confirmation de la clé, ce qui se traduit par une expérience interactive si vous utilisez Ansible, à partir de cron par exemple. Vous ne pourriez pas vouloir cela.

si vous comprenez les implications et souhaitez désactiver ce comportement, vous pouvez le faire en éditant /etc/ansible/ansible.cfg ou ~/.ansible.cfg:

[defaults]
host_key_checking = False

alternativement cela peut être défini par une variable d'environnement:

$ export ANSIBLE_HOST_KEY_CHECKING=False

notez aussi que la vérification de la clé hôte en mode paramiko est assez lente, donc passer à ' ssh’ est également recommandé lors de l'utilisation de ce caractéristique.

29
répondu Ben Whaley 2015-05-14 00:05:11

mettre À jour locale known_hosts file, j'ai fini par utiliser une combinaison de ssh-keyscan (avec dig pour résoudre un nom d'hôte en adresse IP) et ansible module known_hosts comme suit: (Nom du fichier 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 }}"

pour exécuter un tel yml, faites

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

en conséquence, pour chaque hôte dans le inventaire, tous les algorithmes pris en charge seront ajoutés/mis à jour dans le known_hosts fichier nom d'hôte,adresse ip la paire enregistrement; ces

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

(pourvu que le inventaire le fichier ressemble à ceci:

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

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

)

par opposition à la réponse de Xiong, cela permettrait de traiter correctement le contenu du known_hosts fichier.

ce jeu est particulièrement utile si vous utilisez un environnement virtualisé où les hôtes cibles sont réimagulés (ainsi les touches SSH pub sont modifiées).

24
répondu Stepan Vavra 2016-08-22 15:45:33

désactiver complètement la vérification des clés de l'hôte est une mauvaise idée du point de vue de la sécurité, car cela vous ouvre aux attaques de type "homme au milieu".

si vous pouvez supposer que le réseau actuel n'est pas compromis (c'est-à-dire que lorsque vous SSH à la machine pour la première fois et sont présentés une clé, cette clé est en fait de la machine et non d'un attaquant), alors vous pouvez utiliser ssh-keyscan et le module shell pour ajouter les clés des nouveaux serveurs à votre fichier hosts connu (edit: Stepan réponse est-ce mieux):

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

(a Démontré ici que vous trouverez après ec2 provisionnement.)

15
répondu Xiong Chiamiov 2017-10-20 19:36:52

suivant la réponse correcte de @Stepan Vavra. Une version plus courte est:

- known_hosts:
    name: "{{ item }}"
    key: "{{ lookup('pipe', 'ssh-keyscan {{ item }},`dig +short {{ item }}`') }}"
  with_items:
   - google.com
   - github.com
6
répondu user1634074 2018-01-19 14:01:21

vous pouvez également le définir à partir du niveau du système d'exploitation du serveur. vous aurez besoin de configurer le fichier de configuration ssh pour éviter que la vérification ssh ne vous invite:

modifier le chemin d'accès du fichier:

/etc/ssh/ssh_config

maintenant, décommentez la ligne:

StrictHostKeyChecking no

enregistrer les modifications et c'est tout

2
répondu dsaydon 2017-01-05 15:13:09

Ne pas faire quelque chose comme ce travail pour l'amorçage, le fichier known_hosts:

ANSIBLE_HOST_KEY_CHECKING=false ansible all -m ping

cela devrait se connecter à chaque hôte de l'inventaire, en mettant à jour le fichier known_hosts pour chaque hôte sans avoir à entrer "Oui" pour chaque invite, puis exécute le module "ping" sur chaque hôte?

un test rapide (effacement de mon fichier known_hosts puis exécution de ce qui précède, fait sur une instance Ubuntu 16.04) a semblé peupler le fichier known_hosts avec leur courant empreinte.

@Stepan la solution de Vavra ne fonctionnait pas pour moi car j'utilisais des hôtes aliasés (se connectait à des IP internes qui n'avaient pas de DNS disponibles pour eux, donc je voulais plus de noms descriptifs pour se référer à chaque hôte dans l'inventaire et avoir une variable ansible_host point à L'IP réelle pour chacun). Exécuter ce qui précède était beaucoup plus simple et amorçait mon fichier known_hosts sans avoir à désactiver la vérification de la clé hôte dans ansible ou ssh.

1
répondu Nick Istre 2017-06-02 17:17:32