Điểm:0

Terraform + Cloud-Init thông qua extra_config & DataSourceVMware

lá cờ in

Câu hỏi:

Có ai đã sử dụng thành công terraform + extra_config + hình ảnh đám mây Ubuntu để giao tiếp với Cloud Init, cung cấp siêu dữ liệu/dữ liệu người dùng chưa? Tôi hy vọng điều này sẽ tương tác với DataSourceVMware, nhưng không thể chắc chắn ở giai đoạn này.

Những gì tôi đã và đang làm:

Tôi đang sử dụng Terraform để triển khai hình ảnh đám mây Ubuntu trên VMware vSphere 7. Việc sử dụng Thuộc tính vApp đủ dễ dàng:

... mã bên dưới được cắt từ tài nguyên "vsphere_virtual_machine" "vm" { }

vapp {
    thuộc tính = {
        tên máy chủ = var.vm_Name_Lower
        instance-id = var.vm_Name_Lower
        user-data = base64encode(file("${path.module}/userdata.yml"))
    }
}

Nhưng mọi nỗ lực sử dụng extra_config đều không thành công. Tôi muốn có thể cung cấp cả guestinfo.metadata và guestinfo.userdata. Nhưng hiện tại, các thử nghiệm của tôi với siêu dữ liệu (xem bên dưới) dường như không thành công do tên máy chủ không được đặt trong VM:

dữ liệu "cloudinit_config" "siêu dữ liệu" {
    gzip = đúng
    base64_encode = true
    phần {
        content_type = "văn bản/đám mây-config"
        nội dung = <<-EOF
            tên máy chủ cục bộ: testvm
            ví dụ-id: testvm
        EOF
    }
}

... mã bên dưới được cắt từ tài nguyên "vsphere_virtual_machine" "vm" { }

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

Tôi có thể thấy mục nhật ký vSphere để chứng minh rằng extra_config đã được gửi:

