てくなべ (tekunabe)

ansible / network automation / 学習メモ / 思考メモ

[Ansible/AAP] 自然言語で AAP を操作できる AAP MCP サーバーをためしてみた

1. はじめに

「Ansible と AI」といえば、Playbook を生成したり、ドキュメントを生成したりできる「Ansible Lightspeed with IBM watsonx Code Assistant」が先駆け的な存在で登場しました。

最近は、それだけでなくAAP(Ansible Automation Platform) を自然言語で操作できる AAP MCP サーバーが登場しました。現状は Technology preview 扱いです。

自然言語で AAP を操作」というと、「Ansible Lightspeed intelligent assistant」を思い浮かべるかもしれませんが、本記事で紹介するものとは別物です(裏で AAP MCP サーバーが動いてるのかもしれませんが)。「Ansible Lightspeed intelligent assistant」は AAP の画面にチャットウィンドウとして統合されているのに対して、「AAP MCP サーバー」はあくまで MCP サーバー単体です。ややこしいですが、Ansible Development Tools MCP Server とも別物です。

今回、AAP 本体と合わせて AAP MCP サーバー も構築して、ちょっと試してみたので、まとめます。

  • 環境
    • AAP 2.6 コンテナ版 オンラインインストーラ
      • 最終更新 2025-12-10、ファイル名 ansible-automation-platform-containerized-setup-2.6-4.tar.gz
      • 実際はバンドル版でもOK
    • RHEL9

なお、YouTubeThe Ansible Playbook チャンネルでは、5つのユースケースが動画で紹介されています。動画なのでイメージがつきやすくておすすめです。

www.youtube.com

(本記事を書いてる途中で上記動画に気が付きました)

※ 用語のついて補足:

ドキュメントでは「AAP MCP server」ではなく「Ansible MCP server」という表記になっています。実態としては AAP を操作できるものであり、前述の動画でも「Ansible Automation Platform MCP Server」と表現されています。そのため本記事では「AAP MCP サーバー」と表記にします。

ご注意

繰り返しになりますが、AAP MCP サーバーは 2026年1月現在 Technology preview 扱いのため、まだ本番運用には向いていません。今後、手順や仕様も変更される可能性があります。また、本記事は、できることを探ったりする検証のため、権限をゆるくしています。本記事はあくまで私の環境でこうやってこうなった、と記録した趣旨であることをご了承ください。(本ブログの大抵の記事はそんな感じです)

2. 概要: AAP MCP サーバーで何できる?

「AAP を自然言語で操作」といっても、さまざまなことを連想します。

AAP の公式ドキュメントに、ツールセットの一覧があり、使い道の例も掲載されています。

私なりにまとめるとツールセットは以下のとおりです。ちょっとまだ私の理解がふわっとしています。

ツールセット名 できることの例
Job management ジョブテンプレートの起動や、実行ログの収集
Inventory management インベントリ上の、ホスト、グループの管理
System monitoring ログの収集やシステム状態のチェック
User management ユーザー、チームの管理
Security/compliance 認証情報
Platform configuration システム設定

3. 準備

AAP 本体をインストールするときに、一緒に AAP MCP サーバーもデプロイできます。今回は手っ取り早く、1つの VM にすべてのコンテナをデプロイします。

通常よりもコンポーネントが多くなり「今やってる作業がどこの何なのか?」が分かりにくくなるため、手順の前に全体構成の説明をします。

全体構成図

上図に記載しているポート番号はデフォルトの場合のものです。今回はこのポート番号の前提で作業を進めます。

443 で待ち受ける Platform Gateway がいつもどおりと言うか、ここが本記事で AAP 本体と呼んでいる箇所です。(コンテナ単位で図示するともっと多いですが、単純化しています)

AAP MCP サーバーは 8448 で待ち受けます。今回はすべてのコンテナを 1つの VM にデプロイするので、ポート番号が被らないようにする必要があります。こういう経緯もあってデフォルトの 8448 を利用します。

インストール

基本的に 公式ドキュメントの以下のドキュメントを混ぜたような手順で進めます。

AAP 2.5 以降のコンテ版をインストールした経験がある方に説明しますと、主な差分はインベントリファイルの [ansiblemcp] グループにホストを追加する程度です(Chapter 7. Deploying AAP MCP server on Ansible Automation Platformどおり)。試してはいませんが、おそらく既存の AAP にあとから追加する流れでもできるのではないかと思います。

必要パッケージのインストール

RHEL 9 系に AAP 2.6 コンテナ版をインストールするには ansible-core 2.14 が要件になっていますので、インストールします。

sudo dnf install ansible-core

関連公式ドキュメント:

インストーラーのダウンロード

インストーラーを Red Hat のサイトからダウンロードして、インストール先の AAP サーバーに配置します。

今回はインストーラーとして「Ansible Automation Platform 2.6 Containerized Setup」(最終更新 2025-12-10、ファイル名 ansible-automation-platform-containerized-setup-2.6-4.tar.gz)を利用します。

続いて、解凍してディレクトリを移動します。

tar xzf ansible-automation-platform-containerized-setup-2.6-4.tar.gz
cd ansible-automation-platform-containerized-setup-2.6-4

関連公式ドキュメント: - 4.5. Downloading Ansible Automation Platform

インストール用インベントリファイルの準備

今回は構成をなるべくシンプルにするため、Automation Controller と Platform GatewayMCP サーバーのみの構成にします。EDA や Automation Hub は省略します。

以下のようなインベントリを準備しました。ファイル名は inventory_with_mcp.ini とします。

# This section is for your AAP Gateway host(s)
# -----------------------------------------------------
[automationgateway]
aap26.sakana.local

# This section is for your AAP Controller host(s)
# -----------------------------------------------------
[automationcontroller]
aap26.sakana.local

# This section is for your Ansible MCP Server host(s)
# -----------------------------------------------------
[ansiblemcp]
aap26.sakana.local

# This section is for the AAP database
# -----------------------------------------------------
[database]
aap26.sakana.local

[all:vars]
# Ansible
ansible_connection=local

# MCP Settings
mcp_allow_write_operations=true

# Common variables
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.6/html/containerized_installation/appendix-inventory-files-vars#ref-general-inventory-variables
# -----------------------------------------------------
postgresql_admin_username=postgres
postgresql_admin_password=<パスワード>

registry_username=<コンテナレジストリ用Red Hat アカウント>
registry_password=<パスワード>

redis_mode=standalone

# AAP Gateway
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.6/html/containerized_installation/appendix-inventory-files-vars#ref-gateway-variables
# -----------------------------------------------------
gateway_admin_password=<パスワード>
gateway_pg_host=aap26.sakana.local
gateway_pg_password=<パスワード>

# AAP Controller
# https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.6/html/containerized_installation/appendix-inventory-files-vars#ref-controller-variables
# -----------------------------------------------------
controller_admin_password=<パスワード>
controller_pg_host=aap26.sakana.local
controller_pg_password=<パスワード>
controller_percent_memory_capacity=0.5

