Jak skonfigurować klucze SSH w konfiguracji Vagrant na wielu urządzeniach?

11

Mam 4 maszyny wirtualne na moim serwerze aplikacji Vagrantfile - 3 i host sterujący Ansible.

Używam Vagrant tylko do tworzenia maszyn wirtualnych, ponieważ udostępniam je ręcznie z hosta sterowania ansible, ponieważ wciąż tworzę / edytuję skrypty ansible.

Mogę zrobić vagrant ssh ansiblei vagrant ssh app1/2/3itd., Ale gdy próbuję zrobić ansible-playbook oracle.ymlz ansibl przyjmującym kontrolnej nie powiedzie się z SSH

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}

Mogę pomyślnie ssh z maszyny wirtualnej Ansible na maszynę wirtualną Oracle przy użyciu narzędzia Vagrant użytkownika i hasła Vagrant.

Kluczowe części mojego Vagrantfile to:

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

Co muszę umieścić w pliku Vagrantfile, aby umożliwić maszynie wirtualnej Ansible połączenie się z innymi maszynami wirtualnymi bez konieczności podawania hasła lub dodatkowych ręcznych czynności po vagrant up?

To jest tylko do testowania programistycznego w prywatnej sieci na komputerach programistów, więc bezpieczeństwo nie jest tak naprawdę problemem i zajmuje drugie miejsce w stosunku do łatwości implementacji i płynnego działania użytkownika.

optycykliczny
źródło
Stwierdziłem dość wyraźnie, że mogę ssh między maszynami wirtualnymi, tylko że ansible nie może, ponieważ wymaga skonfigurowania kluczy. On nie może ssh. Pytania są wyraźnie różne.
opticyclic
@JamesShewey: Nie sądzę, aby jakakolwiek odpowiedź na to pytanie była z tym związana. Podana odpowiedź dotyczy komunikacji między gospodarzem a gośćmi; potrzebna odpowiedź musi obowiązywać między gośćmi.
Torenware Networks

Odpowiedzi:

8

Nie ma ogólnej metody i może zależeć od tego, w jaki sposób boxcutter/ol67została zapakowana.

  1. Najłatwiejszą metodą byłoby zdefiniowanie hasła w pliku ekwipunku Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
  2. Drugą metodą byłoby pozostawienie niezabezpieczonego klucza prywatnego skonfigurowanego na oracle-vmkomputerze i wstrzyknięcie klucza prywatnego do ansiblemaszyny wirtualnej:

    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. Wygeneruj wcześniej parę kluczy na maszynie hosta, wstrzyknij klucz prywatny do Ansible VM, klucz publiczny do Oracle authorized_keys.

  4. Wygeneruj parę kluczy na Ansible VM, skopiuj klucz publiczny do Oracle VM przy użyciu dostawcy zasobów powłoki i wstrzyknij vagrantjako hasło dla ssh-copy-id.

Lista nie kończy się tutaj, zależy to od wymaganego bezpieczeństwa.

techraf
źródło
8

Na podstawie trzeciej sugestii techrafa wykonałem następujące czynności:

  • vagrant up ansible
  • ssh-keygen(nie naciśnięto hasła Enter)
  • skopiowane .ssh/id_rsai .ssh/id_rsa.pubdo katalogu projektu
  • vagrant destroy ansible
  • zmodyfikowano, Vagrantfileaby skopiować na id_rsawszystkie hosty
  • zmodyfikowano, Vagrantfileaby skopiować id_rsa.pubdo authorized_keysna wszystkich hostach
  • zmodyfikowano plik Vagrantfile, aby wyłączyć sprawdzanie hosta

Fragment pliku 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
optycykliczny
źródło
To rozwiązanie działało dla mnie dobrze, ale musiałem zmienić Host 192.168. *. * Na just *. Nie pewny dlaczego. Dzięki!
Zacho
0

Jeśli chcesz mieć wstępnie sformatowany blok na liście, wcięcie o osiem spacji:

  1. generuj klucz publiczny / prywatny

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
  2. edytuj plik Vagrant, dodaj następujące wiersze: config.vm.provision „plik”, źródło: „id_rsa”, miejsce docelowe: „/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
źródło
Czy to tylko przeformatowana wersja mojej odpowiedzi? Jeśli tak, prawdopodobnie powinieneś po prostu edytować moją odpowiedź zamiast dodawać nową.
opticyclic