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.



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.


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

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

Czy to tylko przeformatowana wersja mojej odpowiedzi? Jeśli tak, prawdopodobnie powinieneś po prostu edytować moją odpowiedź zamiast dodawać nową.
opticyclic
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.