雲原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code

来源:https://www.cnblogs.com/wade-xu/archive/2022/09/21/16709133.html
-Advertisement-
Play Games

前言 工欲善其事,必先利其器。本篇文章我們介紹下 Terraform,為後續創建各種雲資源做準備,比如Kubernetes 關鍵詞:IaC, Infrastructure as Code, Terraform, 基礎架構即代碼,Terraform 例子, Terraform 入門,Terraform ...


前言

工欲善其事,必先利其器。本篇文章我們介紹下 Terraform,為後續創建各種雲資源做準備,比如Kubernetes

 

關鍵詞:IaC, Infrastructure as Code, Terraform, 基礎架構即代碼,Terraform 例子, Terraform 入門,Terraform 簡介

 

Terraform 是什麼?

Terraform 是一種安全有效地構建、更改和版本控制基礎設施的工具(基礎架構自動化的編排工具)。它的目標是 "Write, Plan, and create Infrastructure as Code", 基礎架構即代碼。Terraform 幾乎可以支持所有市面上能見到的雲服務。具體的說就是可以用代碼來管理維護 IT 資源,把之前需要手動操作的一部分任務通過程式來自動化的完成,這樣的做的結果非常明顯:高效、不易出錯。

Terraform 絕對是一個非常好用的工具,目前各大雲平臺也都支持的不錯,我很看好它的未來。Terraform 也是用 Go 語言開發的開源項目,你可以在 github 上訪問到它的源代碼以及各種文檔。

###  https://www.cnblogs.com/wade-xu/p/16709133.html ###  

安裝

我這裡強烈推薦tfenv, 下麵介紹如何在Mac上利用 tfenv 來安裝Terraform。

安裝 tfenv

brew install tfenv

brew link tfenv

利用tfenv 安裝 Terraform

# install latest version
tfenv install latest

# install specific version
tfenv install 1.2.9

列出所有版本

% tfenv list                                                                                                
  1.2.9
  1.0.0
  0.14.2
  0.13.7
* 0.13.5 (set by /usr/local/Cellar/tfenv/2.0.0/version)

* 表示當前使用的版本

切換版本 

# switch to 1.2.9
tfenv use 1.2.9

Switching default version to v1.2.9
Switching completed

卸載

tfenv uninstall 0.14.2

tfenv uninstall latest

 ###  https://www.cnblogs.com/wade-xu/p/16709133.html ###

 

Provider

我們公司主要用GCP 谷歌雲, 所以這裡也用 google 的 provider 來入門Terraform

安裝 Google Cloud SDK Install https://cloud.google.com/sdk/docs/quickstarts

Configure the environment for gcloud:

gcloud auth login

gcloud auth list

確保你的賬號有許可權操作GCP的Project

 

我的目錄結構如下

 

providers.tf

 1 terraform {
 2   required_version = ">= 1.2.9"
 3 
 4   required_providers {
 5     google = {
 6       source  = "hashicorp/google"
 7       version = "~> 4"
 8     }
 9   }
10 }
11 
12 provider "google" {
13   project = local.project.project_id
14   region  = local.project.region
15 }

backend.tf

terraform {
  backend "gcs" {
    bucket = "wadexu007"
    prefix = "demo/state"
  }
}

這裡的bucket要提前建好用來存放Terraform state文件。

 

network.tf

resource "google_compute_network" "default" {
  project                 = local.project.project_id
  name                    = local.project.network_name
  auto_create_subnetworks = true
  routing_mode            = "GLOBAL"
}

Network資源各個參數參考官方文檔

 

locals.tf

locals {
  # project details
  project = {
    project_id       = "demo-eng-cn-dev"
    region           = "asia-east2"
    network_name     = "wade-test-network"
  }
}

 ###  https://www.cnblogs.com/wade-xu/p/16709133.html ###

 

init

在此目錄下執行

terraform init

此目錄下會生成 .terraform 文件夾,init其實就安裝依賴插件到 .terraform 目錄中:

 

Plan

plan 命令會檢查配置文件並生成執行計劃,如果發現配置文件中有錯誤會報錯。

terraform plan

結果如下

 % terraform plan
Acquiring state lock. This may take a few moments...

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_compute_network.default will be created
  + resource "google_compute_network" "default" {
      + auto_create_subnetworks         = true
      + delete_default_routes_on_create = false
      + gateway_ipv4                    = (known after apply)
      + id                              = (known after apply)
      + internal_ipv6_range             = (known after apply)
      + mtu                             = (known after apply)
      + name                            = "wade-test-network"
      + project                         = "xperiences-eng-cn-dev"
      + routing_mode                    = "GLOBAL"
      + self_link                       = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

 

Apply

在使用 apply 命令執行實際的部署時,預設會先執行 plan 命令併進入交互模式等待用戶確認操作。

terraform apply

輸入 Yes

Tips: 可以使用 -auto-approve 選項跳過這些步驟直接執行部署操作。

terraform apply -auto-approve

 

GCS bucket 裡面的 Terraform 狀態文件  gs://wadexu007/demo/state/default.tfstate 如下

{
  "version": 4,
  "terraform_version": "1.2.9",
  "serial": 1,
  "lineage": "30210d18-6dd5-a542-5b0d-xxxxxxxx",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "google_compute_network",
      "name": "default",
      "provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "auto_create_subnetworks": true,
            "delete_default_routes_on_create": false,
            "description": "",
            "enable_ula_internal_ipv6": false,
            "gateway_ipv4": "",
            "id": "projects/demo-eng-cn-dev/global/networks/wade-test-network",
            "internal_ipv6_range": "",
            "mtu": 0,
            "name": "wade-test-network",
            "project": "demo-eng-cn-dev",
            "routing_mode": "GLOBAL",
            "self_link": "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network",
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2xxxxxxxxxxxxxxxxxxxxx9"
        }
      ]
    }
  ]
}

