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.yaml và siê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"
}