Puncte:0

Terraform + Cloud-Init prin extra_config și DataSourceVMware

drapel in

Întrebare:

A folosit cineva cu succes terraform + extra_config + imagini cloud Ubuntu pentru a interfața cu Cloud Init, furnizând metadate/date utilizator? Sper că acest lucru va interacționa cu DataSourceVMware, dar nu pot fi sigur în acest stadiu.

Ce am făcut:

Folosesc Terraform pentru a implementa imagini cloud Ubuntu pe VMware vSphere 7. A fost destul de ușor să folosești proprietățile vApp:

... codul de mai jos a fost tăiat din resursa „vsphere_virtual_machine” „vm” { }

vapp {
    proprietăți = {
        hostname = var.vm_Name_Lower
        instance-id = var.vm_Name_Lower
        user-data = base64encode(fișier("${path.module}/userdata.yml"))
    }
}

Dar orice încercare de a utiliza extra_config a eșuat. Aș dori să pot furniza atât guestinfo.metadata, cât și guestinfo.userdata. Dar în prezent, testele mele cu metadate (văzute mai jos) par să eșueze, deoarece numele de gazdă nu este setat în VM:

date „cloudinit_config” „metadate” {
    gzip = adevărat
    base64_encode = adevărat
    partea {
        content_type = "text/cloud-config"
        continut = <<-EOF
            local-hostname: testvm
            ID-ul instanței: testvm
        EOF
    }
}

... codul de mai jos a fost tăiat din resursa „vsphere_virtual_machine” „vm” { }

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

Pot vedea intrarea de jurnal vSphere pentru a dovedi că extra_config a fost trimis:

config.extraConfig("guestinfo.metadata"): (cheie = "guestinfo.metadata", valoare = "H4sIAAAAAAAA/2SOTUvGMBCE74H8h/De11dPQsSDHz14qIK ... tăiat

Referinte:

Detalii versiuni:

Sistem client (pe care se rulează terraform): Ubuntu 20.04.3 LTS
ESXi: 7.0.2 / Build: 18538813
vCenter Server: 7.0.2 / Build: 18455184
Imagine în cloud: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
Terraform v1.0.7
pe linux_amd64
provider registry.terraform.io/hashicorp/template v2.2.0
provider registry.terraform.io/hashicorp/vsphere v1.24.3
Puncte:0
drapel cn

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"
  }
drapel cn
https://github.com/NetApp/ez-rancher - inspirație pentru partea `nc -l 12345` :)
Puncte:0
drapel in

Problema este că cloud-init are, în mod implicit, furnizorul de surse de date OVF invocat înainte de noua sursă de date VMware (începând cu cloud-init 21.3). Terraform furnizează date care le plac furnizorului de surse de date OVF și, prin urmare, prelucrează informațiile. Aceasta explică de ce „user-data” din proprietățile vApp acceptă cloud-config.

Soluția este să eliminați furnizorul de surse de date OVF din cloud-init:

  1. [Browser Web[ Descărcați OVA: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
  2. [VC UI] Implementați din OVF, acceptați valorile implicite (cu excepția provizionării discului, utilizați Thin Provisioning).
  3. [VC UI] Editare setări / VM Options / Boot Options / Boot Delay = 2000 ms.
  4. [VC UI] Deschideți VM Console.
  5. [VM Console] Porniți VM.
  6. [VM Console] Țineți apăsat Shift pe ecranul BIOS (pentru a forța GRUB să afișeze meniul).
  7. [VM Console] Selectați Opțiuni avansate pentru Ubuntu.
  8. [VM Console] Selectați cea mai recentă versiune de kernel cu „(modul de recuperare)” la sfârșit.
  9. [VM Console] Selectați „root / Drop to root shell prompt”
  10. [VM Console] Apăsați Enter pentru întreținere
  11. [VM Console] # dpkg-reconfigure cloud-init
  12. [VM Console] Deselectați totul, cu excepția VMware și Niciunul
  13. [VM Console] # curățare cloud-init
  14. [VM Console] # oprire -h acum
  15. [VC UI] Editare setări / VM Options / Boot Options / Boot Delay = 0 ms.
  16. [VC UI] Convertiți în șablon

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.