AWX で踏み台サーバーを経由してネットワーク機器に接続する方法

サムネイル

はじめに

こんにちは。ITインフラ本部 ネットワークグループの松野です。
ネットワークグループでは、AWX などを活用してネットワークの自動化に取り組んでいます。

本記事では、AWX を利用して踏み台サーバー(Bastion Host)を経由し、ネットワーク機器に接続する方法についてご紹介します。

AWX とは

AWX は、Ansible Tower のオープンソース版で、Ansible の管理・自動化を行うための Web インターフェースおよび API を提供するツールです。

踏み台サーバー経由で接続するケース

ネットワーク機器が以下のような環境にある場合、AWX から直接アクセスできないことがあります。

  • プライベートネットワーク内に配置されている
  • ファイアウォールの設定により、外部からのアクセスが制限されている
  • セキュリティポリシーによって、直接 SSH 接続することが禁止されている

このような場合は、踏み台サーバーを経由して SSH 接続することで、AWX からターゲットノードを操作できるようになります。

検証環境

AWX のバージョンは AWX 24.6.1 です。1

調査結果

AWX で踏み台サーバーを経由してネットワーク機器に接続する方法について調査したところ、以下のポイントがわかりました。

  • 踏み台サーバーとネットワーク機器の認証方式の組み合わせに注意
    認証方式の組み合わせによって、AWX のテンプレートに設定する認証情報の数が変わります。

    • 両方が同じ認証方式(例: ユーザーID / パスワード認証)の場合
      → AWX のテンプレート作成時に 認証情報を 1 つ設定すれば OK です。

    • 異なる認証方式(例: 踏み台サーバーは SSH 秘密鍵認証、ネットワーク機器は ユーザーID / パスワード認証)の場合
      踏み台サーバー用とネットワーク機器用の 2 つの認証情報を設定する必要があります。

  • AWX でネットワーク機器にログインする際の認証情報設定の制約

    • network_cli を利用してネットワーク機器に接続する場合、ユーザーID / パスワード認証をするには、「認証情報タイプ」として 「マシン」 を選択する必要があります。
    • ただし、AWX ではテンプレートに 同じ「認証情報タイプ」を 1 つしか設定できない という制約があります。

    🔹 注意点

    • netconf および network_cli は、認証情報タイプが 「マシン」 になります。
    • そのため、例えば 踏み台サーバーとネットワーク機器の両方でユーザーID / パスワード認証を使用したい場合、設定の工夫が必要 です。
    • provider を使用したローカル接続であれば、複数の認証情報タイプを指定できます。

    📌 参考
    詳細は Ansible Tower ユーザーガイド(ネットワーク) を参照してください。

  • 踏み台サーバーを適用する対象について

    • プロジェクト全体に適用する場合は、ansible.cfg に設定します。
    • ホストごとに設定する場合は、インベントリのホスト設定に記述します。
  • Ansible Tower には "ジャンプホスト" という踏み台サーバーを設定する項目がありますが、AWX には存在しません。

設定内容について

本設定では、以下の認証方式を使用する手順を記載します。

  • 踏み台サーバーの認証方式
    • SSH 秘密鍵認証
  • ネットワーク機器の認証方式
    • ユーザーID / パスワード認証

ディレクトリ構造

本手順では、以下のファイルを使用します。

.
└── ansible
    ├── ansible.cfg
    └── main.yaml

設定方法

方法1: プロジェクト全体で適用する(ansible.cfg の設定)

ansible.cfg に以下を設定すると、プロジェクト内のすべてのホスト に踏み台サーバー経由の設定が適用されます。

手順1: ansible.cfg の設定

ansible.cfg に以下の設定を追加します。

[ssh_connection]
ssh_args = -o ProxyCommand="ssh -q -p {port} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p {username}@{踏み台サーバIP}"

各パラメータの説明は以下のとおりです。

パラメータ 説明 備考
{port} SSH のポート番号。22 の場合は -p の指定は不要 -
{username} 踏み台サーバーへのログインユーザー名 -
{踏み台サーバIP} 踏み台サーバーの IP アドレス -
StrictHostKeyChecking=no 初回接続時のホストキー確認を無効化し、「yes/no」の確認を省略 する 自動化の際に対話入力を不要にするため
UserKnownHostsFile=/dev/null ホストキーを ~/.ssh/known_hosts に保存せず、常に新しい接続として扱う 踏み台サーバー経由の接続でホストキーの管理を簡略化し、エラーを防ぐため
-W %h:%p 踏み台サーバー経由でターゲットホストに接続するためのポートフォワーディング を設定 -

手順2: リモートリポジトリへのプッシュ

作成した ansible.cfg と Playbook を リモートリポジトリにプッシュ

手順3: AWX プロジェクトの作成

AWX のプロジェクトを作成します。
※ プロジェクトの詳細な設定方法については、本記事では扱いません。

AWXプロジェクト
AWX プロジェクトを作成する画面

手順4: 踏み台サーバーの認証情報を AWX に登録

AWX に 踏み台サーバーの認証情報(ユーザーID と秘密鍵) を登録します。

踏み台認証情報
「マシン」認証情報として、踏み台サーバーのユーザーIDと秘密鍵を登録する画面