GCP控制台查看新建的資源

 

Destory

terraform destroy 

銷毀資源,務必小心

% terraform destroy 
Acquiring state lock. This may take a few moments...
google_compute_network.default: Refreshing state... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # google_compute_network.default will be destroyed
  - resource "google_compute_network" "default" {
      - auto_create_subnetworks         = true -> null
      - delete_default_routes_on_create = false -> null
      - enable_ula_internal_ipv6        = false -> null
      - id                              = "projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
      - mtu                             = 0 -> null
      - name                            = "wade-test-network" -> null
      - project                         = "demo-eng-cn-dev" -> null
      - routing_mode                    = "GLOBAL" -> null
      - self_link                       = "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

google_compute_network.default: Destroying... [id=projects/xperiences-eng-cn-dev/global/networks/wade-test-network]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 10s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 20s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 30s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 40s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 50s elapsed]
google_compute_network.default: Destruction complete after 54s
Releasing state lock. This may take a few moments...

Destroy complete! Resources: 1 destroyed.

 

附上我的learning by doing 代碼 供參考。

 

總結

Terraform 用法很簡單,支持的雲廠商也很多,只要查看對應文檔創建你的資源就行, 上述例子僅僅入門,玩法很多,還可以module化,這樣不同的環境只需要source一下module,傳入不同的參數就行。

除了建雲資源,其它比如 Jenkins,Spinnaker, DNS,Vault 都可以用Terraform來建,所有infra 用代碼來實現,人管代碼,代碼管基礎設施,避免管理員直接控制台操作基礎設施,後面再運用上Atlantis 將Terraform 在Git上運行,所有change走PR, review之後apply change, 這也是GitOps的一種最佳實踐。

另外,Terraform 也支持開發自己的provider。


感謝閱讀,如果您覺得本文的內容對您的學習有所幫助,您可以打賞和推薦,您的鼓勵是我創作的動力。

 

Learning by Doing
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 蒼穹之邊,浩瀚之摯,眰恦之美; 悟心悟性,善始善終,惟善惟道! —— 朝槿《朝槿兮年說》 寫在開頭 在併發編程領域,有兩大核心問題:一個是互斥,即同一時刻只允許一個線程訪問共用資源;另一個是同步,即線程之間如何通信、協作。主要原因是,對於多線程實現實現併發,一直以來,多線程都存在2個問題: 線程之間 ...
  • 一、前言 Caffeine是一個高性能的 Java 緩存庫,底層數據存儲採用ConcurrentHashMap 優點:因為Caffeine面向JDK8,在jdk8中ConcurrentHashMap增加了紅黑樹,在hash衝突嚴重時也能有良好的讀性能。多線程環境中,不同的key可以併發寫,相同的ke ...
  • 簡述 類型:創建型 目標:通過拷貝快速創建相同或相似對象。 接下來我們看一個需要改進的案例。 優化案例 話不多說,先來看一個創建相同或相似對象的傳統寫法。 原版v0 public class Department { private String name; private String count ...
  • 多用戶即時通訊系統02 4.編碼實現01 4.1功能實現-用戶登錄 4.1.1功能說明 因為還沒有學習資料庫,我們人為規定 用戶名/id = 100,密碼為 123456 就可以登錄,其他用戶不能登錄,後面使用HashMap模擬資料庫,這樣就可以多個用戶登錄。 4.1.2思路分析+框架圖 用戶的登錄 ...
  • 前言 secure boot 和FIT Image是前段時間接觸到的,其實早就該總結下了,奈何懶癌犯了,拖了好久才寫出來。 之前也有人問我,工作後最大的感受是什麼?我的回答是:“快速學習”。 就嵌入式來講,大多數應屆生在校期間可能都沒做過完整的項目,僅憑在校期間學習的內容很難勝任公司的要求。 就底層 ...
  • 寫在前面 其實media配置也可以完全用static代替(看你自己的選擇),static代替的方法是直接在mobles.py里設置用戶上傳頭像的時候,修改一下用戶上傳頭像時的保存位置 當設置成static/avatar/之後,我們後期在獲取用戶上傳的文件時就可以在其前面加一個static就可以獲取到 ...
  • 註冊中心可以說是微服務架構中的”通訊錄“,它記錄了服務和服務地址的映射關係。在分散式架構中,服務會註冊到這裡,當服務需要調用其它服務時,就到這裡找到服務的地址,進行調用。 ...
  • 案例 學習網址:https://seaborn.pydata.org/examples/errorband_lineplots.html import seaborn as sns import pandas as pd sns.set_theme(style="darkgrid") # 導入數據 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...