Score:0

Terraform + Cloud-Init ผ่าน extra_config & DataSourceVMware

ธง in

คำถาม:

มีใครใช้อิมเมจคลาวด์ terraform + extra_config + Ubuntu เพื่อเชื่อมต่อกับ Cloud Init ได้สำเร็จหรือไม่ โดยให้ข้อมูลเมตา/ข้อมูลผู้ใช้ ฉันหวังว่าสิ่งนี้จะโต้ตอบกับ DataSourceVMware แต่ยังไม่แน่ใจในขั้นตอนนี้

สิ่งที่ฉันทำ:

ฉันใช้ Terraform เพื่อปรับใช้อิมเมจบนคลาวด์ของ Ubuntu บน VMware vSphere 7 มันง่ายพอที่จะใช้คุณสมบัติ vApp:

... โค้ดด้านล่างถูกตัดจากทรัพยากร "vsphere_virtual_machine" "vm" { }

vapp {
    คุณสมบัติ = {
        ชื่อโฮสต์ = var.vm_Name_Lower
        อินสแตนซ์-id = var.vm_Name_Lower
        ข้อมูลผู้ใช้ = base64encode (ไฟล์ ("${path.module}/userdata.yml"))
    }
}

แต่การพยายามใช้ extra_config ล้มเหลว ฉันต้องการที่จะจัดหาทั้ง guestinfo.metadata และ guestinfo.userdata แต่ขณะนี้การทดสอบของฉันกับข้อมูลเมตา (ดูด้านล่าง) ดูเหมือนจะล้มเหลวเนื่องจากไม่ได้ตั้งค่าชื่อโฮสต์ใน VM:

ข้อมูล "cloudinit_config" "ข้อมูลเมตา" {
    gzip = จริง
    base64_encode = จริง
    ส่วนหนึ่ง {
        content_type = "ข้อความ/cloud-config"
        เนื้อหา = <<-EOF
            ชื่อโฮสต์ท้องถิ่น: testvm
            รหัสอินสแตนซ์: testvm
        อฟ
    }
}

... โค้ดด้านล่างถูกตัดจากทรัพยากร "vsphere_virtual_machine" "vm" { }

extra_config = {
    "guestinfo.metadata" = data.cloudinit_config.metadata.rendered
    "guestinfo.metadata.encoding" = "gzip+base64"
}

ฉันสามารถดูรายการบันทึก vSphere เพื่อพิสูจน์ว่ามีการส่ง extra_config:

config.extraConfig("guestinfo.metadata"): (คีย์ = "guestinfo.metadata" ค่า = "H4sIAAAAAAAAA/2SOTUvGMBCE74H8h/De11dPQsSDHz14qIK ... snipped

อ้างอิง:

รายละเอียดรุ่น:

ระบบไคลเอนต์ (ซึ่งรันบน Terraform): Ubuntu 20.04.3 LTS
ESXi: 7.0.2 / รุ่น: 18538813
เซิร์ฟเวอร์ vCenter: 7.0.2 / รุ่น: 18455184
อิมเมจคลาวด์: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
เทอร์ราฟอร์ม v1.0.7
บน linux_amd64
ผู้ให้บริการ register.terraform.io/hashicorp/template v2.2.0
ผู้ให้บริการ register.terraform.io/hashicorp/vsphere v1.24.3
Score:0
ธง cn

ทำเช่นเดียวกันกับ 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"
  }
cn flag
https://github.com/NetApp/ez-rancher - แรงบันดาลใจสำหรับส่วน `nc -l 12345` :)
Score:0
ธง in

ปัญหาคือ cloud-init มีผู้ให้บริการแหล่งข้อมูล OVF ตามค่าเริ่มต้นที่เรียกใช้ก่อนแหล่งข้อมูล VMware ใหม่ (ตั้งแต่ cloud-init 21.3) Terraform กำลังจัดเตรียมข้อมูลที่ผู้ให้บริการแหล่งข้อมูล OVF ชอบ ดังนั้นจึงประมวลผลข้อมูลดังกล่าว นั่นอธิบายว่าทำไมคุณสมบัติ vApp "ข้อมูลผู้ใช้" จึงยอมรับ cloud-config

วิธีแก้ไขคือการลบผู้ให้บริการแหล่งข้อมูล OVF ออกจาก cloud-init:

  1. [เว็บเบราว์เซอร์[ ดาวน์โหลด OVA: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
  2. [VC UI] ปรับใช้จาก OVF ยอมรับค่าเริ่มต้น (ยกเว้นการจัดเตรียมดิสก์ ใช้ Thin Provisioning)
  3. [VC UI] แก้ไขการตั้งค่า / ตัวเลือก VM / ตัวเลือกการบูต / ความล่าช้าในการบูต = 2000ms
  4. [VC UI] เปิดคอนโซล VM
  5. [คอนโซล VM] เปิด VM
  6. [VM Console] กด Shift บนหน้าจอ BIOS (เพื่อบังคับให้ GRUB แสดงเมนู)
  7. [VM Console] เลือกตัวเลือกขั้นสูงสำหรับ Ubuntu
  8. [VM Console] เลือกเวอร์ชันเคอร์เนลล่าสุดโดยมี "(โหมดการกู้คืน)" ต่อท้าย
  9. [VM Console] เลือก "พรอมต์เชลล์รูท / วางที่รูทเชลล์"
  10. [VM Console] กด Enter เพื่อบำรุงรักษา
  11. [VM Console] # dpkg-reconfigure cloud-init
  12. [VM Console] ยกเลิกการเลือกทุกอย่าง ยกเว้น VMware และ None
  13. [VM Console] # cloud-init สะอาด
  14. [คอนโซล VM] # ปิด -h ทันที
  15. [VC UI] แก้ไขการตั้งค่า / ตัวเลือก VM / ตัวเลือกการบูต / การหน่วงเวลาการบูต = 0ms
  16. [VC UI] แปลงเป็นเทมเพลต

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา