1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ansible】NetBoxのホスト情報をインベントリとして使用したい~ansible-navigator編~

Last updated at Posted at 2025-09-05

はじめに

Excelでのインベントリ管理に疲れていませんか?機器が増えるたびにインベントリファイルを手で修正するのは大変かと思います。
以前の記事(【AWS】Amazon EC2にNetBoxコンテナを構築したい)でAWS上にNetBoxのコンテナ環境を構築しました。
今回はその環境を使い、NetBoxに登録されたデバイスの情報をAnsibleのインベントリとして動的に使用します。
これができるようになると、インベントリ管理を 「信頼できる唯一の情報源(SSoT)」であるNetBoxに一元化 し、手動でのインベントリファイル更新作業から解放されます。この記事では、NetBoxに登録済みのメーカー(manufacturers)が異なるデバイスの情報を、Ansible Playbookで取得する方法を解説します。

TL;DR

この記事を読めば、以下のことができるようになります

  • NetBoxをAnsibleの動的インベントリとして利用する方法
  • netbox.netbox.nb_inventoryプラグインを使い、デバイス情報をメーカー(manufacturers)などの属性で自動的にグループ化する方法
  • NetBoxから取得してグループ化されたホストに対し、group_varsを使ってそれぞれ異なる接続情報を割り当てる方法

前提条件

  • NetBoxで以下が作成済みであること
    • APIトークン: NetBoxへのAPIアクセスに必要です

    • デバイス: 以下のデバイスが作成済みであること(未記載の情報の設定は任意)

      device manufacturers IP Address(※1)
      cisco01 cisco 192.168.0.1/24
      cisco02 cisco 192.168.1.1/24
      juniper01 juniper 192.168.2.1/24
      juniper02 juniper 192.168.3.1/24

      ※1:IP AddressはプライマリIPに設定しておくこと

実行環境

  • NetBox: v4.2.8
  • Ansible実行環境

詳細

1. サンプル実装

フォルダ構成

なるべく最小構成にしたいので以下のようにしました。これはAnsibleプロジェクトの基本的な構成でもあるため、他の場面でも応用できます。

  • :file_folder: inventory
    • :file_folder: group_vars
      • :page_facing_up: manufacturers_cisco.yml
      • :page_facing_up: manufacturers_juniper.yml
    • :page_facing_up: inventory.yml
  • :page_facing_up: display_host_info.yml
  • :page_facing_up: ansible-navigator.yml

補足説明

  • inventory.yml:NetBoxへの接続情報と、取得したホストをどのようにグループ分けするかを記載したファイル
  • manufacturers_cisco.yml:manufacturers_ciscoグループ専用の変数を記載したファイル
  • manufacturers_juniper.yml:manufacturers_juniperグループ専用の変数を記載したファイル
  • display_host_info.yml:Netboxから取得した情報を表示するPlaybook
  • ansible-navigator.yml:ansible-navigatorの設定ファイル

inventory.yml

今回の記事で一番大事なのがこのファイルです。このファイルに記載された内容に応じてAnsibleはNetBoxにアクセスし、必要な情報の取得・分類を実施します。
書き方の詳細は、netbox.netbox.nb_inventory inventoryを参考にして下さい。
今回作成したファイルのポイントは下記の通りです。

  1. pluginnetbox.netbox.nb_inventoryを指定するので、実行環境にはnetbox.netbox Collectionが必要となる
  2. group_byに指定した項目で、NetBoxに登録されたデバイスがインベントリでグループ化される
    • グループ名は、<group_byに指定した項目>_<デバイスの設定>になる
    • 例)manufacturersciscoのデバイスは、インベントリでmanufacturers_ciscoグループ所属になる
    • 他にもサイトやデバイスロールなど、NetBoxの様々な情報でグループ化が可能です
---
plugin: netbox.netbox.nb_inventory
api_endpoint: http://XXX.XXX.XXX.XXX    # NetBoxのURL
token: netbox_token                     # NetBoxのAPIトークン
group_by:
  - manufacturers

manufacturers_cisco.yml

manufacturers_ciscoグループが使用する変数です。
以下はサンプルであり、実際にcisco機器にアクセスする場合はこれ以外の変数も必要なのでご注意ください。

