# Terraform Demo Labs 在 GCP 利用映像檔上建立 VM 實例 --- ## Lab-0 建立一台 VM instance ```shell= # 初始化專案 terraform init # 預覽部署結果 terraform plan # 套用設定 terraform apply # 刪除資源 terraform destroy ``` --- ## Lab-1 新增 SSH key(s) 利用 `metadata` 來傳入特定的資源,例如 `ssh public keys` ```jsonld= metadata = { ssh-keys = "YOUR_SSH_KEY" } ``` `apply` 完之後可以到跳板機嘗試用 `ssh` 登入 :::info :musical_note: lab 結束後別忘了刪除資源 ::: --- ## Lab-2 利用 variables 傳入參數 利用 `variables.tf` 將特定變數作為參數傳入 `main.tf` 善加利用 `plan` 預覽變更設定後的結果 也可以嘗試設定開啟多台 VM :::warning 若要變更 cpu 或是 ram 規格,因為需要關閉機器後重啟,需要在 main.tf 中加入 `allow_stopping_for_update = true` ::: --- ## Lab-3 利用 dynamic Blocks 處理特殊狀況 來點複雜的狀況 需求是需要兩台 VM,一台允許對外連入,一台禁止 為滿足需求,我們要在允許連入的 VM 裡加上 `access_config` 這個 property 內容包括 : `nat_ip` `network_tier` 但是這邊會遇到一個很麻煩的情況 `access_config` 這個參數一旦宣告後,即便將裡面的 `nat_ip` 設為空值, gcp 還是會給他一個預設值,這麼一來即使在設定檔裡設定,還是無法**禁止對外連入** 為此,我們利用了 `terraform` 提供的 `dynamic blocks` 語法來動態生成 `access_config` 這個設定 ```jsonld= dynamic "access_config" { for_each = var.access_config[count.index] content { nat_ip = var.access_config[count.index].nat_ip } } ``` 這段語法的代表的含義是,我有一個動態的屬性 `access_config`,它的來源是 `variables.tf` 裡的 `access_config` 這個設定,型別是 `list`,內容包含了`nat_ip` 這個屬性,對應到`access_config[count.index].nat_ip`的值 然後在`variables.tf`裡,我們定義了一組設定 ```jsonld= variable "access_config" { description = "Create pomelo game VMs with these network access config" type = tuple([any, map(string)]) default = [ {}, { nat_ip : "" } ] } ``` 這邊用到了一個特別型別[`tuple`](https://www.terraform.io/language/expressions/type-constraints#tuple),算是一種[`list`](https://www.terraform.io/language/expressions/type-constraints#list)的變體,他可以允許儲存不同型別,而我們正好可以利用這點,在禁止外連的 VM 設定裡設定一個`empty object` {},這樣`for_each`遇到空物件時,就會跳過,因此`access_config`這個屬性就不會建立 --- ## Lab-4 修改已存在的 VM :::success TODO ::: ###### tags: `GCP` `terraform`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up