AAP MCP サーバー固有のポイントは以下のとおりです。

  • [ansiblemcp] にデプロイ先ホストを指定
    • 今回は、すべてのコンテナを 1つの VM にまとめるため、gateway などと同じホストを指定
  • 変数 mcp_allow_write_operationstrue に指定
    • 権限設定。AAP MCP サーバーに write 権限(テンプレートの起動や何かの設定など)を持たせるかどうか。今回は検証目的で true。デフォルトは false

なお、証明書検証を無視したい場合は、さらに [all:vars] セクションに mcp_ignore_certificate_errors=true を追加します。詳細はドキュメントを参照してください。

関連公式ドキュメント:

インストール Playbook の実行 (図中のA)

インストール用の Playbook を実行して、しばらく待ちます。

ansible-playbook -i inventory_with_mcp.ini ansible.containerized_installer.install

AAP 本体はすぐあとで GUI を開くのでよいとして、AAP MCP サーバー側の簡単な状態確認をします。

Web ブラウザから https://<AAP>:8448/api/v1/health を開いて、以下のレスポンスが返ってくることを確認します。

{"status":"ok"}

大丈夫そうです。

この確認手順は AAP としてのドキュメントに載っていませんが、ansible/aap-mcp-server というリポジトリHealth Monitoring の方法を参考に試したらこうなった、というレベルです(あやふや)。これでどこまでの確認ができたことになるのかは不明ですが、少なくとも AAP 本体(厳密には Platform Gateway)とは異なるポート 8448 への疎通は OK です。

ちなみに podman ps の結果は以下のとおりでした。

$ podman ps
ONTAINER ID  IMAGE                                                                                COMMAND               CREATED      STATUS         PORTS               NAMES
036dc2d14606  registry.redhat.io/rhel9/postgresql-15:latest                                        run-postgresql        6 hours ago  Up 37 minutes  5432/tcp            postgresql
7f9007643375  registry.redhat.io/rhel9/redis-6:latest                                              run-redis             6 hours ago  Up 37 minutes  6379/tcp            redis-unix
9f15eb4630bb  registry.redhat.io/rhel9/redis-6:latest                                              run-redis             6 hours ago  Up 37 minutes  6379/tcp            redis-tcp
19352dc9ec3e  registry.redhat.io/ansible-automation-platform-26/receptor-rhel9:latest              /usr/bin/receptor...  6 hours ago  Up 37 minutes                      receptor
53e011b2ef53  registry.redhat.io/ansible-automation-platform-26/controller-rhel9:latest            /usr/bin/launch_a...  6 hours ago  Up 37 minutes  8052/tcp            automation-controller-rsyslog
b6bc635159d8  registry.redhat.io/ansible-automation-platform-26/controller-rhel9:latest            /usr/bin/launch_a...  6 hours ago  Up 37 minutes  8052/tcp            automation-controller-task
11123fd4be2a  registry.redhat.io/ansible-automation-platform-26/controller-rhel9:latest            /usr/bin/launch_a...  6 hours ago  Up 37 minutes  8052/tcp            automation-controller-web
812971cb08b8  registry.redhat.io/ansible-automation-platform-26/gateway-proxy-rhel9:latest         /usr/bin/envoy --...  5 hours ago  Up 37 minutes                      automation-gateway-proxy
77a50b23c25e  registry.redhat.io/ansible-automation-platform-26/gateway-rhel9:latest               /usr/bin/supervis...  5 hours ago  Up 37 minutes                      automation-gateway
751b06a66f4a  registry.redhat.io/ansible-automation-platform-tech-preview/mcp-server-rhel9:latest  /entrypoint.sh        4 hours ago  Up 37 minutes  8080/tcp, 8086/tcp  ansiblemcp

registry.redhat.io/ansible-automation-platform-tech-preview/mcp-server-rhel9:latest というイメージ名がみえますね。今回タイミングの latest2.6.20251210-2 を指しているようでした。

インストール番外編

AAP のインストーラーではなく、検証で ansible/aap-mcp-server ローカルで動かすという方法もあります。既存の AAP の環境をなるべく触らずに気軽に試すには良いかもしれません。

(本記事はあくまでも AAP のインストーラーを前提にしています)

AAP の API Token を作成 (図中のB)

ここまでで、AAP MCP サーバーを含む AAP をデプロイできました。

引き続き AAP MCP サーバーを利用するための準備を進めます。具体的には、あとで VS Code 側の mcp.json に指定する必要あるための、AAP の API トークンを作成します。MCP サーバー経由で操作したい権限のユーザーのものです。

今回は検証環境での検証目的のため、極めて緩い admin の Write 権限にします。

AAP に admin でログインして、ライセンス適用を済ませます。

続いて、左メニューの [Access Management] 配下の [ユーザー] を開いて、対象のユーザー(今回は admin)を選択します。

続いて、[API Token] タブを開きます。

API Tokenを開く

[Create API token] ボタンをクリックし、以下の情報を入力し [Create token] ボタンをクリックします。

  • 説明: MCP Server (任意、分かりやすい自分向けの説明)
  • OAuth application: (空ののまま)
  • Scope: Write (検証のために緩く)

トークン作成

このときに限りトークンが表示されるので、コピーしてどこかに控えておきます。

トークンを控えておく

AAP 本体側の設定は以上です。

関連公式ドキュメント:

mcp.json の設定(図中のC)

今回は Visual Studio Code 上の GitHub Copilot を利用し、ワークスペース単位で設定します。

公式ドキュメントmcp.json のサンプルを参考にして .vscode/mcp.json を作成します。

サンプルからのカスタマイズポイントは以下のとおりです。

  • VS Code 側の仕様に合わせて、一番トップのキーは mcpServers ではなく servers にする
  • url は今回デプロイした AAP MCP サーバーの FQDN:ポート にする。AAP 本体ではないのでご注意
  • Authorization ヘッダーの Bearer の後に、作成済みの AAP の API トークンを指定する
    • べた書きは避けたいので今回は inputs経由で値を渡す(対策はお好み方法で)
{
    "inputs": [
        {
            "type": "promptString",
            "id": "aap-api-token", 
            "description": "AAP API Token",
            "password": true
        }
    ],
    "servers": {
        "aap-mcp-inventory-management": {
          "type": "http",
          "url": "https://<AAP>:8448/mcp/inventory_management",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        },
        "aap-mcp-job-management": {
          "type": "http",
          "url": "https://<AAP>:8448/job_management/mcp",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        },
        "aap-mcp-system-monitoring": {
          "type": "http",
          "url": "https://<AAP>:8448/system_monitoring/mcp",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        },
        "aap-mcp-user-management": {
          "type": "http",
          "url": "https://<AAP>:8448/user_management/mcp",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        },
        "aap-mcp-security-compliance": {
          "type": "http",
          "url": "https://<AAP>:8448/security_compliance/mcp",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        },
        "aap-mcp-platform-configuration": {
          "type": "http",
          "url": "https://<AAP>:8448/platform_configuration/mcp",
          "headers": {
            "Authorization": "Bearer ${input:aap-api-token}"
          }
        }
    }
}

なお、GitHub リポジトリ ansible/aap-mcp-serverREADME.md では、ツールセット指定の MCP Endpoint/mcp/{toolset} と記載されていました。AAP のドキュメントだと {toolset}/mcp なので逆です。少し試した限りではどちらでも良いように見えました。

