ทำเช่นเดียวกันกับ Ubuntu cloud OVA และฉันพบวิธีแก้ปัญหาเล็กน้อยเกี่ยวกับเรื่องนี้ มันไม่เหมาะเพราะต้องรีบูต หมายความว่าคุณต้องมี ผู้บริหารท้องถิ่น
ตัวจัดเตรียมเพื่อตรวจจับเมื่ออินสแตนซ์เสร็จสิ้นจริง แต่ใช้งานได้
สมมติว่าคุณมีไฟล์ yaml สองไฟล์ที่คุณใช้สำหรับข้อมูลผู้ใช้ ไฟล์แรกที่คุณส่งต่อด้วยคุณสมบัติ vApp ชื่อ vapp-userdata.yaml
จากนั้นวินาทีที่คุณส่งต่อไปยังแหล่งข้อมูล VMware ชื่อ แขกผู้ใช้ data.yaml
บางอย่างเช่นนี้ใน Terraform
vapp {
คุณสมบัติ = {
ข้อมูลผู้ใช้ = base64encode (data.template_file.vapp_userdata[count.index].rendered)
}
}
extra_config = {
"guestinfo.metadata" = base64encode(data.template_file.guest-metadata[count.index].rendered)
"guestinfo.metadata.encoding" = "ฐาน 64"
"guestinfo.userdata" = base64encode (data. template_file.userdata.rendered)
"guestinfo.userdata.encoding" = "ฐาน 64"
}
ในของคุณ vapp-userdata.yaml
มี ไรท์_ไฟล์
การดำเนินการที่เขียนทับคำจำกัดความของแหล่งข้อมูลปัจจุบันและลบออก อฟฟ
ในขณะที่คุณมาถึงจุดนั้นแล้ว
Write_files:
- เส้นทาง: /etc/cloud/cloud.cfg.d/90_dpkg.cfg
เจ้าของ: root:root
สิทธิ์: "0644"
เนื้อหา: |
datasource_list: [ VMware ไม่มี ]
จากนั้นที่ด้านล่างให้เสร็จสิ้นด้วยการรีบูต
power_state:
หมดเวลา: 600
โหมด: รีบูต
เมื่อ VM รีบูตหลังจากคำสั่งสุดท้าย มันจะอ่านใน วีเอ็มแวร์
แหล่งข้อมูลตามที่กำหนดไว้ในการกำหนดค่า cloud-init ใหม่ และจะประมวลผลของคุณ แขกผู้ใช้ data.yaml
และ metadata.yaml
หากคุณได้กำหนดไว้เช่นกัน
สำหรับการตรวจจับเมื่อเสร็จสิ้น ฉันยังคงพยายามหาวิธีที่ดีที่สุดในการทำเช่นนั้น วิธีง่ายๆคือคุณเริ่มต้น nc -l 12345
ในตอนท้ายของ แขกผู้ใช้ data.yaml
และมีผู้ให้บริการในท้องถิ่นที่จะดำเนินการเมื่อสามารถเชื่อมต่อได้ tcp/12345
แต่นั่นทำให้คุณเปิดฟัง netcat ได้ tcp/12345
ซึ่งน้อยกว่าอุดมคติ
ถ้าคุณพบวิธีที่ดีกว่านี้ ตอบกลับ :)
แก้ไข
จะมีวิธีที่ดีกว่าในการทำเช่นนี้อย่างแน่นอน แต่...
ที่ด้านล่างของ แขกผู้ใช้ data.yaml
เรียกใช้ cmd:
- mkdir -p /mnt/sharedfolder
- sysctl -w vm.overcommit_memory=1
- sysctl -w kernel.panic=10
- sysctl -w kernel.panic_on_oops=1
- ขด https://releases.rancher.com/install-docker/${docker_version}.sh | ช
- usermod -aG นักเทียบท่า ubuntu
- nc -l 1234 & ncpid=$! #เริ่ม nc และรับ PID
- นอน 20
- ฆ่า $ncpid #kill PID เมื่อ Terraform มีเวลาเชื่อมต่อ
แล้วเป็นผู้ให้ทานในวาระสุดท้ายของท่าน .tf
ไฟล์
ผู้จัดเตรียม "ผู้บริหารท้องถิ่น" {
# รอ cmds ข้อมูลผู้ใช้เริ่มต้นบนคลาวด์
# Netcat: z (สแกนพอร์ตเท่านั้น), w1 (รอ 1 วินาที)
command = "count=0; จนถึง $(nc -zw1 ${self.default_ip_address} 1234); do sleep 1; count=`expr $count + 1`; done"
}