傳統的「Click-Ops」方法處理現代 SaaS 應用程式和企業服務正迅速成為許多組織的過時做法。關注未來規劃和程式碼化配置的團隊已開始轉向 GitOps 友善的系統管理方法。
這是有充分理由的。
基礎設施即代碼 (「IaC」) 和持續整合/持續部署 (CI/CD) 簡介
越來越多的組織偏好通過代碼或配置定義文件來實施變更,而不是依賴管理員在控制台中點擊操作,這通常被稱為 ClickOps。在 CI/CD (或「GitOps」) 方法中,所需狀態通常在 YAML 文件或其他結構良好的格式中定義,然後文件被提交到 Git 分支。提交拉取請求以啟動測試、審核和批准工作流程,隨後通過一系列合併到分支中,自動操作會通過 API 在 Jamf Pro 中實施變更。這些技術也可用於在實際影響整個設備群的生產環境之前,通過測試和用戶驗收階段推動變更。
將配置定義為代碼允許明確的代碼審核、批准和拉取請求工作流程,就像專業軟體開發一樣。這意味著您的環境變得可測試、可重複和可擴展,同時提供了回滾到先前版本的途徑,以防變更導致意外問題。
您可以快速迭代和快速回滾,無需在用戶界面和文檔中尋找就能理解故障發生的位置。
我們的團隊在丹佛的 JNUC 2025 上討論了這整個方法。在本文中,我們打算進一步深入,希望為您提供清晰的途徑來自己開始探索這一切。
首先,我們為什麼選擇 Terraform?
Terraform 是基礎設施即代碼世界中一個非常強大的工具 - 它靈活敏捷,可以配置為映射到任何您想要與之通信的 API。當我們開始研究這整個方法時,我們連接了一個 Deployment Theory,他們已經為 Jamf Pro 構建了 Terraform Provider。我們的團隊開始與他們合作以了解其應用,並隨後為該項目做出了大量貢獻。此外,我們甚至為 Apple Business 和 Apple School Manager 構建了自己的 Provider,並為 Jamf Platform API 構建了新的 Provider。
我們已記錄了這些內容,並將在開發者網站上繼續更新:https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers
在我們進一步進行之前,請不要在生產實例中測試這個。Terraform 是一個強大的工具,因此我們建議使用測試實例。如果您沒有沙箱或測試實例,可以從 Jamf Account 獲取 beta 版 Jamf Pro 實例用於此目的。
現在,讓我們幫助您開始使用 Terraform 在 Jamf Pro 中構建一些資源。
注意:為了簡單起見,我們將使用基本驗證,但您可以在將來切換到使用 OAuth。
安裝 Terraform
為了簡單起見,我們將使用 Homebrew 安裝 Terraform。如果您未安裝 Homebrew,請按照此處的步驟進行。
打開 Terminal 並按照以下步驟操作:
首先,我們將訪問 HashiCorp 官方目錄。
brew tap hashicorp/tap
接下來,我們將安裝 Terraform。
brew install hashicorp/tap/terraform
最後,我們將驗證一切是否正常工作。運行此命令應該會顯示您已安裝的 Terraform 版本。如果沒有,請重試上述步驟。
terraform -version
當然,HashiCorp 在此處記錄了他們的安裝步驟供參考。
安裝 Visual Studio Code
您真的可以使用任何文本編輯器或集成開發環境 (IDE) 來編寫 Terraform。不過,我們發現 Visual Studio Code 對 Terraform 的支持非常好,且語法突出顯示擴展易於獲得。由於 VS Code 也是免費工具,這使得它成為我們推薦用於此測試的理想選擇。
您可以在此處下載 VS Code 並在您的系統上進行安裝。
安裝 VS Code 後,您可以點擊左側的 Extensions 標籤(或在鍵盤上按 Shift + Command + X),搜索「HashiCorp Terraform」。繼續安裝此擴展以獲得完整的 Terraform 語法突出顯示。
啟動 Terraform 項目
Terraform 項目文件將包含許多啟動和運行以及開始構建項目所需的特定項目。大多數相關文件將以 .tf 文件擴展名或類似 .tfvars 的結尾。
有許多組件構成了此處的功能,但我們將在稍後時間涵蓋這些。
開始進行此操作可能會感到有點令人困惑 - 有很多東西需要啟動和運行。因此,我們想讓這變得更容易。
首先,讓我們打開 Terminal 並創建一個文件夾來存儲我們的 Terraform 項目。我們將在您的用戶級別創建此文件夾以便於訪問。
mkdir jamf-terraform
然後,我們將在 Terminal 中更改目錄到新創建的文件夾
cd ~/jamf-terraform
現在,我們將從我們的主 Terraform 模塊 repo 中克隆模板分支。
git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform
完成此操作後,您將擁有一個完全可用的模板 Terraform 項目,可用於 Jamf Pro 和 Jamf Security Cloud。
添加變量文件
您不希望在 Github repo 中出現的東西 - 您的登錄憑據或客戶端機密。幸運的是,Terraform 有針對此的途徑。
打開您選擇的文本編輯器並複製以下文本:
jamfpro_auth_method = "basic" ## oauth2 or basic
jamfpro_instance_url = "https://<tenant-name>.jamfcloud.com"
jamfpro_username = ""
jamfpro_password = ""
jamfpro_client_id = ""
jamfpro_client_secret = ""
## Jamf Protect Account Details
jamfprotect_url = "https://<tenant-name>.protect.jamfcloud.com"
jamfprotect_clientid = ""
jamfprotect_client_password = ""
## (Jamf Pro) General Settings Knobs ##
include_categories = false
您將此文件命名為 `terraform.tfvars` 並將其保存到新克隆的模板 repo 的頂級目錄。
現在,您可以開始在新創建的 `terraform.tfvars` 文件中填入信息。我已將驗證方法設置為基本身份驗證以為您簡化操作,但請知道您可以在將來更改為 `oauth2`。因此,現在您只需將您的本地用戶名和密碼分別輸入到 `jamfpro_username` 和 `jamfpro_password` 字段。您也可以輸入 Jamf Protect 信息 - 您只需在 Protect 租戶中創建 API 客戶端。
我們還為此模板 repo 中包含的一個模塊添加了一個旋鈕。這實際上是一個簡單的布爾變量,允許我們聲明是否將應用任何特定模塊。您可以選擇在將來構建的其他模塊中使用這種方法,或者只需去掉所有布爾要求並讓所有內容每次都運行。
## Terraform 狀態文件
由於我們尚未在實例中實際提交任何真實資源 - 現在是談論 Terraform 中狀態文件是什麼的完美時機。
每次您通過 Terraform 添加、更改或銷毀資源時,這些更新都會保存在名為 `terraform.tfstate` 的文件中,然後備份到名為 `terraform.tfstate.backup` 的文件中。
這是 Terraform 記住它在您的實例中所做操作的方式,對於前進功能至關重要。每個狀態文件都需要與其自己的實例相關聯,因此重要的是將它們分開以維持功能並避免發生衝突。
## 運行 Terraform
現在,您處於良好的位置 - 您已安裝 Terraform、具有模板 repo 和在變量文件中定義的憑據。
現在,您已準備好針對測試或 beta 版 Jamf Pro 實例運行我們的模板模塊。為此,您需要打開 Terminal 並運行以下命令。
`terraform init -upgrade`
這將初始化 Terraform 並為任何以前在其計算機上使用過此工具的人升級任何所需的 Provider 到最新版本,但對於完全新接觸此主題的人,它也將執行所需 Terraform Provider 的初始安裝。
`terraform fmt -recursive`
這將遞歸格式化本地克隆分支中的任何 Terraform 代碼,以確保它看起來正確並能正常運行。
`terraform plan`
這將查看您的測試 Jamf Pro 實例、您的 Terraform 狀態文件和您的 Terraform 模塊代碼,以了解運行模塊時將應用或刪除的任何更改或新內容,並返回完整計劃或將發生情況的摘要。
`terraform apply`
這將首先運行計劃並報告將添加、更改或銷毀的內容。然後它會要求您確認此操作。該字段只接受 2 個輸入:是或否。
`terraform apply -parallelism=1`
這將強制所有正在創建的資源輪流進行,一次一個。由於許多 SaaS 應用都有系統來檢測潛在攻擊,有時這是運行 Terraform 的最佳方法。
`terraform destroy -parallelism=1`
這將銷毀在 Terraform 中引用的狀態文件中引用的任何已創建資源。
任何後續運行的 `plan、apply 或 destroy` 命令都將查詢您的狀態文件,評估需要添加、更改或銷毀的內容,然後執行正確操作。
## 運行此特定模塊
運行我們包含的模板模塊時,它將在您的 Jamf Pro 中創建 7 個類別,以 Apollo 11-17 任務的每個名稱命名作為簡單測試。
添加這些後,您可以使用上述命令輕鬆銷毀它們。
更大的目標是向您展示 Terraform 的結構,以便您可以開始為您的環境構建相關模塊,這將我帶到本文的下一部分。
## Terraform 的解剖結構
此處功能的核心是 `.tf` 文件的層次結構。根級 `main.tf` 調用子模塊 `main.tf`,後者引用 `.tfvars` 文件和 `variables.tf` 文件。以下是線程和通信順序的完整分解:
運行 `terraform apply` 時:
查詢狀態文件。
根 `main.tf` 針對所請求的子模塊進行評估。
根 `variables.tf` 掃描要應用的子模塊的相關變量。
掃描 `terraform.tfvars` 以查找運行每個子模塊的所有相關變量。
然後調用並執行子模塊 `main.tf` 文件,引用它們自己的本地 `variables.tf` 文件來查找相關的本地子模塊變量。
然後創建每個資源並將引用保存到 `terraform.tfstate`。
Terraform 將報告成功或失敗以及相關代碼和響應消息供您用於故障排除(如有必要)。
## 需要記住的事項
開始構建自己的模塊時,您可以複製我們包含的模板模塊並將其更改為符合您的需求。
每個子模塊必須有其自己的 `main.tf` 和 `variables.tf` 文件。
每個子模塊都需要在根級 `main.tf` 中表示。
仔細閱讀模板 repo 中的模塊,並查找每個引用點,以便您完全理解每個部分如何協同工作以實現目標。
您可以在 `terraform.tfvars` 文件中使用布爾操作(也稱為旋鈕)來調用子模塊,或者只是讓它們在每次運行 terraform apply 時始終被調用。
您也可以使用變量被填充來依賴模塊調用,或者您甚至可以設置簡單的包含或排除語句,以根據您自己的標準確定模塊何時運行。
Terraform 是一個非常強大的工具,具有許多內置函數供您使用。其中一些在構建特定函數時將是必要的,有些您永遠不會使用,但它們都在 [https://developer.hashicorp.com/terraform](https://developer.hashicorp.com/terraform) 上得到了很好的記錄。
## 參考資料
[Deployment Theory Jamf Pro Provider](https://registry.terraform.io/providers/deploymenttheory/jamfpro/latest)
[Jamf Platform Provider](https://registry.terraform.io/providers/Jamf-Concepts/jamfplatform/latest)
[Jamf Security Provider](https://registry.terraform.io/providers/Jamf-Concepts/jsctfprovider/latest)
[Jamf AutoUpdate Provider](https://registry.terraform.io/providers/Jamf-Concepts/jamfautoupdate/latest)
[Jamf Created Example and Reference Modules](https://registry.terraform.io/modules/Jamf-Concepts/platform/jamf/latest)