mcp.json の設定ができたら起動します。あまり効率が良くないかもしれませんが、今回はおためしで6つすべて起動してしまいます。(起動するツールが多すぎるというメッセージが表示されるので、実際はオンオフを切り替えた方が良いかもです)

起動

今回は inputs"type": "promptString" を指定しているので、以下のように VS Code 画面上部に入力プロンプトが表示されるので、作成済みで控えておいた AAP API トークンを入力します。

トークン入力プロンプト

以下のような表示になれば、起動が成功したことがわかります。

実行中

エラーの場合は「エラー」となります(後述の「補足: エラー集」参照)。

関連公式ドキュメント:

ここまでで、各種準備ができました。

4. おためし

いよいよ、いろいろ指示して試してみます。プロンプト自体はあまり参考にならないと思いますが・・。

モードは Agent、モデルは Auto で試します。

参照系

安全、かつ手軽に試せそうな参照系の操作をします。

インベントリーの参照

ツールセットに「Inventory management」とあったので、手っ取り早く試せそうなインベントリー情報を参照してみます。

AAP から既存のインベントリーからホスト一覧を表示してください

途中、操作の許可が求められたら内容を確認して許可します。

内容を確認して許可

こんな結果になりました。

インベントリ参照結果

localhost はデフォルトであるもの。ios01 は手動で作成しておいたもので、意図的にエラーになるジョブを実行済みなので、最終ジョブが「失敗」となってるのも正解です。

ジョブ実行エラーの調査

あらかじめ、エラーのジョブ実行ログを残しておき、その調査をお願いしてみました。

AAPで直近でエラーになったジョブの、エラーの原因と解決策を教えてください

トラブルシューティング依頼

良い感じです。確かに ios01 は名前解決できず、ansible_host 変数の指定もないため、指摘の内容は妥当です。

エラーの傾向の調査

引き続きトラブルシューティング系です。

今度は直近のエラーではなく、ある程度遡ってもらうことを前提に傾向を調べてもらいました。

AAP上で、最近のジョブのエラーの傾向を教えてください

エラーの傾向

もっとジョブが多いと、興味深い回答になりそうです。

自動化対象になっていないホストの一覧

あらかじめ ios99 というホストを作成し、自動化履歴がない状態(成功、失敗問わず)で、以下のことを聞いてみました。

AAP上で、直近一ヶ月で自動化対象になってないホストを教えて

このくらいであれば API リクエストを含むちょっとしたスクリプトでも良さそうですが。

自動化対象になってないホスト

プロンプトの言い回しが微妙でしたね。ただ、「新規追加したがジョブ未実行のホスト(例:ios99など)」は挙げられているので、少し意図したことは聞けました。

設定系

今度は設定や実行など、副作用のある操作を試します。

ジョブテンプレートの実行

シンプルにジョブテンプレートの実行をお願いしてみます。

AAP 上のジョブテンプレート Demo Job Template を実行して、結果のサマリーを表示してください。

結果は以下のとおりです。

ジョブテンプレートの実行

おおっと思ったのは「ジョブがまだ実行中です。完了するまで待機してから、ホスト別のサマリーを取得します。」のところです。API の仕様上、ジョブテンプレートの実行は非同期です。「結果のサマリーを表示してください」まで指定したので、非同期処理をちゃんと待ってくれています。

念のため AAP の画面上で実行結果を確認したら、ちゃんと成功していました。

ジョブテンプレートの実行結果(AAP上)

意図通りにできなかったこと

頼み方の改善の余地が大いにあるということだと思うのですが、今回の頼み方では以下のことはできませんでした。

ワークフローの Mermaid 化(実現ならず)

ワークフロージョブテンプレートのワークフロービジュアライザーで見れるノードのつながりを、Mermaid の書式で再現できたらいいなと思いました。ドキュメントとして残しておくために。

しかし、今回の頼み方では、ワークフロージョブテンプレートを一度実行してから、その結果からノードの情報を取得していました。意図としては、実行せずにノードの定義情報を読み取ってほしかったところですが、うまく伝えられませんでした。

AAP 上の ワークフロージョブテンプレート `wf01` の関連づいているノードを取得し、ワークフロービジュアライザー上で確認できるようなノードのつながりを、Mermaid の書式でつくってください

ワークフローの Mermaid 化

途中、

テンプレートを実行してから、実行ジョブのノード情報を取得します。

とあり、実行しようとしていることがあります。AAP の画面で確認しても実行されていました。実際は、許可するかどうかの確認のワンクッションがありましたが、今回は様子を見るためにあえて許可しました。

(もしかしたら現在の MCP サーバーの仕様では、実行後ジョブからはノード情報を取得できても、ワークフロージョブテンプレート定義からは取得できない、ってことなのかもしれません)

結果的に、手元にwf01_visualization.md というファイル名で以下の内容でファイルが作成されました。

クリックして開く

# AAP ワークフロージョブテンプレート `wf01` の構成

## ワークフロー構成図

ワークフロージョブテンプレート `wf01` のノード関係を Mermaid で表現した図:

