Făcând același lucru cu Ubuntu cloud OVA și am găsit o mică soluție la asta. Nu este ideal, deoarece implică o repornire, adică ai nevoie de un local-exec
provider pentru a detecta când instanța este de fapt terminată, dar funcționează.
Să presupunem că aveți două fișiere yaml pe care le utilizați pentru datele utilizatorului - primul pe care îl transmiteți cu proprietățile vApp numite vapp-userdata.yaml
și apoi în secunda pe care o treceți pentru sursa de date VMware numită guest-userdata.yaml
Ceva de genul acesta în Terraform
vapp {
proprietăți = {
user-data = base64encode(data.template_file.vapp_userdata[count.index].rended)
}
}
extra_config = {
„guestinfo.metadata” = base64encode(data.template_file.guest-metadata[count.index].rended)
"guestinfo.metadata.encoding" = "base64"
„guestinfo.userdata” = base64encode(data.template_file.userdata.rendered)
"guestinfo.userdata.encoding" = "base64"
}
În dumneavoastră vapp-userdata.yaml
ia o fişier_scriere
acțiune care suprascrie definițiile curente ale surselor de date și elimină OVF
deoarece ai ajuns deja la acel punct.
write_files:
- calea: /etc/cloud/cloud.cfg.d/90_dpkg.cfg
proprietar: root:root
permisiuni: "0644"
continut: |
datasource_list: [ VMware, Niciunul ]
Apoi, în partea de jos, terminați cu o repornire
power_state:
timeout: 600
mod: repornire
Când VM-ul repornește după ultima comandă, va citi în fișierul VMware
sursa de date așa cum este definită în noua configurație cloud-init și va procesa dvs guest-userdata.yaml
și metadate.yaml
daca ai definit si asta.
În ceea ce privește detectarea când s-a terminat, încă încerc să aflu cel mai bun mod de a face asta. Calea ușoară este să începi nc -l 12345
la sfârșitul guest-userdata.yaml
și aveți un furnizor local care continuă atunci când se poate conecta la tcp/12345
, dar asta vă lasă cu un ascultător netcat deschis tcp/12345
ceea ce este mai puțin decât ideal.
Daca gasesti o cale mai buna, raspunde :)
Editați | ×
Va fi absolut o modalitate mai bună de a face asta, dar...
La fundul guest-userdata.yaml
runcmd:
- mkdir -p /mnt/sharedfolder
- sysctl -w vm.overcommit_memory=1
- sysctl -w kernel.panic=10
- sysctl -w kernel.panic_on_oops=1
- curl https://releases.rancher.com/install-docker/${docker_version}.sh | SH
- usermod -aG docker ubuntu
- nc -l 1234 & ncpid=$! #start nc și obțineți PID
- dormi 20
- kill $ncpid #kill PID odată ce Terraform a avut timp să se conecteze
Apoi, ca furnizor la sfârșitul dvs .tf
fişier
provider "local-exec" {
# Așteptați cmd-urile de date utilizator inițial în cloud
# Netcat: z (numai portul de scanare), w1 (așteptați 1 secundă)
comandă = "count=0; până la $(nc -zw1 ${self.default_ip_address} 1234); face sleep 1; count=`expr $count + 1`; terminat"
}