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"
}