Wie konfiguriere ich SSH-Schlüssel in einem Vagrant-Setup mit mehreren Computern?

11

Ich habe 4 VMs in meinem Vagrantfile - 3 Anwendungsserver und einen Ansible-Steuerungshost.

Ich verwende Vagrant nur zum Erstellen der VMs, da ich sie manuell vom ansible-Steuerungshost aus bereitstelle, da ich die ansible-Skripte noch erstelle / bearbeite.

Ich kann vagrant ssh ansibleund vagrant ssh app1/2/3usw., aber wenn ich versuche, dies ansible-playbook oracle.ymlvom Ansible-Steuerungshost aus zu tun , schlägt SSH mit fehl

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}

Ich kann mit Hilfe von User Vagrant und Password Vagrant erfolgreich von der Ansible VM zur Oracle VM ssh.

Die wichtigsten Teile meiner Vagrant-Datei sind:

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

Was muss ich in die Vagrant-Datei einfügen, damit die Ansible-VM eine Verbindung zu den anderen VMs herstellen kann, ohne dass ein Kennwort oder zusätzliche manuelle Schritte erforderlich sind vagrant up?

Dies ist nur für Entwicklungstests in einem privaten Netzwerk auf Entwickler-PCs gedacht, sodass Sicherheit kein wirkliches Problem darstellt und an zweiter Stelle nach einfacher Implementierung und reibungsloser Benutzererfahrung steht.

opticyclisch
quelle
1
Duplikat von devops.stackexchange.com/questions/1017/…
James Shewey
Ich habe ganz klar gesagt, dass ich zwischen VMs ssh kann, es ist nur so, dass ansible nicht kann, weil dafür Schlüssel eingerichtet werden müssen. Er kann nicht ssh. Die Fragen sind deutlich unterschiedlich.
opticyclic
@ JamesShewey: Ich denke nicht, dass eine Antwort auf diese Frage dafür relevant ist. Die Antwort bezieht sich auf Mitteilungen des Gastgebers an die Gäste; Die erforderliche Antwort muss zwischen den Gästen gelten.
Torenware Networks

Antworten:

8

Es gibt keine allgemeine Methode und es kann davon abhängen, wie boxcutter/ol67verpackt wurde.

  1. Die einfachste Methode wäre, das Passwort in der Ansible-Inventardatei zu definieren:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
  2. Die zweite Methode besteht darin, den unsicheren privaten Schlüssel auf dem oracle-vmComputer zu belassen und den privaten Schlüssel in die ansibleVM einzuspeisen:

    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. Generieren Sie das Schlüsselpaar zuvor auf dem Hostcomputer, fügen Sie Ansible VM einen privaten Schlüssel und Oracle einen öffentlichen Schlüssel hinzu authorized_keys.

  4. Generieren Sie das Schlüsselpaar auf Ansible VM, kopieren Sie den öffentlichen Schlüssel mithilfe des Shell-Provisioners auf Oracle VM und fügen Sie ihn vagrantals Kennwort für ein ssh-copy-id.

Und die Liste endet hier nicht, sie hängt von der erforderlichen Sicherheit ab.

Techraf
quelle
7

Basierend auf dem dritten Vorschlag von techraf habe ich Folgendes getan:

  • vagrant up ansible
  • ssh-keygen(kein Passwort nur gedrückt Enter)
  • kopiert .ssh/id_rsaund .ssh/id_rsa.pubin das Projektverzeichnis
  • vagrant destroy ansible
  • geändert, Vagrantfileum die id_rsaauf alle Hosts zu kopieren
  • geändert, Vagrantfileum das id_rsa.pubin authorized_keysauf allen Hosts zu kopieren
  • Die Vagrant-Datei wurde geändert, um die Host-Überprüfung zu deaktivieren

Vagrantfile-Snippet:

 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
opticyclisch
quelle
Diese Lösung funktionierte gut für mich, aber ich musste Host 192.168. *. * Auf nur * ändern. Nicht sicher warum. Vielen Dank!
Zacho
0

Wenn Sie einen vorformatierten Block in einer Liste haben möchten, rücken Sie ihn um acht Leerzeichen ein:

  1. öffentlichen / privaten Schlüssel generieren

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
  2. Bearbeiten Sie die Vagrant-Datei und fügen Sie die folgenden Zeilen hinzu: config.vm.provision "Datei", Quelle: "id_rsa", Ziel: "/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
quelle
Ist dies nur eine neu formatierte Version meiner Antwort? Wenn ja, sollten Sie wahrscheinlich nur meine Antwort bearbeiten, anstatt eine neue hinzuzufügen.
opticyclic