Как настроить ключи SSH в настройке Vagrant для нескольких компьютеров?

11

В моем Vagrantfile 4 виртуальных машины - 3 сервера приложений и управляющий хост Ansible.

Я использую Vagrant только для создания виртуальных машин, поскольку я предоставляю их вручную с хоста ansible control, потому что я все еще создаю / редактирую ansible скрипты.

Я могу сделать vagrant ssh ansibleи vagrant ssh app1/2/3т. Д., Но когда я пытаюсь сделать ansible-playbook oracle.ymlс хоста управления Ansible, 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}

Я могу успешно выполнить SSH с Ansible VM на Oracle VM, используя vagrant пользователя и vagrant пароля.

Ключевые части моего Vagrantfile:

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

Что мне нужно добавить в Vagrantfile, чтобы позволить виртуальной машине Ansible подключаться к другим виртуальным машинам без пароля или дополнительных ручных действий после vagrant up?

Это только для тестирования разработки в частной сети на компьютерах разработчиков, поэтому безопасность на самом деле не является проблемой и занимает второе место после простоты реализации и удобства работы пользователей.

opticyclic
источник
1
Дубликат devops.stackexchange.com/questions/1017/…
Джеймс Шиви
Я ясно заявил, что я могу ssh между виртуальными машинами, это просто, что ANSIBLE не может, потому что он требует настройки ключей. Он не может ssh. Вопросы явно разные.
Оптически
@JamesShewey: Я не думаю, что какой-либо ответ на этот вопрос имеет отношение к этому. Данный ответ относится к сообщениям от хозяина гостям; Необходимый ответ должен применяться между гостями.
Torenware Networks

Ответы:

8

Там нет общего метода, и это может зависеть от того, как boxcutter/ol67был упакован.

  1. Самый простой способ - определить пароль в файле инвентаризации Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
    
  2. Второй способ - оставить незащищенный закрытый ключ, настроенный на oracle-vmмашине, и внедрить закрытый ключ в ansibleвиртуальную машину :

    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. Заранее сгенерируйте пару ключей на хост-машине, введите закрытый ключ для Ansible VM, открытый ключ для Oracle authorized_keys.

  4. Сгенерируйте пару ключей на Ansible VM, скопируйте открытый ключ в Oracle VM с помощью поставщика оболочки и введите vagrantпароль для ssh-copy-id.

И этот список не заканчивается, это зависит от требуемой безопасности.

techraf
источник
8

Основываясь на третьем предложении techraf, я сделал следующее:

  • vagrant up ansible
  • ssh-keygen(пароль не нажимается Enter)
  • скопировать .ssh/id_rsaи .ssh/id_rsa.pubв каталог проекта
  • vagrant destroy ansible
  • модифицировал Vagrantfileдля копирования на id_rsaвсе хосты
  • модифицировано , Vagrantfileчтобы скопировать id_rsa.pubINTO authorized_keysна все хосты
  • изменил Vagrantfile, чтобы отключить проверку хоста

Фрагмент 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
opticyclic
источник
Это решение хорошо сработало для меня, но мне пришлось сменить Host 192.168. *. * На просто *. Не уверен почему. Спасибо!
Zacho
0

Если вы хотите иметь предварительно отформатированный блок в списке, сделайте отступ на восемь пробелов:

  1. генерировать открытый / закрытый ключ

    cd vagrant-home
    ssh-keygen // just pressed enter
    copy ~/.ssh/id_rsa .
    copy ~/.ssh/id_rsa.pub .
    
  2. отредактируйте Vagrantfile, добавьте следующие строки: config.vm.provision "file", источник: "id_rsa", место назначения: "/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
тар ту
источник
Это просто переформатированная версия моего ответа? Если это так, вы, вероятно, должны просто отредактировать мой ответ, а не добавлять новый.
Оптически,