Jamf Concepts

ガイド

Terraform を使用した Jamf 構成管理の概要

~2 min read

レガシーな「Click-Ops」アプローチを使用した最新の SaaS アプリとエンタープライズサービスの管理は、多くの組織にとって急速にレガシーアプローチになりつつあります。セットアップを将来対応させ、コード化することを懸念するチームは、これらのシステムを管理するための GitOps フレンドリーなアプローチに目を向け始めました。

それは十分な理由があります。

インフラストラクチャ・アズ・コード(「IaC」)および継続的インテグレーション/継続的デプロイメント(CI/CD)の概要

ますます多くの組織が、コンソール内でクリックしている管理者に頼るのではなく、コードまたは構成定義ファイルを介して変更を実装することを好みます。これは一般的に ClickOps と呼ばれます。CI/CD(または「GitOps」)アプローチでは、目的の状態が定義され、通常は YAML ファイルまたは別の適切に構造化された形式で定義され、ファイルが Git ブランチにコミットされます。プルリクエストが送信されて、テスト、レビュー、および承認ワークフローが開始され、その後、API 経由で Jamf Pro に変更を実装する自動アクションが実行されるブランチへのマージのシーケンスが続きます。これらのテクニックを使用して、本番環境での変更を実施する前に、テストユーザーアクセプテンスの段階を通じて変更を進めることもできます。

構成をコードとして定義すると、専門的なソフトウェア開発と同じ方法で、明確に定義されたコードレビュー、承認、およびプルリクエストワークフローが可能になります。これは、環境がテスト可能で、反復可能で、スケーラブルになると同時に、予期しない問題が発生した場合に、以前のバージョンにロールバックするパスも提供します。

ユーザーインターフェース内を詳しく調べたり、障害が発生した場所を理解するためにドキュメントを調べたりすることなく、迅速に反復して迅速に戻すことができます。

私たちのチームは、デンバーで開催された JNUC 2025 でこのアプローチ全体について講演しました。この記述では、さらに一歩進めて、自分で掘り下げ始めるための明確な滑走路を提供することを目指しています。

では、なぜ Terraform を選択したのでしょうか?

Terraform は、Infrastructure as Code の世界で非常に強力なツールです。敏捷で、使用したい任意の API にマップするように作成できます。このアプローチ全体を調査し始めたとき、Jamf Pro 用の Terraform Provider を既に構築していた Deployment Theory と関わりました。私たちのチームはそれの応用を理解するために彼らと一緒に仕事をし、その後、そのプロジェクトに多くを貢献しました。さらに、Apple Business と Apple School Manager 用の独自のプロバイダーも構築し、Jamf Platform API 用の新しいプロバイダーも構築しました。

これらを文書化し、Developer サイト(https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers)で今後も更新し続けます。

さらに進む前に、本番環境でこれをテストしないでください。Terraform は強力なツールなので、テストインスタンスの使用をお勧めします。この目的で使用する Jamf Pro ベータインスタンスを Jamf アカウント担当者から取得できます。

では、Terraform を使用して Jamf Pro にリソースを構築するためのセットアップを開始しましょう。

注意:シンプルに保つために、基本認証を使用していますが、将来 OAuth に切り替えることができます。

Terraform のインストール

シンプルに保つために、Homebrew を使用して Terraform をインストールします。Homebrew がインストールされていない場合は、こちらの手順に従ってください。

ターミナルを開き、次の手順を実行します:

まず、HashiCorp の公式ディレクトリにアクセスします。

brew tap hashicorp/tap

次に、Terraform をインストールします。

brew install hashicorp/tap/terraform

最後に、すべてが正常に機能したことを検証します。このコマンドを実行すると、インストールされている Terraform のバージョンが表示されます。そうでない場合は、上記の手順を再試行してください。

terraform -version

もちろん、HashiCorp はインストール手順を こちら で文書化しています。

Visual Studio Code のインストール

Terraform を書くには、実際には任意のテキストエディタまたは統合開発環境(IDE)を使用できます。ただし、Visual Studio Code は構文ハイライトが利用できる拡張機能を使用して Terraform をサポートしていることがわかりました。VS Code は無料ツールでもあるため、テストを推奨するのに理想的です。

VS Code は こちら からダウンロードでき、システムのインストールを実行できます。

VS Code をインストールしたら、左側の拡張機能タブをクリック(またはキーボードで Shift + Command + X を押して)し、「HashiCorp Terraform」を検索します。この拡張機能をインストールして、完全な Terraform 構文ハイライトを取得します。

Terraform プロジェクトの開始

Terraform プロジェクトファイルには、稼働させて、プロジェクトの構築を開始するために必要なさまざまなアイテムが含まれます。ほとんどの関連ファイルは、.tf または .tfvars のようなもので終わります。

ここの機能を構成する多くのコンポーネントがありますが、後でそれらについて説明します。

ここでの開始は圧倒的に感じることができます。稼働させるには多くのことがあります。そこで、これをもう少し簡単にしたいと思いました。

まず、ターミナルを開き、Terraform プロジェクトを保存できるフォルダを作成します。このフォルダはユーザーレベルで作成して、簡単にアクセスできるようにします。

mkdir jamf-terraform

