メインコンテンツまでスキップ

モバイル端末管理 (MDM) を使用したコーディング・エージェントの展開

備考

ベータ版

この機能はベータ版です。使用するには、ワークスペース管理者が [プレビュー] ページから Unity Gateway マネージド構成 を有効にする必要があります。Databricksのプレビューを管理を参照してください。

モバイルデバイス管理(MDM)とUnity Gateway CLIを使用して、チームのコーディングエージェント設定を配布します。管理者はワークスペースで設定を公開し、開発者は設定されたモデル、MCPサーバー、スキルを使用して使い慣れたエージェントを使用します。

MDMソフトウェアは、各デバイスで管理者権限でプロビジョニングスクリプトを実行します。このスクリプトは ug、Databricks CLI、およびコーディングエージェントをマシン全体にインストールしてから、ug configure をランしてワークスペースのコーディングエージェント構成をデバイス全体にインストールします。その後、開発者は管理者権限なしでエージェントを起動し、自身のDatabricksアカウントでサインインします。

注記

MDMプロビジョニングは、マシン全体の設定を持つClaude CodeおよびCodexを構成します。GitHub Copilot CLIまたはGitHub Copilot in Visual Studio Codeを構成しません。開発者はug configure --agents copilotを使用してGitHub Copilotを自分で設定します。

MDM でロールアウト​

コーディングエージェントを設定する​

チームが使用するエージェントを有効にして、ワークスペースで構成を公開します。コーディングエージェントの設定を参照してください。

各有効エージェントには、次のステップのService Principalが使用できるモデルが設定に最低でも1つ必要です。たとえば、Claude CodeにはClaudeモデルが必要です。ug configure は、モデルがないエージェントをスキップします。

プロビジョニングService Principalを作成する​

MDMポリシーは、ラン中に公開された設定を読み取るためだけにService Principalを使用します。開発者は自分自身として認証を行います。

  1. Service Principalを追加します(例:ug-mdm-provisioning)ワークスペースに。

  2. Workspace access (ワークスペースアクセス)の資格のみを有効のままにします。Service Principalには他の資格は必要ありません。エンタイトルメントの管理を参照してください。

  3. 必要な Unity Catalog 権限を含め、公開された構成内のモデル、MCP サーバー、およびスキルへのアクセス権をService Principalに付与します。モデル、MCP サーバー、スキルへのアクセスの付与を参照してください。

  4. Service Principalの シークレット tabで、 シークレットの生成 をクリックします。ローテーションポリシーに適合する有効期間を選択します。 スコープ で、 その他のAPIs をクリックし、ai-gatewayとunity-catalogスコープを追加して、それぞれを 読み取り に設定します。ステップ1: OAuthシークレットを作成するを参照してください。

    「Other APIs」の下に「ai-gateway」スコープと「unity-catalog」スコープを追加し、それぞれを「Read」に設定したOAuthシークレット生成ダイアログ

  5. クライアントIDとシークレットをコピーします。ダイアログを閉じると、シークレットを再度表示することはできません。

MDMソフトウェアでのデプロイ​

重要

Install ug in a shared location that every user on the device can run, not in the root user's home directory. ug configure records the path to ug in the machine-wide agent settings, and each developer's agent runs ug from that path to authenticate.

これらのステップにより、Jamf Proを使用してClaude CodeおよびCodexをmacOSデバイスにデプロイします。各デバイスには以下が必要です:

  • ワークスペース URL、PyPI (pypi.org および files.pythonhosted.org)、GitHub (github.com および raw.githubusercontent.com)、astral.sh、および downloads.claude.ai へのネットワークアクセス。
  • Xcode 用コマンドラインツール、または softwareupdate を使用してスクリプトをインストールするためのアクセス許可。ug は GitHub からインストールされますが、これには git が必要です。

スクリプトを追加する​

  1. Jamf Proで、 設定 > コンピュータ管理 > スクリプト > 新規 に移動し、スクリプトに「Unity Gateway provision」という名前を付けます。

  2. [スクリプト] tabに、以下のスクリプトを貼り付けます。

プロビジョニングスクリプトの表示

Bash
#!/bin/bash
#
# macOS MDM provisioning script, written for Jamf Pro policies: install
# ug, the Databricks CLI, Claude Code and Codex machine-wide and run
# `ug configure` as root, which installs the workspace policy at
# /etc/unitygateway/managed-settings.json.
# Users then launch with no sudo:
#
# UG_SKIP_OS_SETTINGS=1 ug claude (or: ug codex)
#
# Jamf parameters ($1-$3 are reserved by Jamf):
# $4 Databricks workspace URL, starting with https://
# $5 Service principal OAuth client id
# $6 Service principal OAuth client secret
#
# The token is used for this run only; developers sign in with their own
# OAuth. Needs access to PyPI, GitHub, astral.sh and downloads.claude.ai.

