Comment configurer les clés SSH dans une configuration multi-machine Vagrant?

11

J'ai 4 machines virtuelles dans mon Vagrantfile - 3 serveurs d'applications et un hôte de contrôle Ansible.

J'utilise uniquement Vagrant pour créer les machines virtuelles car je les provisionne manuellement à partir de l'hôte de contrôle ansible car je suis toujours en train de créer / éditer les scripts ansible.

Je peux le faire vagrant ssh ansible, vagrant ssh app1/2/3etc., mais lorsque j'essaie de le faire à ansible-playbook oracle.ymlpartir de l'hôte de contrôle Ansible, SSH échoue avec

fatal: [192.168.60.10]: UNREACHABLE! => {"changed": false, "msg": "SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", "unreachable": true}

Je peux réussir ssh de la machine virtuelle Ansible à la machine virtuelle Oracle en utilisant vagrant utilisateur et mot de passe vagabond.

Les éléments clés de mon Vagrantfile sont:

config.ssh.insert_key = false

config.vm.define "db" do |db|
    db.vm.box = "boxcutter/ol67"
    db.vm.hostname = "oracle-vm"
    db.vm.network "forwarded_port", guest: 22, host: 2201, id: "ssh", auto_correct: false
    db.vm.network "forwarded_port", guest: 1521, host: 1521
    db.vm.network "private_network", ip: "192.168.60.10"
    db.vm.provider "virtualbox" do |v|
        v.name = "oracle-vm"
        v.linked_clone = true
        v.memory = 2048
        v.cpus = 2
    end
end

#Optional ansible control machine for Windows users
config.vm.define "ansible", autostart: false do |ansible|
    ansible.vm.box = "williamyeh/ansible"
    ansible.vm.hostname = "ansible-vm"
    ansible.vm.network "forwarded_port", guest: 22, host: 2204, id: "ssh", auto_correct: false
    ansible.vm.network "private_network", ip: "192.168.60.50"
    ansible.vm.provider "virtualbox" do |v|
        v.linked_clone = true
    end
    #Mount the project directory on the guest so we can run the playbooks from there
    ansible.vm.synced_folder ".", "/data/ansible", create: true
end

Que dois-je mettre dans le Vagrantfile pour permettre à la machine virtuelle Ansible de se connecter aux autres machines virtuelles sans nécessiter de mot de passe ou des étapes manuelles supplémentaires par la suite vagrant up?

C'est juste pour les tests de développement sur un réseau privé sur les PC des développeurs, donc la sécurité n'est pas vraiment un problème et vient en second lieu pour la facilité de mise en œuvre et l'expérience utilisateur fluide.

optique
la source
1
Duplicate of devops.stackexchange.com/questions/1017/…
James Shewey
J'ai dit très clairement que je peux ssh entre les VM, c'est juste que ansible ne le peut pas car il nécessite la configuration des clés. Il ne peut pas chier. Les questions sont clairement différentes.
opticyclique
@JamesShewey: Je ne pense pas qu'une réponse à cette question soit pertinente à cela. La réponse donnée fait référence aux communications de l'hôte aux invités; la réponse nécessaire doit s'appliquer entre les invités.
Torenware Networks

Réponses:

8

Il n'y a pas de méthode générale et cela peut dépendre de la façon dont a boxcutter/ol67été emballé.

  1. La méthode la plus simple serait de définir le mot de passe dans le fichier d'inventaire Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
  2. La deuxième méthode consisterait à laisser la clé privée non sécurisée configurée sur la oracle-vmmachine et à injecter la clé privée dans la ansiblemachine virtuelle:

    config.vm.provision "shell" do |s|
      ssh_insecure_key = File.readlines("#{Dir.home}/.vagrant.d/insecure_private_key").first.strip
      s.inline = <<-SHELL
        echo #{ssh_insecure_key} >> /home/vagrant/.ssh/id_rsa
        chown vagrant /home/vagrant/.ssh/id_rsa
        chmod 400 /home/vagrant/.ssh/id_rsa
      SHELL
    end
  3. Générez au préalable la paire de clés sur la machine hôte, injectez la clé privée à Ansible VM, la clé publique à Oracle authorized_keys.

  4. Générez la paire de clés sur Ansible VM, copiez la clé publique sur Oracle VM à l'aide du shell provisioner et injectez vagrantcomme mot de passe pour ssh-copy-id.

Et la liste ne s'arrête pas là, cela dépend de la sécurité requise.

techraf
la source
8

Sur la base de la troisième suggestion de techraf, j'ai fait ce qui suit:

  • vagrant up ansible
  • ssh-keygen(pas de mot de passe juste pressé Enter)
  • copié .ssh/id_rsaet .ssh/id_rsa.pubdans le répertoire du projet
  • vagrant destroy ansible
  • modifié le Vagrantfilepour copier le id_rsasur tous les hôtes
  • modifié le Vagrantfilepour copier le id_rsa.pubdans authorized_keystous les hôtes
  • modifié le Vagrantfile pour désactiver la vérification de l'hôte

Extrait de Vagrantfile:

 config.vm.provision "file", source: "id_rsa", destination: "/home/vagrant/.ssh/id_rsa"
 public_key = File.read("id_rsa.pub")
 config.vm.provision :shell, :inline =>"
     echo 'Copying ansible-vm public SSH Keys to the VM'
     mkdir -p /home/vagrant/.ssh
     chmod 700 /home/vagrant/.ssh
     echo '#{public_key}' >> /home/vagrant/.ssh/authorized_keys
     chmod -R 600 /home/vagrant/.ssh/authorized_keys
     echo 'Host 192.168.*.*' >> /home/vagrant/.ssh/config
     echo 'StrictHostKeyChecking no' >> /home/vagrant/.ssh/config
     echo 'UserKnownHostsFile /dev/null' >> /home/vagrant/.ssh/config
     chmod -R 600 /home/vagrant/.ssh/config
     ", privileged: false
optique
la source
Cette solution a bien fonctionné pour moi mais j'ai dû changer l'hôte 192.168. *. * En seulement *. Pas certain de pourquoi. Merci!
Zacho
0

Si vous souhaitez avoir un bloc préformaté dans une liste, indenter de huit espaces:

  1. générer une clé publique / privée

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
  2. éditez Vagrantfile, ajoutez les lignes suivantes: config.vm.provision "file", source: "id_rsa", destination: "/home/vagrant/.ssh/id_rsa"

        public_key = File.read("id_rsa.pub")
        config.vm.provision "shell", inline: <<-SCRIPT
            chmod 600 /home/vagrant/.ssh/is_rsa
            echo 'Copying ansible-vm public SSH Keys to the VM'
            #mkdir -p /home/vagrant/.ssh
            chmod 700 /home/vagrant/.ssh
            echo '#{public_key}' >> /home/vagrant/.ssh/authorized_keys
            chmod -R 600 /home/vagrant/.ssh/authorized_keys
            echo 'Host 192.168.*.*' >> /home/vagrant/.ssh/config
            echo 'StrictHostKeyChecking no' >> /home/vagrant/.ssh/config
            echo 'UserKnownHostsFile /dev/null' >> /home/vagrant/.ssh/config
            chmod -R 600 /home/vagrant/.ssh/config
            SCRIPT
  3.         vagrant up // or vagrant reload --provision
tar tu
la source
Est-ce juste une version reformatée de ma réponse? Si c'est le cas, vous devriez probablement modifier ma réponse plutôt que d'en ajouter une nouvelle.
opticyclique