ฉันจะกำหนดค่าคีย์ SSH ในการตั้งค่าหลายเครื่องของ Vagrant ได้อย่างไร


11

ฉันมี 4 VMs ใน Vagrantfile ของฉัน - 3 เซิร์ฟเวอร์แอปพลิเคชันและโฮสต์การควบคุม Ansible

ฉันใช้ Vagrant เพื่อสร้าง VM เท่านั้นเมื่อฉันจัดเตรียมด้วยตนเองจากโฮสต์การควบคุมที่ไม่สามารถควบคุมได้เนื่องจากฉันยังคงสร้าง / แก้ไขสคริปต์ที่ใช้งานได้

ฉันสามารถทำได้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 ได้สำเร็จโดยใช้ผู้ใช้คนจรจัดและรหัสผ่านคนจรจัด

ส่วนสำคัญของ 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 เพื่อให้เบิ้ล VM เพื่อเชื่อมต่อกับ VMs อื่น ๆ โดยไม่ต้องใช้รหัสผ่านหรือขั้นตอนด้วยตนเองเพิ่มเติมหลังจากvagrant up?

นี่เป็นเพียงการทดสอบการพัฒนาบนเครือข่ายส่วนตัวบนพีซีนักพัฒนาดังนั้นการรักษาความปลอดภัยไม่ใช่ปัญหาจริงๆและเป็นเรื่องที่สองเพื่อความสะดวกในการนำไปใช้งาน



ฉันระบุไว้ค่อนข้างชัดเจนว่าฉันสามารถ ssh ระหว่าง VM เป็นเพียง ansible ที่ไม่สามารถเพราะต้องตั้งค่าคีย์ เขาไม่สามารถ ssh คำถามนั้นแตกต่างกันอย่างชัดเจน
opticyclic

@JamesShewey: ฉันไม่คิดว่าคำตอบสำหรับคำถามนั้นเกี่ยวข้องกับเรื่องนั้น คำตอบที่ให้หมายถึงการสื่อสารจากโฮสต์ถึงแขก; คำตอบที่จำเป็นต้องใช้ระหว่างแขก
Torenware Networks

คำตอบ:


8

ไม่มีวิธีการทั่วไปและอาจขึ้นอยู่กับวิธีการboxcutter/ol67บรรจุ

  1. วิธีที่ง่ายที่สุดคือการกำหนดรหัสผ่านในไฟล์สินค้าคงคลัง Ansible:

    [oracle-vm:vars]
    ansible_ssh_user=vagrant
    ansible_ssh_pass=vagrant
    
  2. วิธีที่สองจะปล่อยให้คีย์ส่วนตัวที่ไม่ปลอดภัยที่กำหนดค่าไว้ในoracle-vmเครื่องและฉีดไพรเวตคีย์ไปที่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. สร้างคู่คีย์ก่อนบนเครื่องโฮสต์ฉีดกุญแจส่วนตัวที่จะเบิ้ล VM authorized_keysที่สำคัญของประชาชนที่จะออราเคิล

  4. สร้างคู่คีย์บนเบิ้ล VM คัดลอกคีย์สาธารณะเพื่อ Oracle VM โดยใช้เปลือก Provisioner และฉีดเป็นรหัสผ่านสำหรับvagrantssh-copy-id

และรายการไม่ได้จบลงที่นี่ขึ้นอยู่กับความปลอดภัยที่ต้องการ


8

จากคำแนะนำข้อที่ 3 ของ techrafฉันได้ทำสิ่งต่อไปนี้:

  • vagrant up ansible
  • ssh-keygen(ไม่ต้องกดรหัสผ่านEnter)
  • คัดลอก.ssh/id_rsaและ.ssh/id_rsa.pubไปยังไดเรกทอรีโครงการ
  • vagrant destroy ansible
  • แก้ไขVagrantfileเพื่อคัดลอกid_rsaไปยังโฮสต์ทั้งหมด
  • แก้ไขVagrantfileเพื่อคัดลอกid_rsa.pubลง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

วิธีนี้ใช้ได้ดีสำหรับฉัน แต่ฉันต้องเปลี่ยน 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

นี่เป็นเพียงคำตอบของฉันในรูปแบบที่จัดรูปแบบใหม่หรือไม่ ถ้าเป็นเช่นนั้นคุณควรแก้ไขคำตอบของฉันแทนที่จะเพิ่มคำตอบใหม่
opticyclic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.