set -euo pipefail
umask 022
export HOME=/var/root
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
WORKSPACE="${4%/}"
PREFIX=/usr/local/unity-gateway
CLAUDE_RELEASES=https://downloads.claude.ai/claude-code-releases
CODEX_RELEASES=https://github.com/openai/codex/releases/latest/download
UG_REPO=https://github.com/databricks/unity-gateway
UV_URL=https://astral.sh/uv/install.sh
CLI_URL=https://raw.githubusercontent.com
CLI_URL="$CLI_URL/databricks/setup-cli/main/install.sh"
CLT_MARKER=/tmp/.com.apple.dt.CommandLineTools
CLT_MARKER="$CLT_MARKER.installondemand.in-progress"

# ug must be in a shared path: the machine-wide agent settings
# run it by absolute path for every user.
export UV_TOOL_DIR="$PREFIX/tools"
export UV_TOOL_BIN_DIR=/usr/local/bin
export UV_PYTHON_INSTALL_DIR="$PREFIX/python"
export UV_PYTHON_PREFERENCE=only-managed
mkdir -p /usr/local/bin

# Get ug from git
if ! xcode-select -p >/dev/null 2>&1; then
touch "$CLT_MARKER"
clt="$(softwareupdate -l 2>/dev/null \
| sed -n 's/^\* Label: \(Command Line Tools.*\)$/\1/p' \
| tail -n1)"
softwareupdate -i "$clt"
rm -f "$CLT_MARKER"
fi

if ! command -v uv >/dev/null; then
curl -LsSf "$UV_URL" \
| env UV_INSTALL_DIR=/usr/local/bin UV_NO_MODIFY_PATH=1 sh
fi
uv tool install --force "git+$UG_REPO"

if [ ! -x /usr/local/bin/databricks ]; then
curl -fsSL "$CLI_URL" | sh
fi

# Download into a private temporary directory, not fixed /tmp paths
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT

# Install Claude Code
if [ ! -x /usr/local/bin/claude ]; then
case "$(uname -m)" in
arm64) platform=darwin-arm64 ;;
*) platform=darwin-x64 ;;
esac
version="$(curl -fsSL "$CLAUDE_RELEASES/latest")"
base="$CLAUDE_RELEASES/$version"
checksum="$(curl -fsSL "$base/manifest.json" \
| plutil -extract "platforms.$platform.checksum" raw -o - -)"
curl -fsSL -o "$tmp/claude" "$base/$platform/claude"
echo "$checksum $tmp/claude" | shasum -a 256 -c -
install -m 755 "$tmp/claude" /usr/local/bin/claude
fi

# Install Codex
if [ ! -x /usr/local/bin/codex ]; then
case "$(uname -m)" in
arm64) target=aarch64-apple-darwin ;;
*) target=x86_64-apple-darwin ;;
esac
curl -fsSL "$CODEX_RELEASES/codex-$target.tar.gz" \
| tar -xzf - -C "$tmp" "codex-$target"
install -m 755 "$tmp/codex-$target" /usr/local/bin/codex
fi

# Get short lived credential; curl reads the client id and secret from
# stdin (-K -) so they don't appear in its arguments.
resp="$(printf 'user = "%s:%s"\n' "$5" "$6" \
| curl -sS -K - \
-d grant_type=client_credentials \
--data-urlencode 'scope=ai-gateway:read unity-catalog:read' \
"$WORKSPACE/oidc/v1/token")"
if ! DATABRICKS_BEARER="$(printf '%s' "$resp" \
| plutil -extract access_token raw -o - -)"; then
echo "Token request to $WORKSPACE failed: $resp" >&2
exit 1
fi
export DATABRICKS_BEARER

ug configure --global --workspace "$WORKSPACE" \
--agents claude,codex </dev/null
  1. オプション tab で、 パラメーター 4 を Workspace URL、 パラメーター 5 を Client ID、 パラメーター 6 を Client secret とラベル付けします。

  2. 保存 をクリックします。

このスクリプトは、Claude Code、Codex、およびDatabricks CLIが存在しない場合のみインストールし、ランごとにugを再インストールします。最初のインストール後にエージェントやCLIを更新することはありません。これらを最新の状態に保つには、デバイス上のソフトウェアを更新する方法に合わせてスクリプトを変更してください。

ポリシーを作成します​

  1. コンピュータ > ポリシー > 新規 の順に移動します。

  2. 全般 で、 Trigger を 定期チェックイン に、 実行頻度 を 1日1回 に設定します。各デバイスは毎日ug configureを実行し、ワークスペースに公開した構成のアップデートを適用します。

  3. 「 スクリプト 」で、 優先度 を「 後 」に設定したUnity Gateway provisionを追加します。パラメーターを入力します:

パラメーター

Value

4 (ワークスペースURL)

https://で始まるDatabricksワークスペースのURL。

5(クライアント ID)

Service PrincipalのクライアントID。

