在 DevOps 實踐中,基礎設施即代碼如何落地是一個繞不開的話題。像 Chef,Puppet 等成熟的配置管理工具,都可以知足必定程度的需求,但有沒有更友好的工具可以知足咱們絕大多數的需求?筆者認爲 Terraform 是一個頗有潛力的工具,目前各大雲平臺也都支持的不錯,尤爲是使用起來簡單明瞭。本文會簡單的介紹一下 Terraform 相關的概念,而後經過一個小 demo 帶你們一塊兒進入 Terraform 的世界。說明:本文的演示環境爲 ubuntu 16.04。html
Terraform 是一種安全有效地構建、更改和版本控制基礎設施的工具(基礎架構自動化的編排工具)。它的目標是 "Write, Plan, and create Infrastructure as Code", 基礎架構即代碼。Terraform 幾乎能夠支持全部市面上能見到的雲服務。具體的說就是能夠用代碼來管理維護 IT 資源,把以前須要手動操做的一部分任務經過程序來自動化的完成,這樣的作的結果很是明顯:高效、不易出錯。linux
Terraform 提供了對資源和提供者的靈活抽象。該模型容許表示從物理硬件、虛擬機和容器到電子郵件和 DNS 提供者的全部內容。因爲這種靈活性,Terraform 能夠用來解決許多不一樣的問題。這意味着有許多現有的工具與Terraform 的功能重疊。可是須要注意的是,Terraform 與其餘系統並不相互排斥。它能夠用於管理小到單個應用程序或達到整個數據中心的不一樣對象。git
Terraform 使用配置文件描述管理的組件(小到單個應用程序,達到整個數據中心)。Terraform 生成一個執行計劃,描述它將作什麼來達到所需的狀態,而後執行它來構建所描述的基礎結構。隨着配置的變化,Terraform 可以肯定發生了什麼變化,並建立可應用的增量執行計劃。github
Terraform 是用 Go 語言開發的開源項目,你能夠在 github 上訪問到它的源代碼。json
基礎架構即代碼(Infrastructure as Code)
使用高級配置語法來描述基礎架構,這樣就能夠對數據中心的藍圖進行版本控制,就像對待其餘代碼同樣對待它。ubuntu
執行計劃(Execution Plans)
Terraform 有一個 plan 步驟,它生成一個執行計劃。執行計劃顯示了當執行 apply 命令時 Terraform 將作什麼。經過 plan 進行提早檢查,可使 Terraform 操做真正的基礎結構時避免意外。安全
資源圖(Resource Graph)
Terraform 構建的全部資源的圖表,它可以並行地建立和修改任何沒有相互依賴的資源。所以,Terraform 能夠高效地構建基礎設施,操做人員也能夠經過圖表深刻地解其基礎設施中的依賴關係。架構
自動化變動(Change Automation)
把複雜的變動集應用到基礎設施中,而無需人工交互。經過前面提到的執行計劃和資源圖,咱們能夠確切地知道 Terraform 將會改變什麼,以什麼順序改變,從而避免許多可能的人爲錯誤。app
Terraform 的安裝很是簡單,直接把官方提供的二進制可執行文件保存到本地就能夠了。好比筆者習慣性的把它保存到 /usr/local/bin/ 目錄下,固然這個目錄會被添加到 PATH 環境變量中。完成後檢查一下版本號:ide
經過 -h 選項咱們能夠看到 terraform 支持的全部命令:
要讓 Terraform 訪問 Azure 訂閱中的資源,須要先建立 Azure service principal,Azure service principa 容許你的 Terraform 腳本在 Azure 訂閱中配置資源。請參考這裏建立 Azure service principal。
配置 Terraform 環境變量
若要配置 Terraform 使用 Azure service principal,須要設置如下環境變量:
這些環境變量的值均可以從前面建立 Azure service principal 的過程當中得到。方便起見,咱們把設置這些環境變量的步驟能夠寫到腳本文件 azureEnv.sh 中:
#!/bin/sh echo "Setting environment variables for Terraform" export ARM_SUBSCRIPTION_ID=your_subscription_id export ARM_CLIENT_ID=your_appId export ARM_CLIENT_SECRET=your_password export ARM_TENANT_ID=your_tenant_id # Not needed for public, required for usgovernment, german, china export ARM_ENVIRONMENT=public
這樣在執行 Terraform 命令前經過 source 命令執行該腳本就能夠了!
建立 Terraform 配置文件
爲了在 Azure 上建立一個 Resource Group,咱們建立名稱爲 createrg.tf 的配置文件,並編輯內容以下:
provider "azurerm" { } resource "azurerm_resource_group" "rg" { name = "NickResourceGroup" location = "eastasia" }
用 init 命令用來初始化工做目錄
把當前目錄切換到 createrg.tf 文件所在的目錄,而後執行 init 命令:
$ terraform init
其實就是把 createrg.tf 文件中指定的驅動程序安裝到當前目錄下的 .terraform 目錄中:
經過 plan 命令檢查配置文件
plan 命令會檢查配置文件並生成執行計劃,若是發現配置文件中有錯誤會直接報錯:
$ . azureEnv.sh $ terraform plan
經過 plan 命令的輸出,咱們能夠清楚的看到即將在目標環境中執行的任務。
使用 graph 命令生成可視化的圖表
其實 graph 命令只能生成相關圖表的數據(dot 格式的數據),咱們經過 dot 命令來生成可視化的圖表,先經過下面的命令安裝 dot 程序:
$ sudo apt install graphviz
而後生成一個圖表:
$ terraform graph | dot -Tsvg > graph.svg
上圖描述了咱們經過 azurerm 驅動建立了一個 Resource Group。
使用 apply 命令完成部署操做
在使用 apply 命令執行實際的部署時,默認會先執行 plan 命令並進入交互模式等待用戶確認操做,咱們已經執行過 plan 命令了,因此可使用 -auto-approve 選項跳過這些步驟直接執行部署操做:
$ terraform apply -auto-approve
到 Azure 站點上檢查一下,發現名稱爲 NickResourceGroup 的 Resource Group 已經建立成功了。
Terraform 支持的平臺很是多,像 AWS,Azure 等大廠天然是不用說了,一些小的廠商也能夠經過提供 provider 支持 Terraform,從而讓整個生態變得很是活躍。若是你們想在 DevOps 實踐中引入基礎設施即代碼,不管是面對的是公有云仍是私有云,相信 Terraform 都不會讓你失望。
參考:
Introduction to Terraform
Terraform github
安裝和配置 Terraform