config.extraConfig("guestinfo.metadata"): (key = "guestinfo.metadata", value = "H4sIAAAAAAAA/2SOTUvGMBCE74H8h/De11dPQsSDHz14qIK ... đã cắt

Người giới thiệu:

Chi tiết phiên bản:

Hệ thống máy khách (trên đó địa hình được chạy): Ubuntu 20.04.3 LTS
ESXi: 7.0.2 / Bản dựng: 18538813
Máy chủ vCenter: 7.0.2 / Bản dựng: 18455184
Hình ảnh đám mây: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
địa hình v1.0.7
trên linux_amd64
nhà cung cấp registry.terraform.io/hashicorp/template v2.2.0
nhà cung cấp registry.terraform.io/hashicorp/vsphere v1.24.3
Điểm:0
lá cờ cn

Làm tương tự với OVA của đám mây Ubuntu và tôi đã tìm thấy một chút giải pháp cho vấn đề này. Điều đó không lý tưởng vì nó liên quan đến việc khởi động lại, nghĩa là bạn cần một cục bộ-exec nhà cung cấp để phát hiện khi phiên bản thực sự kết thúc, nhưng nó hoạt động.

Giả sử bạn có hai tệp yaml mà bạn đang sử dụng cho dữ liệu người dùng - tệp đầu tiên bạn chuyển qua Thuộc tính vApp có tên vapp-userdata.yaml và sau đó là lần thứ hai bạn chuyển cho nguồn dữ liệu VMware có tên khách-userdata.yaml

Một cái gì đó như thế này trong Terraform

  vapp {
    thuộc tính = {
      user-data = 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" = "base64"
    "guestinfo.userdata" = base64encode(data.template_file.userdata.rendered)
    "guestinfo.userdata.encoding" = "base64"
  }

trong bạn vapp-userdata.yaml có một write_file hành động ghi đè định nghĩa nguồn dữ liệu hiện tại và xóa buồng trứng như bạn đã đạt đến điểm đó.

write_files:
  - đường dẫn: /etc/cloud/cloud.cfg.d/90_dpkg.cfg
    chủ sở hữu: root:root
    quyền: "0644"
    nội dung: |
      datasource_list: [ VMware, Không có ]

Sau đó, ở cuối kết thúc với khởi động lại

sức mạnh_state:
  thời gian chờ: 600
  chế độ: khởi động lại

Khi VM khởi động lại sau lệnh cuối cùng đó, nó sẽ đọc trong VMware nguồn dữ liệu như được xác định trong cấu hình cloud-init mới và sẽ xử lý khách-userdata.yamlsiêu dữ liệu.yaml nếu bạn cũng đã xác định điều đó.

Đối với việc phát hiện khi nó kết thúc, tôi vẫn đang cố gắng tìm ra cách tốt nhất để làm điều đó. Cách dễ dàng là bạn bắt đầu nc-l 12345 ở cuối của khách-userdata.yaml và có một nhà cung cấp cục bộ tiến hành khi nó có thể kết nối với tcp/12345, nhưng điều đó khiến bạn có một trình nghe netcat mở trên tcp/12345 đó là ít hơn lý tưởng.

Nếu bạn tìm thấy một cách tốt hơn, trả lời :)

Chỉnh sửa

Chắc chắn sẽ có một cách tốt hơn để làm việc này, nhưng...

Ở dưới cùng của khách-userdata.yaml

chạy cmd:
  - mkdir -p /mnt/sharedfolder
  - sysctl -w vm.overcommit_memory=1
  - sysctl -w kernel.panic=10
  - sysctl -w kernel.panic_on_oops=1
  - cuộn tròn https://releases.rancher.com/install-docker/${docker_version}.sh | sh
  - usermod -aG docker ubuntu
  - nc -l 1234 & ncpid=$! #bắt đầu nc và nhận PID
  - ngủ 20
  - kill $ncpid #kill PID sau khi Terraform có thời gian kết nối

Sau đó, với tư cách là người cung cấp ở cuối .tf tập tin

  nhà cung cấp "local-exec" {
    # Đợi cmds dữ liệu người dùng khởi tạo trên đám mây
    # Netcat: z (chỉ quét cổng), w1 (chờ 1 giây)
    lệnh = "đếm=0; cho đến khi $(nc -zw1 ${self.default_ip_address} 1234); ngủ 1; đếm=`expr $count + 1`; xong"
  }
lá cờ cn
https://github.com/NetApp/ez-rancher - nguồn cảm hứng cho phần `nc -l 12345` :)
Điểm:0
lá cờ in

Vấn đề là theo mặc định, cloud-init có nhà cung cấp nguồn dữ liệu OVF được gọi trước nguồn dữ liệu VMware mới (kể từ cloud-init 21.3). Terraform đang cung cấp dữ liệu mà nhà cung cấp nguồn dữ liệu OVF thích và do đó nó xử lý thông tin. Điều đó giải thích tại sao "dữ liệu người dùng" của Thuộc tính vApp chấp nhận cấu hình đám mây.

Giải pháp là xóa nhà cung cấp nguồn dữ liệu OVF khỏi cloud-init:

  1. [Trình duyệt web[ Tải xuống OVA: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
  2. [VC UI] Triển khai từ OVF, chấp nhận các giá trị mặc định (ngoại trừ cung cấp đĩa, sử dụng Cung cấp mỏng).
  3. [VC UI] Chỉnh sửa Cài đặt / Tùy chọn VM / Tùy chọn Khởi động / Độ trễ Khởi động = 2000 mili giây.
  4. [Giao diện người dùng VC] Mở Bảng điều khiển VM.
  5. [Bảng điều khiển máy ảo] Bật nguồn máy ảo.
  6. [Bảng điều khiển VM] Giữ phím Shift trên màn hình BIOS (để buộc GRUB hiển thị menu).
  7. [Bảng điều khiển VM] Chọn Tùy chọn nâng cao cho Ubuntu.
  8. [Bảng điều khiển VM] Chọn phiên bản kernel mới nhất có "(chế độ khôi phục)" ở cuối.
  9. [Bảng điều khiển VM] Chọn "root / Drop to root shell prompt"
  10. [Bảng điều khiển VM] Nhấn Enter để bảo trì
  11. [Bảng điều khiển VM] # dpkg-reconfigure cloud-init
  12. [Bảng điều khiển VM] Bỏ chọn mọi thứ trừ VMware và Không có
  13. [Bảng điều khiển VM] # dọn dẹp khởi tạo đám mây
  14. [Bảng điều khiển VM] # tắt máy -h ngay bây giờ
  15. [VC UI] Chỉnh sửa cài đặt / Tùy chọn VM / Tùy chọn khởi động / Độ trễ khởi động = 0ms.
  16. [VC UI] Chuyển đổi sang mẫu

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.