6 (クライアントのシークレット)

Service Principalのシークレット。

パラメーター

Value

4 (ワークスペースURL)

https://で始まるDatabricksワークスペースのURL。

5(クライアント ID)

Service PrincipalのクライアントID。

6 (クライアントのシークレット)

Service Principalのシークレット。

  1. スコープ で、ターゲットにするデバイスを選択します。小さなグループのパイロットデバイスから起動します。

  2. 保存 をクリックします。Jamf Proは、次回のチェックイン時に、各対象デバイスでポリシーをランします。

警告

Jamf Pro passes policy parameters to the script as command-line arguments. Any local user can read the client ID and secret, for example with ps, while the script runs, and Jamf Pro admins who can view the policy can read them too. The script doesn't write the credentials or the token to disk. To limit the impact of a leak, grant the service principal only the Workspace access entitlement, use a short secret lifetime, and rotate the secret regularly.

開発者マシンでエージェントを起動する​

ポリシーがデバイスで実行された後、開発者は管理者権限なしでターミナルからエージェントを起動します:

Bash
UG_SKIP_OS_SETTINGS=1 ug claude
UG_SKIP_OS_SETTINGS=1 ug codex

UG_SKIP_OS_SETTINGS=1 は、MDMポリシーによってインストールされた設定を使用するようにugに指示します。開発者は、すべてのセッションで使用するために、シェルプロファイルでUG_SKIP_OS_SETTINGS=1を設定できます。最初の起動時にはブラウザーが開き、開発者はそこでDatabricksにサインインします。コーディング エージェントの アクティビティは、Service Principalではなく、個々の開発者に起因するものとされます。

起動コマンドを短縮するには、変数設定とエージェント起動を行うエイリアスを開発者に提供します。たとえば、MDMでデプロイされたシェルプロファイルで提供します。

Bash
alias claude='UG_SKIP_OS_SETTINGS=1 ug claude'
alias codex='UG_SKIP_OS_SETTINGS=1 ug codex'

Claude デスクトップ版のロールアウト​

同じ ug configure ランは、デバイス上のすべてのユーザーに対して Claude デスクトップアプリを構成します。Claude デスクトップをサポートするには、スクリプト ug configure が実行される前に、プロビジョニングスクリプトでインストールしてください。上記の Jamf Pro スクリプトは Claude デスクトップをインストールしません。

ユーザーが初めてClaude Desktopを開くと、自身のDatabricksアカウントでサインインします。ユーザーはclaude.aiのプロジェクトやチャットをインポートすることもできます。

ロールアウトの検証​

パイロットデバイスで、開発者のオペレーティングシステムのログインアカウントでサインインし、次のことを確認します:

  • エージェントが開き、構成されたモデルを使用して応答します。
  • 構成されたMCPサーバーとスキルが利用可能になり、開発者はそれらを使用できます。
  • リクエストは Unity Gateway の使用状況追跡に表示され、トレースが有効になっている場合はトレースも表示されます。コーディングエージェントのアクティビティの監視を参照してください。

プロビジョニングスクリプトまたは公開済み構成を変更した後、これらのチェックを繰り返してください。

資格情報と設定の維持​

Service Principalのシークレットをローテーションするには:

  1. Service Principal の新しいシークレットを生成します。
  2. MDM ポリシーのシークレットを更新します。
  3. デバイスでポリシーが実行されたら、古いシークレットを削除します。

シークレットが漏洩した場合は、直ちにローテーションを行い、古いシークレットを削除してください。スクリプトがリクエストするトークンは短命であり、スクリプトはデバイスにトークンを書き込まないため、デバイスごとに取り消す必要がある認証情報はありません。

設定を更新するには、ワークスペースで変更を公開します。デバイスは、次にポリシーがランするときにそれらを適用します。同期設定の更新をご覧ください。

トラブルシューティング​

エラー

原因

Token request to ... failed: {"error":"invalid_client"...}

MDMポリシーのクライアントIDまたはシークレットが間違っているか、シークレットの有効期限が切れています。

Token request ... failed: ... Scopes ... are not assigned to the client

シークレットには ai-gateway:read スコープと unity-catalog:read スコープが含まれていません。

None of the coding agents enabled by your workspace configuration are available

有効なエージェントには、例えばClaudeモデルなしで構成されたClaude Codeなど、Service Principalが使用できるモデルがありません。

エラー

原因

Token request to ... failed: {"error":"invalid_client"...}

MDMポリシーのクライアントIDまたはシークレットが間違っているか、シークレットの有効期限が切れています。

Token request ... failed: ... Scopes ... are not assigned to the client

シークレットには ai-gateway:read スコープと unity-catalog:read スコープが含まれていません。

None of the coding agents enabled by your workspace configuration are available

有効なエージェントには、例えばClaudeモデルなしで構成されたClaude Codeなど、Service Principalが使用できるモデルがありません。