Como configurar chaves SSH em uma configuração de várias máquinas do Vagrant?

11

Eu tenho 4 VMs em meus servidores de aplicativos Vagrantfile - 3 e um host de controle Ansible.

Eu só uso o Vagrant para criar as VMs enquanto as provisiono manualmente a partir do host de controle ansible, porque ainda estou criando / editando os scripts ansible.

Eu posso fazer vagrant ssh ansiblee vagrant ssh app1/2/3etc., mas quando tento fazer a ansible-playbook oracle.ymlpartir do host de controle Ansible, o SSH falha com

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}

Posso ssh com êxito da VM Ansible para a Oracle VM usando usuário vagrant e senha vagrant.

As partes principais do meu arquivo Vagrant são:

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

O que preciso colocar no Vagrantfile para permitir que a VM Ansible se conecte às outras VMs sem exigir uma senha ou etapas manuais extras depois vagrant up?

Isso é apenas para testes de desenvolvimento em uma rede privada em PCs de desenvolvedores, para que a segurança não seja realmente um problema e fique em segundo para facilitar a implementação e facilitar a experiência do usuário.

opticíclico
fonte
1
Duplicado de devops.stackexchange.com/questions/1017/…
James Shewey 25/17
Afirmei claramente que posso ssh entre VMs, é que o ansible não pode, porque exige a configuração de chaves. Ele não pode ssh. As perguntas são claramente diferentes.
Opticyclic
@ JamesShewey: Eu não acho que nenhuma resposta para essa pergunta seja relevante para isso. A resposta dada refere-se a comunicações do host para os convidados; a resposta necessária precisa ser aplicada entre os convidados.
Torenware Networks 15/03/19

Respostas:

8

Não existe um método geral e pode depender de como boxcutter/ol67foi embalado.

  1. O método mais fácil seria definir a senha no arquivo de inventário Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
  2. O segundo método seria deixar a chave privada insegura configurada na oracle-vmmáquina e injetar a chave privada na 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. Gere o par de chaves antecipadamente na máquina host, injete a chave privada na VM Ansible, a chave pública na da Oracle authorized_keys.

  4. Gere o par de chaves na VM Ansible, copie a chave pública para a Oracle VM usando o provisionador de shell e injete vagrantcomo senha para ssh-copy-id.

E a lista não termina aqui, depende da segurança necessária.

techraf
fonte
7

Com base na 3ª sugestão do techraf, fiz o seguinte:

  • vagrant up ansible
  • ssh-keygen(nenhuma senha foi pressionada Enter)
  • copiado .ssh/id_rsae .ssh/id_rsa.pubpara o diretório do projeto
  • vagrant destroy ansible
  • modificou o Vagrantfilepara copiar o id_rsapara todos os hosts
  • modificado Vagrantfilepara copiar o id_rsa.pubpara authorized_keysem todos os hosts
  • modificou o arquivo Vagrant para desativar a verificação de host

Fragmento de arquivo Vagrant:

 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
opticíclico
fonte
Esta solução funcionou bem para mim, mas tive que mudar o Host 192.168. *. * Para apenas *. Não sei por que. Obrigado!
Zacho 2/10/19
0

Se você deseja ter um bloco pré-formatado dentro de uma lista, recue oito espaços:

  1. gerar chave pública / privada

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
  2. edite o arquivo Vagrant, adicione as seguintes linhas: config.vm.provision "file", fonte: "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
tar tu
fonte
Esta é apenas uma versão reformada da minha resposta? Nesse caso, você provavelmente deve editar minha resposta em vez de adicionar uma nova.
Opticyclic