graph TD Node3["ノード 3
Demo Job Template
(Status: successful)"] Node1["ノード 1
Demo Job Template
(Status: running)"] Node2["ノード 2
Demo Job Template
(Status: pending)"]

Node3 -->|always| Node1
Node3 -->|always| Node2

style Node3 fill:#90EE90
style Node1 fill:#87CEEB
style Node2 fill:#FFD700
## ノード詳細情報

### ノード 3 (開始ノード)
- **テンプレート**: Demo Job Template (ID: 7)
- **ジョブ ID**: 9
- **ステータス**: successful
- **実行時間**: 7.222秒
- **遷移**: 常に(always)ノード 1 と ノード 2 へ進行
- **属性**: `all_parents_must_converge: false`

### ノード 1 
- **テンプレート**: Demo Job Template (ID: 7)
- **ジョブ ID**: 10
- **ステータス**: running
- **実行時間**: 0秒
- **遷移**: なし(ワークフロー終了)
- **属性**: `all_parents_must_converge: false`

### ノード 2
- **テンプレート**: Demo Job Template (ID: 7)
- **ジョブ ID**: 11
- **ステータス**: pending
- **実行時間**: 0秒
- **遷移**: なし(ワークフロー終了)
- **属性**: `all_parents_must_converge: false`

## ワークフロー実行フロー

sequenceDiagram participant Start as ノード 3
開始 participant N1 as ノード 1 participant N2 as ノード 2

Start->>N1: always(無条件)
Start->>N2: always(無条件)
Note over N1: 実行中
Note over N2: 保留中
## API 情報

- **ワークフロージョブテンプレート ID**: 8
- **ワークフロージョブテンプレート名**: wf01
- **ワークフロー実行 ID**: 8
- **ノード数**: 3

## 備考

- ノード 3 の `always_nodes` フィールドに `[1, 2]` が指定されており、ノード 3 の実行完了後、常にノード 1 と 2 が並行実行されます
- ノード 1 と 2 に親の収束条件は設定されていません(`all_parents_must_converge: false`)
- 各ノードは同じジョブテンプレート(Demo Job Template)を参照しています

2箇所 Mermaid の書式が出てきます。それぞれのレンダリング結果は以下のとおりです。

上の方にある「ワークフロー構成図」

ワークフロー構成図

下の方にある「ワークフロー実行フロー」 うん・・?

ワークフロー実行フロー

なお、AAP のワークフロービジュアライザー上の表示は以下のとおりです。これを再現したかった、という話です。

ワークフロービジュアライザー上の表示

補足: エラー集

試行錯誤中に遭遇したエラーと対応についてです。

TypeError: fetch failed

VS Code から MCP サーバーへの疎通性がない状態では、VS Code の [出力] パネルで以下のエラーが発生しました。 (あまりきれいに切り分けできていませんが、証明書検証が失敗する場合でもこのエラーになるかもです。)

2026-01-22 10:12:23.954 [info] 接続状態: エラー Error sending message to https://<AAP>:8448/mcp/inventory_management: TypeError: fetch failed

正しく疎通が取れるようにして対策します。

トークン誤りの場合

mcp.json に指定する AAP API トークンが誤っているときは以下のエラーが表示されました。

2026-01-22 10:55:05.667 [info] 400 status sending message to https://48.218.140.169:8448/mcp/inventory_management, will attempt to fall back to legacy SSE
2026-01-22 10:55:05.737 [info] 接続状態: エラー 404 status connecting to https://48.218.140.169:8448/mcp/inventory_management as SSE: Session not found

ほかにも、7.5. Troubleshooting Ansible MCP server errors というページにトラブルシューティングがまとまっているので参考になります。

※ 本記事とは関係ないですが、最近は IP アドレスベースで証明書が作成できるようになったみたいですね

5. 感想・おわりに

ということで、自然言語で AAP を操作することをいくつか試してみました。

設定や実行よりも、むしろ参照系の操作のほうが活用のシーンはあるかもしれない、と今のところは思っています。とってきた情報をいろいろと加工できるためです。

もちろん「API を叩く処理を作りこめば普通に実現できる話だ」という見方もあります。しかし、作りこまなくても自然言語で、かつ、実現したい人が今その場で操作できる、というのが一つのポイントかなと感じました。操作の性質によるのが大前提ですが。

たとえばトラブルシューティングの場面では、エスカレーションすることなくオペレーター側で原因を解消、または切り分けを進められるような。

また、今回は権限をゆるくしたことと頼み方のイマイチさによって、意図せずワークフロージョブテンプレートが実行されてしまいした。頼み方(プロンプト)は制御しにくいと思うので、改めて権限を適切に管理、設定することの重要さを感じました。

現状は Technology preview 扱いであるものの、活用の幅は広そうだと感じるモノでした。引き続き情報をウォッチしていきたいと思います。

参考(再掲)

docs.redhat.com

www.youtube.com

github.com

[Ansible/AAP] ボタンぽちっ、で準備できる AAP のサンドボックスを触ってみた

はじめに

以前、@rhdevelopers のポストで知ったのですが、Red Hat 社提供の AAP のサンドボックスがあるようです。 学習と検証目的で30日間利用可。ライセンスは必要ですが、簡単に取得できるトライアルライセンスでもOKです。

Explore Ansible Automation Platform in a ready-to-use sandbox | Red Hat Developer

you can use to learn and experiment with for 30 days

ということで触ってみました。

サンドボックス管理画面へのログイン

Explore Ansible Automation Platform in a ready-to-use sandbox にある「Access the Developer Sandbox」というボタンを押して、続いて Red Hat アカウントでログインします。

Access

https://sandbox.redhat.com/ からでもいいと思います)

プロビジョニング

サンドボックス管理画面から明示的にプロビジョニングする必要があります。AAPの「Provision」をクリックします。

プロビジョニング

プロビジョニングには30分かかると記載がありますので、気長に待ちます。

プロビジョニング中

起動とログイン

プロビジョニングが完了すると、「Launch」ボタンが表示されるのでクリックします。

起動

すると、ユーザー情報などが表示される画面になりますので、控えておき「Get Started」をクリックします。

起動画面

開くと、見慣れたサブスクリプション適用画面になりますので、手持ちのライセンスを適用します。

サブスクリプション適用画面

※ もし手持ちのライセンスがなければ「trial subscription」のリンクからライアルライセンスを取得して、取得時の Red Hat アカウント情報を「Username and Password」タブで入力すると、下のコンボボックスにトライアルライセンスが表示されるようになるので選択します。

無事にログインできました。

ログイン後

EDA (Event-Driven Ansible)や Private Automation Hub も含まれる構成ですね。

気になるところチェック

バージョンはこちら。AAP 2.6 でした。新しいです。

バージョン

既存のジョブテンプレートは「Demo Job Template」のみ。いつも通りですね。

ジョブテンプレート一覧

試しに実行したところ、無事に完了しました。

ジョブテンプレート実行結果

なお、30日間ずっと稼働しているわけではなく、数時間放置していると

Notice: Your workload in namespace hogehoge has been idled

というメールが来て、一時停止状態になるようです。その場合、サンドボックス管理画面はから「Reprovisioning」ボタンをクリックしてまたしばらく待ちます。試す限り、一時停止前に実行したジョブのログは残っていました。

インタラクティブラボとの比較

学習用途で利用できる環境としては、他にもインタラクティブラボがあります。本記事でご紹介したサンドボックスとは以下の違いがあります。

サンドボックス(本記事で紹介 ) インタラクティブラボ
ライセンス 必要(トライアルライセンス可) 不要
自由度 高い 低い
学習コンテンツ やや少ない(サンドボックス説明ページの左から追える) 多い(一覧
利用期間 30日間 数時間?(次回起動時はリセット)

使い分けとしては、ざっくり以下の通りかなと思います。

おわりに

ライセンスが必要とはいえ、これで30日使えるのはありがたいです。

インタラクティブラボと合わせて、実際に動かせる環境が準備されているのは非常にありたがたいです。

[Ansible] network_cli で libssh を利用する場合 KexAlgorithms などを変数でも指定できる

はじめに

Ansible からネットワーク機器に ansible.netcommon.network_cli コネクションプラグイン)で接続するに、内部的に paramiko を利用するか libssh を利用するかを ssh_type オプションで選択できます。

このうち、 libssh を利用する場合(ansible.netcommon.libssh)、変数で指定できる SSH クライアントの設定(KexAlgorithms など)が増えてきています。たとえば、ansible.netcommon コレクションの 8.2.0 の CHANGELOG では、key_exchange_algorithms の設定項目ができた旨の記述があります。

~/ssh/config に指定すれば手動の ssh コマンドでも反映されて共通化できてこれはこれでよいですが、もし ~/ssh/config ではなく Ansible で閉じた世界(変数)で指定したい場合に便利です。

試したら確かにできたので、簡単ですが変数のサンプルを掲載します。

  • 検証環境
    • ansible-core 2.16.15
    • ansible-pylibssh 1.3.0
    • ansible.netcommon 8.2.0

変数による KexAlgorithms などの指定

例えば、Ansible からネットワーク機器に対して接続したときに以下のエラーになった場合、 ~/ssh/configKexAlgorithms を設定したりすると思います。

fatal: [ios01]: FAILED! => {"changed": false, "msg": "ssh connection failed: ssh connect failed: kex error : no match for method kex algos: server [diffie-hellman-group14-sha1], client [curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group18-sha512,diffie-hellman-group16-sha512,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256]"}

この手の設定を ~/ssh/config ではなく、変数でも指定できるという話です(厳密には ansible.cfg環境変数でも)。

指定できる設定の一覧は ansible.netcommon.libssh のキュメントのパラメーター一覧で雰囲気がつかめます。

たとえば、 ~/ssh/config で以下の設定をする場合。

Host hogehoge
   KexAlgorithms diffie-hellman-group14-sha1
   HostKeyAlgorithms ssh-rsa
   PubkeyAcceptedKeyTypes ssh-rsa

変数だと以下のような指定になります。

---
ansible_libssh_hostkeys: ssh-rsa
ansible_libssh_key_exchange_algorithms: diffie-hellman-group14-sha1
ansible_libssh_publickey_algorithms: ssh-rsa

なお、上記の変数には含めていませんが、ansible_network_cli_ssh_type はデフォルトで auto です。ansible-pylibssh がインストールされていれば自動で libssh 扱いになります。逆に、ansible-pylibssh がインストールされていない場合は paramiko にフォールバックします(この場合は ansible_libssh_* 変数は利用できない)。

おわりに

~/ssh/config じゃない方法で設定を指定したい」というケースはあまり多くないかもしれませんが、いざというときに便利そうです。

[Ansible] ansible_date_time のようなトップレベルのファクト変数が非推奨になった (ansible-core 2.20.0 から)

はじめに

Ansible には、OSのバージョンやIPアドレスなどのシステム情報を収集する仕組みがあります。これらのシステム情報をファクト(fact / fatcs)と呼びます。

ファクトは、ansible_ というプレフィックスを持つ変数や、変数 ansible_facts の中に入る値として参照できます。たとえば時刻であれば、ansible_date_time というトップレベルの変数か、ansible_facts['date_time'] といった具合です。

もともとトップレベルの変数の仕様があって、どこかの Ansible のバージョンから ansible_facts['hoge'] でも参照できるようになったという経緯があります。

2025年11月にリリースされた ansible-core 2.20.0 では、トップレベルの変数としてのファクト(ansible_date_time など)の参照が非推奨(Deprecated)になりました。

  • ansible-core 2.20.0 の Changelog より引用
    • INJECT_FACTS_AS_VARS configuration currently defaults to True, this is now deprecated and it will switch to False by Ansible 2.24.

参照すると警告が表示されます。ansible-core 2.24 ではいよいよ利用できなくなる(変数未定義扱い)になる予定です。

実際、どのような警告が表示されるのか試してみたので、結果をまとめます。

  • 検証環境
    • ansible-core 2.20.0

検証 Playbook

以下のような Playbook を利用します。

ファクトを収集する必要があるので、gather_facts: false は指定しません。

---
- name: Facts test Play
  hosts: localhost
  connection: local

  tasks:
    - name: Facts test
      ansible.builtin.debug:
        msg: "{{ ansible_date_time }}"  # トップレベルの変数を参照

実行結果

実行結果は以下のとおりです。

ansible_date_time を参照している箇所が示され、プレフィックス ansible_ (トップレベル)ではなく、ansible_facts["fact_name"] を使ってねという警告が表示されました。エラーではなく警告なので、Playbook の処理自体は続行されました。

$ ansible-playbook -i localhost, facts_test.yml

PLAY [Facts test Play] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************************

ok: [localhost]

TASK [Facts test] *************************************************************************************************
[WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg.
[DEPRECATION WARNING]: INJECT_FACTS_AS_VARS default to `True` is deprecated, top-level facts will not be auto injected after the change. This feature will be removed from ansible-core version 2.24.
Origin: /home/sakana/ansible/ac220/facts_test.yml:10:14

 8     - name: Facts test
 9       ansible.builtin.debug:
10         msg: "{{ ansible_date_time }}"
                ^ column 14

Use `ansible_facts["fact_name"]` (no `ansible_` prefix) instead.

ok: [localhost] => {
    "msg": {
        "date": "2025-12-05",
        "day": "05",
        "epoch": "1764916154",
        "epoch_int": "1764916154",
        "hour": "15",
        "iso8601": "2025-12-05T06:29:14Z",
        "iso8601_basic": "20251205T152914982733",
        "iso8601_basic_short": "20251205T152914",
        "iso8601_micro": "2025-12-05T06:29:14.982733Z",
        "minute": "29",
        "month": "12",
        "second": "14",
        "time": "15:29:14",
        "tz": "JST",
        "tz_dst": "JST",
        "tz_offset": "+0900",
        "weekday": "Friday",
        "weekday_number": "5",
        "weeknumber": "48",
        "year": "2025"
    }
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

もちろん、ansible_facts['date_time'] を参照する場合は、警告なしで実行できます。

設定による制御

トップレベルの変数としてのファクトが参照できるのは、INJECT_FACTS_AS_VARSという設定が、現状(ansible-core 2.20.0現在)はデフォルトで True であるためです。

$ ansible-config dump | grep -i inject
INJECT_FACTS_AS_VARS(default) = True

この設定を False にすることで、トップレベルの変数としてのファクトが参照できなくなります。ansible-core 2.24 への備えにもなるかもしれません。

[defaults]
inject_facts_as_vars=False

ansible.cfg で設定する場合は、上記のような定義をしておき Playbook を実行すると、以下のような結果になります。

例の警告は表示されず、いきなり ansible_date_time という変数は未定義ですというエラーです。エラーなので処理も止まります。

$ ansible-playbook -i localhost, facts_test.yml

PLAY [Facts test Play] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************

ok: [localhost]

TASK [Facts test] **********************************************************************************************
[ERROR]: Task failed: Finalization of task args for 'ansible.builtin.debug' failed: Error while resolving value for 'msg': 'ansible_date_time' is undefined

Task failed.
Origin: /home/sakana/ansible/ac220/facts_test.yml:8:7

6
7   tasks:
8     - name: Facts test
        ^ column 7

<<< caused by >>>

Finalization of task args for 'ansible.builtin.debug' failed.
Origin: /home/yokochi/git/general/ansible/ac220/facts_test.yml:9:7

7   tasks:
8     - name: Facts test
9       ansible.builtin.debug:
        ^ column 7

<<< caused by >>>

Error while resolving value for 'msg': 'ansible_date_time' is undefined
Origin: /home/yokochi/git/general/ansible/ac220/facts_test.yml:10:14

 8     - name: Facts test
 9       ansible.builtin.debug:
10         msg: "{{ ansible_date_time }}"
                ^ column 14

fatal: [localhost]: FAILED! => {"msg": "Task failed: Finalization of task args for 'ansible.builtin.debug' failed: Error while resolving value for 'msg': 'ansible_date_time' is undefined"}

PLAY RECAP *****************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

おわりに

まだ警告レベルなので修正の緊急度は高くないですが、少なくとも今後書く際は ansible_facts["fact_name"] の形式がよいと思います。

ま余談ですが、こんなこともあろうかと(?)、「Ansible実践ガイド 第3版」から「Ansible 実践ガイド 第4版 [基礎編]」に改版するときに、ansible_facts['hogehoge'] の形式に書き換えています。

参考

[Ansible] 2025年の Ansible 関連リリースや動向まとめ

この記事は Ansible Advent Calendar 2025 の 24日目の記事です。

はじめに

2025年もまもなく終わりです。

ここ数年、自分のなかで定番化している、アドベントカレンダーのタイミングでその年の Ansible 関連のリリースや動向のまとめを書きます。

例年通り、ansible-core は 2回のバージョンアップがあり、さらに AAP 2.6 がリリースされました。ほか、コミュニティドキュメントの URL 変更もありました。

リリース

AAP 2.6 リリース

2025年10月に、AAP (Ansible Automation Platform) 2.6 がリリースされました。

個人的に一番大きなポイントは、バージョンアップやマイグレーションの情報がまとめられた点です。

docs.redhat.com

ひとつ前のバージョン、AAP 2.5 コンテナ版のデプロイ方式が GA となりましたが、当時は 2.4 からのバージョンアップや RRM版(VMに直接インストールする方式)からのマイグレーションに関する情報は限定的でした。2.6 のリリースに伴って上記のように、ドキュメントが増えました。2024年の 2.5 のリリース時にバージョンアップをためらった経緯がある場合には、朗報なのではないでしょうか。

リリースから 2 か月ほど経った現在(2025 年 12 月)、さらに情報が増えており、マイグレーションに関する公式のブログ記事が公開されています。

developers.redhat.com

他、以下の新機能が GA となりました。

  • Ansible Lightspeed intelligent assistant(AAPのAIチャットボット)
  • Ansible self-service automation portal(セルフサービス化するポータル)
  • Ansible Automation Dashboard(自動化効果を可視化するダッシュボード)

なお、2.6 リリース当時は「Ansible self-service automation portal」は、OpenShift によるデプロイが前提でしたが、後日公開された AAP 2.6 の FAQ の記事(以下に引用)によると、そうではないデプロイ方式にも対応するロードマップがあるようです。

Do you plan to make the self-service automation portal available on a RHEL 9 virtual machine or for other non-OCP containerized installations?

Yes, our roadmap includes adding this feature as part of the containerized installer for Ansible Automation Platform with the goal of making it available for all customers regardless of their deployment mechanism.

AAP 2.6 の FAQ の記事は、いろいろ気になることも載っていますのでおすすめです。

www.redhat.com

(参考)当ブログによるまとめ記事

tekunabe.hatenablog.jp

ansible-core 2.19 / Ansible 12 リリース

2025年7月に、ansible-core 2.19.0 がリリースされました。

例年、5月と11月のリリースですが、今回は大きい改修(後述)があったため、何度かリスケされました。

Ansible Community Package(pip install ansible でインストールされる一式)としても、ansible-core 2.19 系を含むバージョン 12 がリリースされました。

ansible-core 2.19 での大きな変更点は何といってもテンプレート処理の改修です。セキュリティやパフォーマンス向上のためだったようです。Jinja2 を使うこと自体は変わりませんが、今までの条件式がエラーになる場合があります。

ポーティングガイド(再掲)をご一読いただくことをおすすめします。

ほか、エラーメッセージが分かりやすくなったといううれしい点もあります。

ansible-core 2.19.0b6 時点での検証ですが、詳細は以下のスライドにまとめています。

www.docswell.com

なお、コントロールノード、マネージドノードともに、サポートする Python のバージョンには変更ありませんでした。

ansible-core バージョンとサポート Python バージョンの対応表:

https://docs.ansible.com/projects/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix

ansible-core 2.20 / Ansible 13 リリース

2025年11月に、ansible-core 2.20.0 がリリースされました。

Ansible Community Package (pip install ansible でインストールされるもの) としても、ansible-core 2.20 系を含む バージョン 13 が続いてリリースされました。

Play argument spec validation という、変数チェックに便利そうな機能が tech preview として導入されたり、意図しない挙動を生みかねないタグの指定時に警告が表示されるようになったりしました。

コントロールノードでは Python 3.12 以上、マネージドノードでは Python 3.9 以上が必要になりました。

ansible-core バージョンとサポート Python バージョンの対応表:

Releases and maintenance — Ansible Community Documentation

(参考)当ブログによるまとめ記事

tekunabe.hatenablog.jp

hashicorp.terraformhashicorp.vault コレクション登場

たとえば、Terraform であれば、これまで cloud.terraform コレクションがありました(もっと前は community.general コレクション内にモジュールあり)。

正確なタイミングは分からないのですが、2025年は以下のコレクションが登場しました。

  • hashicorp.terraform
  • hashicorp.vault

詳細: New Red Hat Ansible Certified Content Collections for HashiCorp Terraform and HashiCorp Vault

なお、AAP 2.6 の 標準的な EE のとある時点のイメージ registry.redhat.io/ansible-automation-platform-26/ee-supported-rhel9:1.0.0-1106 には、以下のコレクションが含まれていました。

cloud.terraform                 4.0.0       
hashicorp.terraform             1.1.0       
hashicorp.vault                 1.0.0 

microsoft.iis コレクション登場

IIS のサイトやアプリケーションを操作する microsoft.iis コレクションが登場しました。

Microsoft.Iis — Ansible Community Documentation

一部は、community.windows コレクションから移行したもののようです。

例: community.windows.win_iis_website モジュールは microsoft.iis.website モジュールに移行

詳細は、以下のマイグレーションガイドを参照してください。

Migration guide — Ansible Community Documentation

molecule で executor に ansible-navigator を指定可能に

試せてはいませんが、molecule 25.6.0 のリリースで、executor に ansible-navigator を指定できるようになったようです。

Add navigator as molecule playbook executor (#4457) @shatakshiiii

Release v25.6.0 · ansible/molecule · GitHub

Juniper 向けコレクションの統合

Juniper といえば、junipernetworks.junos コレクションというイメージが強かったかもしれませんが、実はもう一つ別に Juniper/ansible-junos-stdlib というリポジトリ で管理しているコレクション(現 juniper.device コレクション)があります。

junipernetworks.junos コレクションがアーカイブ予定になり、juniper.device コレクションに統合される流れになりました。juniper.device コレクション 2.0.0には、すでに旧 junipernetworks.junos コレクションのモジュールが含まれています。

(参考)当ブログによるまとめ記事

tekunabe.hatenablog.jp

Proxmox 系コレクションの独立(community.proxmox コレクション登場)

これまで Proxmox 系モジュールは community.general コレクションに含まれていました。

2025年5月にcommunity.proxmox コレクション 0.1.0 のリリースとして独立しました。

その後もアップデートが続いています。

community.general コレクションは、ごった煮感が強く、依存Pythonモジュール、システムパッケージの関係も複雑になりがちのようなので、独立するのは良い傾向なのだと思います。

その他

ドキュメント URL の変更

2025年11月、Ansible コミュニティドキュメントの Read The Docs への移行に伴い、URL が変更されました。

リダイレクトされるため直ちに致命的な影響はありませんが、今後は projects を含む URL を指定することをおすすめします。

(参考)当ブログによるまとめ記事

tekunabe.hatenablog.jp

AWX のリニューアル工事のその後

2024年、AWX は プラグイン 化や UI の切り離しなど、アーキテクチャ変更のための作業に入りました。この関係で、バージョン 24.6.1 以降のリリースは現時点ではありません。

Ansible Forum 上で、その後についての書き込みがありました。

forum.ansible.com

おわりに

2025年の Ansible 関連の気になったリリースや動向をまとめました。

今年は個人的には、影響度が大きめだった ansible-core 2.19.0 の変更点が印象的でした。

2026 年は何が起こるでしょうか。

現状 Fallible (実験的なAnsible)で実装が始まった、Register Projections という機能の行方は気になっています。順調であれば、来年 Ansible の機能に入ってきそうです。

endy-tech.hatenablog.jp

Happy Automation!

参考

Ansible Forum での今年のふりかえりの投稿

forum.ansible.com

書籍「ネットワーク図の描き方入門」は描き方も省略の仕方も学べて1年目に読みたかった

この記事は ネットワーク Advent Calendar 2025 の 22日目の記事です。

はじめに

2025年12月22日に「ネットワーク図の描き方入門 分かりやすさ・見やすさのルールを学ぶ」という書籍が発売されました。一部書店では先行発売されていたので先日さっそく購入しました。

bookplus.nikkei.com

著者 @corestate55 さんによる本書の紹介記事もありますので、ぜひご覧ください。

qiita.com

本ブログとしては、本書のいいなと思った点などの感想をまとめます。

全体的な印象としては「インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 第2版」や「インフラ/ネットワークエンジニアのためのネットワーク「動作試験」入門」のように、業務に携わらないと学びにくいジャンルを扱った貴重な書籍のように感じました。

全体

本書の全体に関する感想です。

大きくて図もたくさんで見やすい

最初に思ったのは、技術書としてはやや大きめであることです。「マスタリングTCP/IP 入門編」と同じ大きさです。

図を扱っている書籍なので、大きい方が見やすくてありがたいです。見開きでまたがっている大きな図もあるため、一覧性高く見渡せる紙の書籍の方が私にはあっていました(実際紙で購入)。

また、解説用のネットワーク図はもちろん、前提知識や原理原則についてのページについても図解がたくさんありました。

本書自体が、図や分かりやすさの有用性を示しているように感じました。

工夫の整理と新発見

極めて個人の視点になりますが、「そうそう、そうですよね!」という、自分も実施していた工夫が整理されて紹介されていたり、逆に「その手があったか!」という新しい発見もありました。(新発見については後述)

自分が関わる範囲外のネットワーク図は、あまり見れる機会がないため、いろんな工夫が知れてよかったです。

省略の工夫

図にはいろんな情報を詰め込もうとしてしまうかもしれませんが、本書ではメンテナンス性や見やすさを考慮して、「描かないこと」や省略する工夫も紹介されています。

たとえば、P141~142 では VLAN ポート名を示すテキストラベルを省略する理由が説明されています。固定的、自動的に決まるものだからわざわざ表記しない、という理由です。他にも、似たような理由で仮想スイッチの論理ポートの箱は描かない方針になっています(P144)。

キーワードは省略、圧縮。総じて、暗黙的に分かるものや人間が気にしなくていいものは描かないという感じでしょうか。

詳細は本書を見ていただきたいですが、P93からの「設計パターンを理解して省略する」もまさに省略の話です。

書籍のタイトルは「描き方」ですが、ある意味では「描かない工夫」も書かれているイメージです。

原理・原則を知れる

「第6章 構成図をさらにわかりやすくする」では、人間の認知特性とデータ可視化をベースにして、分かりやすさの原理原則が紹介されています。確かにそうだなと納得感がある内容で、応用が利きそうです。

とくに「人間には意識しなくても理解できる要素があること」(P177)は重要に感じました。このような、人間が自然と認知できる現象を活用しつつ、明示する必要があるもの(凡例など)を組み合わせることで、分かりやすい図ができるのだなと思いました。

描き方だけじゃなく、構成図の目的やネットワークの基礎も

単にネットワーク図の描き方だけではない点も特徴だと思いました。

「第1章 ネットワーク構成図って何?」では、ネットワーク構成図がどういうものか、どういう種類があるか、役割が説明されています。

また、「第2章 ネットワークの基礎知識」では、本書を読み進めるのに必要な範囲で、ネットワークの特徴、プロトコルトポロジーなどが説明されています。

そのため、ネットワーク初学者やネットワーク業務の現場が浅い方でも読める書籍になっているかなと思います。

描き方以外の設計論も

メインはネットワーク図の描き方ですが、設計論的な話も登場します。

新発見

本書を読んで、個人的に新たな発見だった点をいくつか抜粋してご紹介します。

線に対するラベルの置き方だけでもいろいろある

P74 にケーブルの線に対する「Gi0/1」のようなラベルの書き方についての記載があります。

私はあまり意識できていませんでしたが、線に合わせてラベルを添えるかどうか、線の上に置くかどうか、色々パターンがあるなと思いました。

直線と折れ線の使い分け

機器と機器を結ぶときに、直線にするか折れ線にするか迷うことはありませんでしょうか。私は言語化できるほど明確な理由で使い分けられていませんでした。

本書では P86 から、直線と折れ線の使い分けが紹介されています。

ルーティングの書き込み

私自身はほとんど盛り込んだことがなかったのですが、本書では論理構成図にスタティックルートのルーティングの情報も書き込まれていました(P115)。

物理・論理合成図

よく物理構成図、論理構成図は書きますが、本書では「物理・論理合成図」と呼ぶ図の書き方も紹介されていました。

私は、全体概要図として物理と論理の両方を書くことはありましたが、本書では物理的な機器の中に物理と論理の情報を詰めた、より細かい図でした。このスタイルの図は書いたことがなかったので新鮮でした。

完成図は P148-149。物理的なインターフェースとVLANなどが合わさった図になっています。

おわりに

「はじめに」でも書きましたが、業務に携わらないとなかなか身につけにくいジャンルを扱った書籍で、業務のおともに、とてもいい書籍だと思いました。

そいえば、RFC 8345 A YANG Data Model for Network Topologies が紹介されていたのは、テンションあがりました。

参考

(再掲) qiita.com

www.youtube.com

[2026/01/10 追記]

xtech.nikkei.com

[Ansible] Juniper 向けコレクションは juniper.device に統合。 junipernetworks.junos はアーカイブ予定

この記事は Ansible Advent Calendar 2025 の 10日目の記事です。

はじめに

2018年に、Ansible の Juniper ネットワーク機器向けの「モジュール」は2種類あるという記事を書きました。

その後、モジュールやロール、Playbook を束ねる「コレクション」という管理単位が導入され、Juniper 向けコレクションは 2つに分かれたままでした。

最近、メンテナンス性向上などの理由から統合の流れが始まりました。junipernetworks.junos コレクションの方がアーカイブ予定となり、juniper.device コレクションに統合されます。

たとえば、junipernetworks.junos.junos_command モジュールであれば、juniper.device.junos_command という指定になります。

詳細は以下の Ansible Forum の書き込みを参照してください。

forum.ansible.com

統合先は juniper.device コレクション

juniper.device コレクションは Juniper/ansible-junos-stdlib というリポジトリで管理されています。

このリポジトリもともとJuniper.junos 「ロール」が開発されていたリポジトリです。コレクション化する時に juniper.device「コレクション」を管理するリポジトリとなり、コレクションのバージョンは 1.0.0 に仕切り直したようです。

この juniper.device コレクションに、junipernetworks.junos コレクションが統合される形です。

すでに juniper.device コレクション 2.0.0では、junipernetworks.junos コレクションにあったモジュールが含まれています。そういう意味では統合が完了しているとも見れると思います。(長い目でみると junipernetworks.junos コレクションがなくなった段階で完了という見方もありそう)

また、Automation Hub 上でも juniper.device コレクションが公開されています。

console.redhat.com

AAP の標準の実行環境(EE) はどうなってるのか気になり、ひとつチョイスして registry.redhat.io/ansible-automation-platform-26/ee-supported-rhel9:1.0.0-1106 を見てみたら juniper.device コレクションは見当たりませんでした。

なお、juniper.device コレクション には、junipernetworks.junos コレクションにはなかった依存パッケージがある点は、少し留意が必要かなと思います。

例: junos-eznc や jsnapy

junipernetworks.junos コレクションはアーカイブ予定

Ansible Forum での案内によると、junipernetworks.junos コレクションはアーカイブ予定だそうです。アーカイブされると、リポジトリ上で新しい Issue や PR が受け付けられなくなり、当然新しいリリースもされません。

ただし、リリース済みの junipernetworks.junos コレクションが急に使えなくなるという訳ではありません。

forum.ansible.com

All previously published versions remain available on Ansible Galaxy and Automation Hub.

junipernetworks.junos コレクション側の「Deprecate junos collection and migrate to juniper.device #575」という PR には、README.md に以下の文言の追記が含まれていました。

This collection is deprecated and will be removed in version 12.0.0 (scheduled for October 30, 2027).

上記 PR ではモジュール類のコードが削除され、juniper.device コレクション側へのリダイレクトの定義が導入されます。これにより、junipernetworks.junos コレクション自身にはモジュール類のコードがないものの、junipernetworks.junos.* というモジュールの指定で、統合先の juniper.device.* へリダイレクトされる、ということになります。

    # ...(略)...
    junos_config:
      redirect: juniper.device.junos_config
      deprecation:
        warning_text: Please migrate to juniper.device namespace
        removal_version: "12.0.0"
    # ...(略)...

また、これまで Ansible community package(pip install ansible でインストールされる、ansible-core とコレクション一式)に、junipernetworks.junos コレクションが含まれていましたが、Ansible 14 (2026年5月リリース?) では含まれなくなる予定です。

逆に、Ansible community package に juniper.device コレクションが入る動きは現状(2025/12/10 現在)見当たりませんでした。

モジュールの指定方法と動作の関係は?

2つのコレクションのバージョンと、FQCN の指定方法、モジュール呼び出しの可否をまとめます。

なお今回は Playbook からの呼び出しではなく、ansible-doc junipernetworks.junos.junos_command のようにモジュールのドキュメントを表示する簡易的な確認方法にしました。

No. juniper.device junipernetworks.junos モジュールのFQCN指定 モジュール呼び出し 補足
1 未インストール 11.0.0 junipernetworks.junos.junos_command 普通に指定通り呼び出される
2 未インストール 11.0.0 juniper.device.junos_command 不可 juniper.device 未インストールのため
3 未インストール 12.0.0(仮) ※1 junipernetworks.junos.junos_command 不可 juniper.device.junos_command へリダイレクトしようとするが、juniper.device 未インストールのため
4 未インストール 12.0.0(仮) ※1 juniper.device.junos_command 不可 juniper.device 未インストールのため
5 2.0.0 未インストール junipernetworks.junos.junos_command 不可 junipernetworks.junos 未インストールのため
6 2.0.0 未インストール juniper.device.junos_command 普通に指定通り呼び出される
7 2.0.0 11.0.0 junipernetworks.junos.junos_command 普通に指定通り呼び出される
8 2.0.0 11.0.0 juniper.device.junos_command 普通に指定通り呼び出される
9 2.0.0 12.0.0(仮) ※1 junipernetworks.junos.junos_command juniper.device.junos_command へリダイレクト
10 2.0.0 12.0.0(仮) ※1 juniper.device.junos_command 普通に指定通り呼び出される

※1: junipernetworks.junos コレクション 12.0.0 は2027年リリース予定で現状リリースされていません。そのため今回は、junipernetworks.junos コレクション側の「Deprecate junos collection and migrate to juniper.device #575」という PR のリクエスト元の 2025/12/10 時点の最新コミットをインストールして試しました。今後動作が変更される可能性があります。

以下、さらに補足です。

実際は起こりにくいコレクションの組み合わせ

No.3、4 の組み合わせは実際は起こりにくいです。今回利用した「Deprecate junos collection and migrate to juniper.device #575」という PR では、galaxy.ymlに、"juniper.device": ">=2.0.0" という依存コレクションの定義があるためです。結果的に、junipernetworks.junos インストールと同時に juniper.device がセットでインストールされます(No.9、10の状態になる)。今回は事後に juniper.device を削除して No.3、4の環境を作りました。

juniper.device だけの状態で、junipernetworks.junos.* がリダイレクトされなかった件

No.5 で junipernetworks.junos.junos_command モジュールを呼び出せなかったのは意外でした。juniper.device コレクション 2.0.0 のリリースノートに以下の記述を、juniper.device だけインストールしておけば、junipernetworks.junos.* でもリダイレクトで呼び出せると解釈していたためです。

Support for playbooks with junipernetworks.junos namespace from the earlier Ansible's collection is provided using redirection in meta/runtime.yml.

確かにリポジトリ Juniper/ansible-junos-stdlibansible_collections/junipernetworks/junos/meta/runtime.ymlには、juniper.device.* へのリダイレクトが定義されていますが、あくまでjunipernetworks/junos 配下であり、このファイルは juniper.device をインストールしても手元に配置されませんでした。結果的に、このリダイレクトの定義は有効にならなかったということだのかなと思います。が、ちょっと自信がありません。

リダイレクト発生時の警告

No.9 のように、junipernetworks.junos.* から juniper.device.* へリダイレクトが発生する場合は、以下のような警告が表示されます。

[WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg.
[DEPRECATION WARNING]: junipernetworks.junos.junos_command has been deprecated. Please migrate to juniper.device namespace. This feature will be removed from collection 'junipernetworks.junos' version 12.0.0.

繰り返しますが、今回利用した未リリース、未マージの PRをインストールして試したので、挙動やメッセージは変更される可能性があります。

混乱を避けるため明示的に juniper.device.* を指定する方が望ましいでしょう。

おわりに

統合前後は少しややこしい点はありますが、1つにまとまること自体は分かりやすいので、そのうち気にならなくなるかなと思います。

参考

詳細(再掲)

forum.ansible.com