Pages - Menu

2023年7月28日 星期五

[Terraform]用chatGPT學Terraform

睡睡念

終於要來試試看terraorm了,
現在公司好像很少全部k8s,
大部分還是用虛擬機,這樣變成還是要把terraform學一下。


正文

Terraform跟ansible的差異

差異點 Terraform Ansible
組態檔案管理 vs 組態 Terraform使用組態檔案管理基礎設施,描述其狀態,而不是組態。 Ansible基於主機的管理,直接組態基礎設施。
可變基礎設施 vs 不可變基礎設施 Terraform以可變的方式管理基礎設施,可以對基礎設施進行更改。 Ansible通常將基礎設施視為不可變的,一旦組態,它們就不再更改。
過程式的 vs 聲明式的 Terraform是過程式的,會循序漸進地執行創建、修改和刪除操作。 Ansible是聲明式的,描述了期望的最終狀態,而不是執行一系列步驟來實現它。
Master vs Masterless Terraform通常使用單一主節點管理基礎設施狀態。 Ansible可以在主節點和無主節點(即agentless)模式下運行。
Agent vs Agentless Terraform不需要在目標基礎設施上安裝任何代理。 Ansible需要在目標基礎設施上安裝一個代理。
成熟 vs 前沿 Terraform是成熟的基礎設施自動化工具,已被廣泛使用。 Ansible是一個新興的基礎設施自動化工具,並且正在積極發展。
綜合使用多種工具 Terraform與其他工具整合,如Packer、Docker和AWS CloudFormation等。 Ansible與其他工具整合,如Jenkins、Docker和Kubernetes等。

安裝

官網安裝最快了,上面有各個平臺的安裝方式。

詠唱

我先問了一下chatGPT怎麼學Terraform,然後給了我很標準的答案。

  1. 閱讀Terraform官方文檔,熟悉其基礎結構、功能和概念。
  2. 安裝Terraform,並學習如何使用它來創建基礎設施。
  3. 開始使用Terraform的示例項目,並嘗試使用它們創建簡單的基礎設施。
  4. 學習如何使用Terraform管理不同的基礎設施提供者,如AWS、Azure、Google Cloud等。
  5. 閱讀Terraform的模塊化文檔,並學習如何使用模塊化設計來管理複雜的基礎設施。
  6. 學習如何使用Terraform命令列工具來測試和調試基礎設施代碼。
  7. 研究Terraform的最佳實踐,包括如何管理機密、編寫可重用的代碼和設計可擴展的基礎設施。

我還是直接從實際案例來看好了,

Q: 幫我建立一個部署deployment的terrform程式碼
A:

# 定義Kubernetes provider
provider "kubernetes" {
  config_context_cluster = "my-cluster"
}

# 定義deployment
resource "kubernetes_deployment" "my_deployment" {
  metadata {
    name = "my-deployment"
    labels = {
      app = "my-app"
    }
  }

  spec {
    replicas = 3

    selector {
      match_labels = {
        app = "my-app"
      }
    }

    template {
      metadata {
        labels = {
          app = "my-app"
        }
      }

      spec {
        container {
          image = "my-image:latest"
          name  = "my-container"
        }
      }
    }
  }
}

看了一下他提供的程式碼,有點問題,然後接著問
Q:resouce 宣告 kubernetes_deployment my_deployment 是要跟deployment的name一樣嗎
A:

是的,kubernetes_deploymentmetadata區塊中的name屬性會定義Kubernetes deployment的名稱,您需要將其設定為與實際的deployment名稱相同。

然後在後續的對談過程中,發現另一個指令。

terraform import 

再緊接著問,這個的功用是什麼。

A:
terraform import是Terraform提供的一個命令,用於將現有的資源引入Terraform管理的狀態中。使用terraform import可以讓Terraform瞭解現有資源的狀態,並允許你使用Terraform管理這些資源,並在需要時進行更改。

通常情況下,Terraform會從頭開始創建和管理所有資源。然而,在實際環境中,有時候會存在一些已經存在的資源,這些資源可能是手動創建的,或者是由其他工具創建的。這些資源可能包括Kubernetes deployment、AWS EC2實例、GCP虛擬機等等。在這種情況下,使用terraform import命令可以將這些現有資源引入到Terraform管理的狀態中,以便Terraform能夠管理它們。

使用terraform import命令時,需要指定要引入的資源的類型和ID,以及要對應到Terraform的哪個資源。Terraform將使用提供的資源類型和ID尋找現有資源的狀態,並將其對應到Terraform組態檔案中的相應資源。一旦資源成功被引入,Terraform就可以開始管理它們,並將它們的狀態保存到狀態檔案中,這樣就可以使用terraform planterraform apply等命令進行更改。

如果不知道怎麼用沒關係,
再問一下,
Q:該怎麼使用terraform import
A:
使用terraform import命令引入現有資源到Terraform管理的狀態中,通常需要以下步驟:

  1. 在Terraform組態檔案中定義資源的組態,例如使用kubernetes_deployment定義Kubernetes deployment的組態。
  2. 執行terraform init初始化Terraform,以設置Terraform的工作目錄和相關外掛。
  3. 執行terraform import命令引入現有資源。例如,要引入Kubernetes deployment,可以使用以下命令:
terraform import kubernetes_deployment.systemservice deployment2k7
這裡的`kubernetes_deployment.systemservice`指的是在Terraform組態檔案中定義的Kubernetes deployment資源,`deployment2k7`則是現有Kubernetes deployment的名稱或ID。通過這樣的方式,Terraform就會將現有的Kubernetes deployment引入到Terraform管理的狀態中。
  1. 檢查Terraform的狀態,使用terraform state list命令可以列出Terraform目前管理的所有資源,可以確認引入的資源是否已經被成功管理。
  2. 更新Terraform組態檔案,通過terraform planterraform apply命令對資源進行更改。當Terraform管理現有資源時,它會比較Terraform組態檔案和現有資源的狀態,並生成一個計劃,顯示要將資源帶到Terraform所需的更改。通過執行terraform apply命令,Terraform就可以將這些更改應用到現有的資源中。

結論

光看沒有用,最重要的還是實作,
一開始沒碰terraform是不知道寫壞了,會不會影響線上的服務,
現在我能夠先import,看目前服務建設的程式後,再來修改。

感想

實作後完全崩掉,有很多東西還是要從頭開始看一下。
像是, terraform 的backend ,跟tfstate 這些觀念。
上面也有提到引入資源,但實際上可能跟你想得不太一樣,
引入後是變成一個tfstate,而不是tf,
那tf 跟 tfstate又有什麼不同呢?

我們還是看下一篇,從頭來過吧。

ref.

沒有留言:

張貼留言