次に、新しく作成したフォルダに Terminal でディレクトリを変更します。

cd ~/jamf-terraform

ここで、メイン Terraform モジュールリポジトリのテンプレートブランチをクローンします。

git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform

完了すると、Jamf Pro および Jamf Security Cloud 用に完全に機能するテンプレート Terraform プロジェクトが用意できます。

変数ファイルの追加

Github リポジトリに入ってほしくないもの、つまりログイン認証情報またはクライアントシークレット。幸いなことに、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 という名前を付け、新しくクローンされたテンプレートリポジトリの最上位レベルに保存します。

これで、新しく作成した terraform.tfvars ファイルの情報の入力を開始できます。認証方法を基本に設定して、シンプルにしていますが、将来 oauth2 に変更できることを知ってください。そのため、現在のところ、ローカルのユーザー名とパスワードを jamfpro_username および jamfpro_password フィールドにそれぞれ入力するだけです。Jamf Protect の情報を入力することもできます。Protect テナントで API クライアントを作成する必要があります。

このテンプレートリポジトリに含まれる 1 つのモジュールの「ノブ」も含めました。これは、特定のモジュールを適用するかどうかを宣言できる単純なブール変数です。将来構築する追加のモジュールでこのアプローチを使用するか、すべてのブール要件を削除して、実行するたびにすべてを実行させることができます。

Terraform ステートファイル

実際のリソースをインスタンスにまだコミットしていないため、Terraform のステートファイルが何であるかについて話すのに完璧な時間です。

Terraform を通じてリソースを追加、変更、または破棄するたびに、これらの更新は terraform.tfstate というファイルに保存され、terraform.tfstate.backup というファイルにバックアップされます。

これは Terraform がインスタンスで何をしたかを覚える方法であり、将来の機能に不可欠です。Terraform をインスタンスに対して実行するたびに、このステートファイルは何かが行われる前に相談されます。各ステートファイルをそれぞれのインスタンスに関連付ける必要があるため、機能を維持し、ストリームを交差させないことが重要です。

Terraform の実行

これで、Terraform がインストールされ、テンプレートリポジトリがあり、変数ファイルで認証情報が定義された良い状態にあります。

これで、テストまたはベータ Jamf Pro インスタンスに対してテンプレートモジュールを実行する準備ができました。これを行うには、ターミナルを開き、次のコマンドを実行します。

terraform init -upgrade

これにより、Terraform が初期化され、必要なプロバイダーが以前にマシンで使用したことがある人の最新バージョンにアップグレードされますが、トピックに完全に新しい場合は、必要な Terraform プロバイダーの初期インストールも行います。

terraform fmt -recursive

これにより、ローカルクローンブランチのすべての Terraform コードが再帰的にフォーマットされ、すべてが正しく見え、正しく機能することが確認されます。

terraform plan

これにより、テスト Jamf Pro インスタンス、Terraform ステートファイル、および Terraform モジュールコードを検証して、インスタンスに適用または削除する変更や新しい内容を検索し、モジュールを完全に実行する場合の処理についての詳細計画またはランダウンを返します。

terraform apply

これにより、最初にプランを実行して、追加、変更、または破棄される内容を報告します。その後、このアクションを確認するように求めます。フィールドは 2 つの入力のみを受け入れます:yes または no。

terraform apply -parallelism=1

これにより、作成されているすべてのリソースが順番に、一度に 1 つずつ実行されます。多くの SaaS アプリには潜在的な攻撃を検出するシステムがあるため、これが Terraform を実行するのに最適な方法です。

terraform destroy -parallelism=1

これにより、Terraform のステートファイルで参照されているすべての作成されたリソースが破棄されます。

plan, apply, or destroy コマンドのそれ以降の実行では、ステートファイルを相談し、追加、変更、または破棄する必要があるものを評価して、適切なアクションを実行します。

この特定のモジュールの実行

含まれているテンプレートモジュールを実行すると、11~17 のエンタープライズミッション名の 7 つのカテゴリが Jamf Pro に作成されます。これは簡単なテストです。

これらが追加されたら、上記のコマンドを使用して簡単に破棄できます。

ここでの大きな目標は、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.tfvariables.tf ファイルが必要です。

各子モジュールは、ルートレベルの main.tf で表される必要があります。

テンプレートリポジトリのモジュールを注意深く確認し、すべての参照ポイントを探して、各部分がどのように連携して目標を達成するかを完全に理解してください。

terraform.tfvars ファイルでブール演算(「ノブ」としても知られています)を使用して子モジュールを呼び出すか、Terraform apply を実行するたびに常に呼び出されるようにすることができます。

変数が入力されているかどうかに基づいて、モジュール呼び出しを依存関係にすることもできます。独自の基準に基づいてモジュールが実行される時期を決定するシンプルなインクルージョンまたは除外ステートメントを設定することもできます。

Terraform は、使用できる多くの組み込み関数を備えた非常に強力なツールです。これらのいくつかは特定の機能を構築する際に必要になり、使用しないものもありますが、すべてが https://developer.hashicorp.com/terraform で十分に文書化されています。

参考文献

Deployment Theory Jamf Pro Provider

Jamf Platform Provider

Jamf Security Provider

Jamf AutoUpdate Provider

Jamf Created Example and Reference Modules