手順5: ネットワーク機器の認証情報タイプを作成

AWX で network_cli を利用する場合、ネットワーク機器の認証情報として「マシン」認証情報タイプを設定する必要があります
しかし、テンプレートには 同じ認証情報タイプを 1 つしか設定できない ため、踏み台サーバーの認証情報と分けるために 認証情報タイプを作成 します。

※ 詳細については、認証情報タイプのネットワーク を参照してください。

  • 入力の設定
fields:
  - id: username
    type: string
    label: Username
  - id: password
    type: string
    label: Password
    secret: true
required:
  - username
  • インジェクターの設定
extra_vars:
  ansible_user: '{{ username }}'
  ansible_password: '{{ password }}'


ネットワーク機器認証タイプ
ネットワーク機器認証タイプを登録する画面

手順6: ネットワーク機器の認証情報を AWX に登録

AWX に手順5で作成した認証情報タイプを選んで ネットワーク機器の認証情報(ユーザーID とパスワード) を登録します。

ネットワーク機器認証情報
作成した認証情報タイプを使用し、ネットワーク機器のユーザーIDとパスワードを登録する画面

手順7: インベントリ を作成

インベントリを作成し、ホストを登録します。

ansible_host: {ネットワーク機器のIP}
ansible_network_os: {ネットワーク機器のOS}
ansible_connection: network_cli

パラメータの説明は以下のとおりです。

パラメータ 説明 備考
{ネットワーク機器のIP} ネットワーク機器の IP アドレス -
{ネットワーク機器のOS} ネットワーク機器の OS(例: Junos など) -

ホスト登録
ホストを登録する画面

手順8: テンプレートを作成

テンプレートで認証情報をマシンと作成した認証タイプを選択し2個入れます。 登録順番は関係ありません。

テンプレートに認証情報2個登録
テンプレートに認証情報2個を登録する画面

手順9: テンプレートを実行

作成したテンプレートを起動します。

テンプレートを実行
テンプレートを起動する画面

方法2: 特定のホストのみ踏み台サーバーを使用する(インベントリ設定)

プロジェクト全体ではなく、特定のホストだけ踏み台サーバーを経由する場合 は、インベントリのホスト変数に ansible_ssh_common_args を設定します。
この方法はホストごとに踏み台サーバーの使用を制御できます。

手順: 設定方法

リモートリポジトリへのプッシュ、AWX プロジェクトの作成、認証情報の登録などの手順は、方法1 と同じです。
ただし、この方法では ansible.cfg の設定は不要 なので、方法1の手順1はスキップ します。

また、方法1の手順7(インベントリ作成)の代わりに、以下の設定を追加 します。

ansible_host: {ネットワーク機器のIP}
ansible_network_os: {ネットワーク機器のOS}
ansible_connection: network_cli
ansible_ssh_common_args: '-o ProxyCommand="ssh -q -p {port} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p {username}@{踏み台サーバIP}"'

ansible_ssh_common_argsのパラメータの説明は以下のとおりです。

パラメータ 説明 備考
{port} SSH のポート番号。22 の場合は -p の指定は不要 -
{username} 踏み台サーバーへのログインユーザー名 -
{踏み台サーバIP} 踏み台サーバーの IP アドレス -

まとめ

本記事では、AWX で踏み台サーバーを経由してネットワーク機器に接続する方法 について解説しました。
特に、以下の 2 つの設定方法を紹介しました。

  1. プロジェクト全体で適用する方法 (ansible.cfg を使用)
    • ansible.cfgProxyCommand を設定すると、プロジェクト内のすべてのホスト で踏み台サーバーを経由した接続が可能になります。
  2. 特定のホストごとに適用する方法 (インベントリ を使用)
    • インベントリのホスト変数 (ansible_ssh_common_args) を設定すると、ホストごとに踏み台サーバーを使うかどうかを制御できます。

また、AWX で踏み台サーバー経由の接続をする際には、以下の点に注意が必要です。

  • 認証情報の設定
    • 踏み台サーバーとネットワーク機器の認証方式が同じ場合 は、AWX の認証情報を 1 つ設定すれば動作します。
    • 異なる認証方式の場合 は、踏み台サーバー用とネットワーク機器用の 2 つの認証情報を設定する必要があります。
    • network_cli を利用する場合、踏み台サーバーとネットワーク機器の認証情報タイプが同じだと、AWX のテンプレートに 2 つ登録できません。
      そのため、カスタム認証情報タイプを作成する必要があります。
  • テンプレートの設定
    • 「マシン」認証情報と作成したカスタム認証情報の両方を設定する必要があります。

どちらの方法を選ぶかは、運用環境に応じて適切に判断することが重要です。
プロジェクト全体で統一したい場合は ansible.cfg を使用し、ホストごとに設定を変えたい場合は インベントリ を活用しましょう。

これらを適切に設定することで、AWX を使ったネットワークの自動化を柔軟に行えるようになります。
環境に合わせて設定を工夫し、運用の自動化を進めていきましょう。


  1. AWX のバージョンが古いと、プロジェクトごとの ansible.cfg を読み込まない不具合がありました。そのため、2025年2月9日時点の最新版を利用しています。