---
ansible_user: cisco_user
ansible_password: cisco_password

:bulb: group_varsの仕組み
Ansibleは、inventory/group_vars ディレクトリ配下に <グループ名>.yml というファイル名で変数ファイルを置くと、そのグループに所属するホストに対して 自動的に変数を読み込んでくれます

manufacturers_juniper.yml

manufacturers_juniperグループが使用する変数です。
以下はサンプルであり、実際にjuniper機器にアクセスする場合はこれ以外の変数も必要なのでご注意ください。

---
ansible_user: juniper_user
ansible_password: juniper_password

display_host_info.yml

NetBoxから取得したホスト情報を表示するPlaybookです。
UsernamePasswordは、manufacturersに応じて変化します。
詳細は、後述の2. コマンド実行で確認してください。

---
- name: Display host info
  hosts: all
  gather_facts: false
  tasks:
    - name: Debug
      ansible.builtin.debug:
        msg:
          - "Hostname: {{ inventory_hostname }}"    # NetBoxのデバイス名が自動で設定されます
          - "IP Address: {{ ansible_host }}"        # NetBoxのプライマリIPが自動で設定されます
          - "Username: {{ ansible_user }}"          # group_vars/manufacturers_cisco.yml などから読み込まれます
          - "Password: {{ ansible_password }}"      # 同上

ansible-navigator.yml

ansible-navigator.ymlについては、最低限の記述をしています。
書き方については、ansible-navigator settingsを参照してください。

---
ansible-navigator:
  execution-environment:
    container-engine: docker
    enabled: true
    image: netbox-ee:tag
    pull:
      policy: never
  mode: stdout

2. コマンド実行

インベントリの確認

ansible-navigator inventoryコマンドでホストの情報を取得します。
inventory.ymlgroup_bymanufacturersを指定したことで、メーカーごとにグループ分けされているのがわかります。

$ ansible-navigator inventory -i inventory/inventory.yml --graph
@all:
  |--@ungrouped:
  |--@manufacturers_cisco:
  |  |--cisco01
  |  |--cisco02
  |--@manufacturers_juniper:
  |  |--juniper01
  |  |--juniper02

ホスト情報表示用Playbook(display_host_info.yml)実行

Playbookを実行すると、AnsibleはNetBoxに登録されたホストが所属するグループ
(manufacturers_cisco/manufacturers_juniper)に応じて、グループ変数の内容(今回はansible_userとansible_password)を識別していることがわかります。

$ ansible-navigator run display_host_info.yml -i inventory/inventory.yml 

PLAY [Display host info] *******************************************************

TASK [Debug] *******************************************************************
ok: [cisco01] => {
    "msg": [
        "Hostname: cisco01",
        "IP Address: 192.168.0.1",
        "Username: cisco_user",
        "Password: cisco_password"
    ]
}
ok: [cisco02] => {
    "msg": [
        "Hostname: cisco02",
        "IP Address: 192.168.1.1",
        "Username: cisco_user",
        "Password: cisco_password"
    ]
}
ok: [juniper01] => {
    "msg": [
        "Hostname: juniper01",
        "IP Address: 192.168.2.1",
        "Username: juniper_user",
        "Password: juniper_password"
    ]
}
ok: [juniper02] => {
    "msg": [
        "Hostname: juniper02",
        "IP Address: 192.168.3.1",
        "Username: juniper_user",
        "Password: juniper_password"
    ]
}

PLAY RECAP *********************************************************************
cisco01                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
cisco02                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
juniper01                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
juniper02                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

さいごに

今回は、NetBoxに登録されたデバイス情報をAnsibleの動的インベントリとして利用する方法をご紹介しました。inventory.ymlgroup_byを指定するだけで、デバイスの属性に基づいて簡単にホストをグループ化し、それぞれのグループに異なる変数を適用できることがおわかりいただけたかと思います。
これにより、インベントリ情報を「信頼できる唯一の情報源(Single Source of Truth)」であるNetBoxに集約でき、手作業でのインベントリファイル管理の手間を大幅に削減できます!
この記事をきっかけに、ぜひあなたの環境でもネットワーク自動化の第一歩を踏み出してみてください。

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?