¿Cómo configuro las claves SSH en una configuración de varias máquinas Vagrant?


11

Tengo 4 máquinas virtuales en mi Vagrantfile: 3 servidores de aplicaciones y un host de control Ansible.

Solo uso Vagrant para crear las máquinas virtuales, ya que las aprovisiono manualmente desde el host de control ansible porque todavía estoy creando / editando los scripts ansibles.

Puedo hacer vagrant ssh ansibley vagrant ssh app1/2/3etc., pero cuando intento hacerlo ansible-playbook oracle.ymldesde el host de control Ansible, SSH falla con

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}

Puedo realizar ssh con éxito desde la VM de Ansible a la VM de Oracle utilizando el vagabundo de usuario y el vagabundo de contraseña.

Las partes clave de mi Vagrantfile son:

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

¿Qué necesito poner en el Vagrantfile para permitir que la VM Ansible se conecte a las otras VM sin requerir una contraseña o pasos manuales adicionales después vagrant up?

Esto es solo para las pruebas de desarrollo en una red privada en las PC de los desarrolladores, por lo que la seguridad no es realmente un problema y ocupa el segundo lugar para facilitar la implementación y la experiencia del usuario sin problemas.



Dije claramente que puedo hacer ssh entre máquinas virtuales, es solo que ansible no puede porque requiere la configuración de claves. No puede ssh. Las preguntas son claramente diferentes.
2017

@JamesShewey: No creo que ninguna respuesta a esa pregunta sea relevante para eso. La respuesta dada se refiere a las comunicaciones del anfitrión a los invitados; la respuesta necesaria debe aplicarse entre invitados.
Torenware Networks

Respuestas:


8

No existe un método general y puede depender de cómo boxcutter/ol67se empaquetó.

  1. El método más sencillo sería definir la contraseña en el archivo de inventario Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
    
  2. El segundo método sería dejar la clave privada insegura configurada en la oracle-vmmáquina e inyectar la clave privada en la ansibleVM:

    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. Genere el par de claves de antemano en la máquina host, inyecte la clave privada a Ansible VM, la clave pública a Oracle authorized_keys.

  4. Genere el par de claves en Ansible VM, copie la clave pública en Oracle VM usando el aprovisionador de shell e inyecte vagrantcomo contraseña para ssh-copy-id.

Y la lista no termina aquí, depende de la seguridad requerida.


8

Basado en la tercera sugerencia de techraf, hice lo siguiente:

  • vagrant up ansible
  • ssh-keygen(sin contraseña solo presionada Enter)
  • copiado .ssh/id_rsay .ssh/id_rsa.pubal directorio del proyecto
  • vagrant destroy ansible
  • modificado el Vagrantfilepara copiar id_rsaa todos los hosts
  • modificado el Vagrantfilepara copiar id_rsa.puben authorized_keystodos los hosts
  • modificó el Vagrantfile para deshabilitar la comprobación de host

Fragmento 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

Esta solución funcionó bien para mí, pero tuve que cambiar el Host 192.168. *. * A solo *. No estoy seguro de por qué. ¡Gracias!
Zacho

0

Si desea tener un bloque preformateado dentro de una lista, sangría por ocho espacios:

  1. generar clave pública / privada

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
    
  2. edite Vagrantfile, agregue las siguientes líneas: config.vm.provision "file", fuente: "id_rsa", destino: "/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

¿Es solo una versión reformateada de mi respuesta? Si es así, probablemente debería editar mi respuesta en lugar de agregar una nueva.
opticyclic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.