この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第55回です。
第6章では、Python・Ansible・API・Gitなどを使い、 ネットワーク運用や設定作業を自動化するための基礎を学びます。
Ansibleによる設定投入とは?ネットワーク機器を安全に自動設定する方法
1台ずつSSHでログインし、同じ設定を繰り返し投入する作業は、 台数が増えるほど時間とミスのリスクが大きくなります。 Ansibleを利用すると、設定内容をPlaybookとして記述し、 複数のネットワーク機器へ同じルールで設定を反映できます。 今回はCisco IOSを例に、Inventory、Playbook、設定投入、 バックアップ、差分確認、冪等性まで実務を意識して学びます。
前回の 「54. SSHによる情報取得」 では、ネットワーク機器へSSH接続し、情報を取得する考え方を学びました。
今回は一歩進み、 情報を見る側から、ネットワーク機器の状態を変更する側 へ進みます。
自動化で特に重要なのは「動けばよい」ではありません。 大量の機器へ一斉に設定できるからこそ、 対象機器、変更内容、バックアップ、差分、失敗時の停止条件 を明確にする必要があります。
この記事を読み終えるとできること
- Ansibleがネットワーク自動化で果たす役割を説明できる
- InventoryとPlaybookの違いを説明できる
- network_cliを使った接続構成を理解できる
- cisco.ios.ios_configで設定を投入できる
- 複数機器へ同じPlaybookを適用する考え方を理解できる
- バックアップと差分確認を組み込める
- 冪等性が重要な理由を説明できる
- 本番投入前に確認すべきポイントを整理できる
Ansibleとは何か
Ansibleとは、機器やサーバーに対して実行したい処理をコードとして定義し、 複数の対象へ自動的に適用するための自動化ツールです。
ネットワークエンジニアが手作業で設定変更を行う場合、 一般的には次のような作業を繰り返します。
- 対象機器へSSHでログインする
- 現在の設定を確認する
- コンフィグレーションモードへ入る
- 必要な設定を入力する
- 設定結果を確認する
- 設定を保存する
- 次の機器へログインする
2台程度であれば手作業でも対応できます。 しかし、20台、50台、100台と対象が増えると、 同じコマンドを何度も入力することになります。
Ansibleでは、こうした作業内容を Playbook に記述し、対象機器を Inventory で管理します。
Ansibleの価値は「コマンドを速く打てること」だけではありません。
「どの機器へ、どの設定を、どの条件で適用するか」を ファイルとして残し、同じ処理を再現できる点が重要です。
なぜネットワーク設定にAnsibleを使うのか
作業時間を短縮できる
複数機器に対して、同じ設定変更をまとめて実行できます。 台数が増えるほど手作業との差が大きくなります。
入力ミスを減らせる
検証済みPlaybookを利用することで、 機器ごとの手入力によるタイプミスを減らせます。
作業内容をコードで残せる
「何を変更したのか」がPlaybookとして残るため、 レビューや再利用がしやすくなります。
機器間の設定差異を抑えられる
NTP、Syslog、SNMPなど、 共通設定を一定のルールで展開できます。
手動作業とAnsibleを比較する
| 項目 | 手動SSH | Ansible |
|---|---|---|
| 対象台数 | 増えるほど作業量が増える | 複数台をまとめて処理できる |
| 入力 | 機器ごとにコマンドを入力 | Playbookへ処理を定義 |
| 再現性 | 作業者に依存しやすい | 同じPlaybookを再実行できる |
| レビュー | 手順書・ログで確認 | Playbook自体をレビューできる |
| 大量変更時の影響 | 作業は遅いが影響も段階的 | 速いが、誤設定も高速に広がる可能性がある |
自動化すると、誤設定まで自動化されます。
「自動化=安全」ではありません。 本番利用では、対象制限、レビュー、バックアップ、事前確認、 段階投入などを組み合わせる必要があります。
Ansibleによる設定投入の全体像
ネットワーク機器をAnsibleで操作する場合、 基本的にはAnsibleを実行する Control Node から対象機器へ接続します。
Ansibleからネットワーク機器へ設定を投入する流れ
Cisco IOSをSSH経由で操作する例では、
Ansibleの
ansible.netcommon.network_cli
接続を利用し、
Cisco IOS用Collectionのモジュールを使って処理します。
つまり、Ansibleが単純にキーボード入力を再現しているのではなく、 対象OSに対応したモジュールを使って処理を定義します。
Inventory・Playbook・Moduleを理解する
Ansibleを学ぶときは、 最初に次の4つを区別すると理解しやすくなります。
| 用語 | 役割 | ネットワークでの例 |
|---|---|---|
| Inventory | 操作対象を定義する | SW01、SW02、RTR01 |
| Playbook | 実行する処理をYAMLで記述する | インターフェースへdescriptionを設定する |
| Module | 具体的な機能を提供する | cisco.ios.ios_config |
| Variable | 機器ごとに変わる値を持つ | IPアドレス、hostname、VLAN番号 |
Inventory=誰に、Playbook=何をするか と覚えると分かりやすいでしょう。
検証環境を準備する
今回は、LinuxまたはWSL上のAnsible Control Nodeから、 SSHでCisco IOS系の検証機器へ接続する想定にします。
今回の検証構成
1.Ansibleを確認する
ansible --version
2.必要なCollectionを確認・導入する
ansible-galaxy collection list
ansible-galaxy collection install ansible.netcommon
ansible-galaxy collection install cisco.ios
Cisco IOS向けの
cisco.ios.ios_config
などは、Cisco IOS用Collectionに含まれています。
3.最初に手動SSHを確認する
ssh ansible@192.168.10.11
Ansibleで接続できない場合、 Ansibleの設定だけでなく、SSH、IP到達性、認証、 Enable権限なども確認する必要があります。
自動化を始める前に、 同じControl Nodeから手動SSHできること を確認しておくと、障害切り分けが容易になります。
Inventoryを作成する
最初に、Ansibleが操作する機器をInventoryへ登録します。
ここでは
inventory.yml
を作成します。
---
all:
children:
cisco_switches:
hosts:
sw01:
ansible_host: 192.168.10.11
sw02:
ansible_host: 192.168.10.12
vars:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
ansible_user: ansible
ansible_become: true
ansible_become_method: enable
各項目の意味
| 項目 | 意味 |
|---|---|
sw01 |
Ansible上で使用する機器名 |
ansible_host |
実際に接続するIPアドレスやホスト名 |
ansible_connection |
ネットワーク機器への接続方式 |
ansible_network_os |
対象ネットワークOS |
ansible_user |
SSH接続ユーザー |
ansible_become |
特権モードへの昇格を使用するか |
ansible_become_method |
Cisco IOSではenableを利用する例がある |
Inventoryを確認する
ansible-inventory -i inventory.yml --graph
イメージとして、次のように対象機器を確認できます。
@all:
|--@ungrouped:
|--@cisco_switches:
| |--sw01
| |--sw02
本番環境でパスワードをInventoryへ平文で直接書くことは避けます。
SSH鍵やAnsible Vaultなどを利用し、 認証情報をPlaybookやGitリポジトリへそのまま残さない設計にします。
Playbookを作成する
次に、SW01とSW02の
GigabitEthernet1/0/1
へdescriptionを設定するPlaybookを作ります。
ファイル名を
interface_description.yml
とします。
---
- name: Configure interface description
hosts: cisco_switches
gather_facts: false
tasks:
- name: Configure GigabitEthernet1/0/1
cisco.ios.ios_config:
parents:
- interface GigabitEthernet1/0/1
lines:
- description Uplink-to-Core
backup: true
Playbookを分解して理解する
hosts
hosts: cisco_switches
Inventoryで定義した
cisco_switches
グループを対象にします。
gather_facts
gather_facts: false
今回は通常のサーバー向けFacts収集を使用しないため、 falseとしています。
cisco.ios.ios_config
cisco.ios.ios_config:
Cisco IOSのコンフィグレーションを管理するためのモジュールです。
parents
parents:
- interface GigabitEthernet1/0/1
どの設定階層の下へコマンドを投入するかを指定します。
lines
lines:
- description Uplink-to-Core
インターフェース配下へ存在させたい設定を定義します。
backup
backup: true
設定変更前のrunning-configをバックアップするために使用します。
Playbookを実行する
InventoryとPlaybookを作成したら、
ansible-playbook
で実行します。
ansible-playbook \
-i inventory.yml \
interface_description.yml
正常に変更された場合、出力は次のようなイメージになります。
PLAY [Configure interface description] ****************
TASK [Configure GigabitEthernet1/0/1] *****************
changed: [sw01]
changed: [sw02]
PLAY RECAP *********************************************
sw01 : ok=1 changed=1 unreachable=0 failed=0
sw02 : ok=1 changed=1 unreachable=0 failed=0
changedの意味
changed=1
は、Ansibleの処理によって対象機器の状態に変更が発生したことを示します。
設定後は機器側でも確認します。
show running-config interface GigabitEthernet1/0/1
設定例:
interface GigabitEthernet1/0/1
description Uplink-to-Core
Playbookが成功したことと、業務通信が正常であることは別です。
自動化でも、設定確認だけでなく、 疎通確認やルーティング確認などの試験を行います。
複数機器へ異なる設定を投入する
自動化では、全機器へ完全に同じ設定を入れるだけではありません。
たとえば、機器ごとにインターフェースdescriptionを変える場合は、 Variableを利用できます。
Inventoryへ変数を持たせる
---
all:
children:
cisco_switches:
hosts:
sw01:
ansible_host: 192.168.10.11
uplink_description: Uplink-to-Core01
sw02:
ansible_host: 192.168.10.12
uplink_description: Uplink-to-Core02
vars:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
ansible_user: ansible
ansible_become: true
ansible_become_method: enable
Playbookから変数を参照する
---
- name: Configure uplink descriptions
hosts: cisco_switches
gather_facts: false
tasks:
- name: Configure description
cisco.ios.ios_config:
parents:
- interface GigabitEthernet1/0/1
lines:
- "description {{ uplink_description }}"
backup: true
同じPlaybookを利用しながら、 機器ごとに値を変更できるようになりました。
共通ロジックと機器固有値を分離する
実務では、IPアドレス、VLAN、NTPサーバー、 Syslogサーバーなどもデータとして分離して管理できます。
冪等性を理解する
Ansibleを理解するうえで重要な言葉が 冪等性(Idempotency) です。
同じ処理を繰り返し実行しても、 すでに目的の状態であれば不要な変更を行わない考え方です。
たとえば、すでに次の設定が存在するとします。
interface GigabitEthernet1/0/1
description Uplink-to-Core
Playbookでも同じ状態を要求している場合、 再実行時には変更が不要と判断されることが期待されます。
sw01 : ok=1 changed=0 unreachable=0 failed=0
なぜ冪等性が重要なのか
- Playbookを繰り返し実行しやすくなる
- 不要な設定変更を減らせる
- 現在状態と期待状態の差を意識できる
- 自動化処理の再現性を高められる
Cisco IOSでは、短縮コマンドではなく、 running-configに近い正式なコマンド表記 を使用することが重要です。
たとえば、
int Gi1/0/1
より
interface GigabitEthernet1/0/1
のような表記を利用します。
本番投入を安全にする方法
Ansibleで設定できるようになった後に、 さらに重要になるのが 安全に実行する設計 です。
1.対象機器を制限する
最初から全台へ投入せず、
--limit
を使って対象を限定する方法があります。
ansible-playbook \
-i inventory.yml \
interface_description.yml \
--limit sw01
まずSW01だけで確認し、問題がなければ対象を広げるという使い方ができます。
2.変更前にバックアップする
- name: Backup configuration
cisco.ios.ios_config:
backup: true
「自動化だからバックアップ不要」ではありません。 むしろ短時間で多数の機器を変更できるため、 バックアップと切り戻しの設計が重要になります。
3.差分を確認する
モジュールや処理内容が対応している場合は、 Ansibleのdiff機能を使って変更内容を確認できます。
ansible-playbook \
-i inventory.yml \
interface_description.yml \
--check \
--diff
--check
は本番投入前の確認に役立ちますが、
すべての処理が完全なシミュレーションになるとは限りません。
実機または検証環境での事前試験と組み合わせて利用します。
4.設定保存の扱いを決める
running-configをstartup-configへ保存する必要がある場合は、 保存方法もPlaybookで設計します。
- name: Configure interface
cisco.ios.ios_config:
parents:
- interface GigabitEthernet1/0/1
lines:
- description Uplink-to-Core
backup: true
save_when: changed
「設定投入」と「保存」を分けるのか、 同じPlaybookで実施するのかは、 運用ルールや切り戻し方針に合わせて決めます。
5.投入後の確認も自動化する
設定を入れて終了するのではなく、 必要に応じて状態確認もPlaybookへ組み込みます。
- name: Check interface configuration
cisco.ios.ios_command:
commands:
- show running-config interface GigabitEthernet1/0/1
- show interfaces GigabitEthernet1/0/1 status
register: result
- name: Show result
ansible.builtin.debug:
var: result.stdout_lines
設定投入と確認を一連の処理として考える ことが、実務の自動化では重要です。
Ansibleによる設定投入でよくある失敗
失敗1:いきなり全台を対象にする
Playbookの誤りがある状態で全台へ投入すると、 影響範囲も一気に拡大します。
検証機 → 本番1台 → 少数グループ → 全体、 のように段階的に展開します。
失敗2:Inventoryの対象を確認しない
Playbookが正しくても、 Inventoryのグループ分けが間違っていれば 意図しない機器を変更する可能性があります。
失敗3:パスワードをGitへ保存する
Inventoryやgroup_varsへ平文パスワードを書き、 そのままGitへcommitする運用は避けます。
失敗4:バックアップを取得しない
自動化でも障害は起こり得ます。 変更前状態へ戻せる準備が必要です。
失敗5:changedだけ見て成功と判断する
Ansibleの処理成功と、 実際の通信やサービス正常性は同じではありません。 業務要件に基づく試験が必要です。
失敗6:短縮コマンドを使う
running-configとの比較が正しく行えず、 毎回changedになるなど、 冪等性を崩す原因になることがあります。
設計・運用上の判断基準
Ansibleを業務へ導入するときは、 Playbookを書く技術だけでは不十分です。
「どこまで自動化するか」を設計する必要があります。
| 観点 | 確認する内容 |
|---|---|
| 対象 | どの機器・拠点・環境を自動化するか |
| 権限 | Ansible用アカウントにどこまで権限を与えるか |
| 認証情報 | SSH鍵やVaultなどをどう管理するか |
| レビュー | 誰がPlaybookを確認・承認するか |
| 検証 | 本番前にどの環境でテストするか |
| バックアップ | 変更前コンフィグをどこへ保存するか |
| 投入単位 | 一括か、機器・拠点単位で段階的に行うか |
| 失敗時 | 停止条件と切り戻し方法をどうするか |
| 証跡 | 実行者・Playbook・対象・結果をどう残すか |
自動化に向いている作業
- NTPサーバーの統一
- Syslog送信先の追加・変更
- SNMP設定の展開
- インターフェースdescriptionの統一
- 共通ACLの展開
- 設定バックアップ
- showコマンドによる状態確認
- 設定差分の検出
慎重に扱うべき作業
- 管理用IPアドレスの変更
- SSH経路そのものに影響する設定
- ルーティングプロトコルの大規模変更
- 全社WANの経路変更
- 機器再起動を伴う変更
- 遠隔拠点で切り戻し手段がない変更
AnsibleとのSSHセッションを切断するような設定を変更すると、 Playbook自身が途中で通信できなくなる可能性があります。
管理IP、ルーティング、ACL、AAAなどを変更する場合は、 特に切り戻し方法を検討します。
顧客・上司へAnsible導入を説明する方法
顧客にAnsibleを説明するとき、 「YAMLでネットワーク機器を操作できます」 だけでは価値が伝わりにくいでしょう。
技術ではなく、 業務上の効果 に変換して説明します。
説明例
現在は50台のスイッチへ同じ設定変更を手作業で実施しています。 Ansibleを利用すると、検証済みの設定内容をPlaybookとして管理し、 対象機器へ共通の手順で適用できます。
これにより、作業時間の短縮だけでなく、 機器ごとの設定漏れや入力ミスを減らし、 実施した変更内容をコードとして残せるようになります。
一方で、一括変更による影響を抑えるため、 本番では事前バックアップ、レビュー、 対象機器の限定、段階投入を組み合わせます。
技術をビジネス価値へ変換する
| 技術 | 顧客へ伝える価値 |
|---|---|
| Playbook | 作業手順を標準化・再利用できる |
| Inventory | 対象機器を一元管理しやすくなる |
| 冪等性 | 不要な変更を抑えやすい |
| Gitとの連携 | 変更履歴やレビューを管理しやすい |
| 自動バックアップ | 変更前状態を記録しやすい |
Ansibleでよく使う英語表現
| 英語 | 意味 | 実務でのイメージ |
|---|---|---|
| inventory | 対象機器一覧 | 管理対象ホストを定義する |
| playbook | 処理内容を記述したファイル | 作業手順をYAMLで定義する |
| task | 処理単位 | descriptionを設定する |
| module | 機能単位 | ios_configなど |
| idempotent | 冪等な | 繰り返しても不要な変更を行わない |
| backup | バックアップ | 変更前設定を保存する |
| diff | 差分 | 変更前後を比較する |
| configuration management | 構成管理 | 設定を一定の状態へ維持する |
公式ドキュメントを検索するときの例
Ansible Cisco IOS configuration
Ansible ios_config example
Ansible network_cli Cisco IOS
Ansible network automation inventory
Ansible ios_config backup
Ansible Vault network credentials
製品名とエラー内容を英語で組み合わせて検索できると、 公式ドキュメントやIssueへ到達しやすくなります。
理解度チェック
記事の内容を理解できたか確認してみましょう。
問題1.AnsibleのInventoryの役割として最も適切なものはどれですか。
- ネットワーク機器のOSをインストールする
- 操作対象となる機器やグループを定義する
- パケットをキャプチャーする
- ルーティングテーブルを自動生成する
解答を見る
Inventoryでは、Ansibleが操作するホストやグループ、 接続先などを定義します。
問題2.Playbookは主に何を定義するためのものですか。
- 実行する処理
- LANケーブルの種類
- ルーターのCPU性能
- ISPの契約情報
解答を見る
Playbookには「どの対象へ、どの処理を行うか」を YAML形式で記述します。
問題3.冪等性とは何ですか。
解答を見る
同じ処理を繰り返し実行しても、 すでに目的の状態になっていれば 不要な変更を行わないという考え方です。
問題4.本番環境で大量の機器へPlaybookを投入する前に行うべきことを3つ挙げてください。
解答例を見る
- 対象機器を確認する
- Playbookをレビューする
- 変更前コンフィグをバックアップする
- 検証環境で事前テストする
- 差分を確認する
- 最初は少数の機器へ投入する
- 切り戻し方法を確認する
問題5.Ansibleの実行結果が「changed=1」なら、業務通信も正常だと言い切れますか。
解答を見る
Ansibleタスクが成功したことと、 実際の通信やサービスが正常であることは別です。 投入後に疎通や状態確認を行う必要があります。
実践演習:2台のスイッチへNTP設定を投入する
最後に、簡単なネットワーク自動化を設計してみましょう。
要件
- 対象はSW01とSW02
- SW01:192.168.10.11
- SW02:192.168.10.12
- NTPサーバー:192.168.100.10
- Cisco IOSを使用
- SSHで接続
- 変更前にrunning-configをバックアップする
課題1.Inventoryを作る
解答例を見る
---
all:
children:
cisco_switches:
hosts:
sw01:
ansible_host: 192.168.10.11
sw02:
ansible_host: 192.168.10.12
vars:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
ansible_user: ansible
ansible_become: true
ansible_become_method: enable
課題2.NTP設定用Playbookを作る
解答例を見る
---
- name: Configure NTP
hosts: cisco_switches
gather_facts: false
tasks:
- name: Configure NTP server
cisco.ios.ios_config:
lines:
- ntp server 192.168.100.10
backup: true
save_when: changed
課題3.最初にSW01だけを対象にする
解答を見る
ansible-playbook \
-i inventory.yml \
ntp.yml \
--limit sw01
課題4.投入後の確認項目を考える
「Ansibleがfailed=0だった」以外に、 何を確認するべきでしょうか。
解答例を見る
- running-configにNTP設定が存在するか
- 想定外の設定差分がないか
- NTPサーバーへIP到達性があるか
- NTP同期状態が正常か
- 変更前バックアップが保存されているか
- 既存通信へ影響がないか
- startup-configへ必要な設定が保存されているか
課題5.障害ケースを考える
SW01では成功しましたが、 SW02だけ次の結果になりました。
sw01 : ok=1 changed=1 unreachable=0 failed=0
sw02 : ok=0 changed=0 unreachable=1 failed=0
SW02で確認すべき項目を考えてください。
解答例を見る
- 192.168.10.12へIP到達性があるか
- SSHサービスが有効か
- TCP/22がACLやファイアウォールで遮断されていないか
- InventoryのIPアドレスが正しいか
- SSHユーザーや認証方式が正しいか
- Control Nodeから手動SSHできるか
自分の言葉で説明する課題
上司から次の質問を受けました。
「SSHでコマンドを流すPythonスクリプトと、 Ansibleを使うのは何が違うの?」
1分程度で説明してください。
説明例を見る
PythonでSSH接続を自作すれば、 自由度の高い処理を作れます。 一方、AnsibleではInventoryで対象機器を管理し、 PlaybookとネットワークOS用モジュールを利用して、 「機器をどの状態にするか」を定義できます。
特に複数機器への共通設定、 冪等性を意識した構成管理、 Playbookのレビューや再利用を行いたい場合に Ansibleが使いやすいケースがあります。
逆に複雑なデータ処理や独自ロジックが必要な場合は、 Pythonの方が適する場合もあります。 目的に応じて使い分けます。
実務で使うならここまで考える
学習環境では、 「Playbookを書いて設定できた」 ところまででも十分な成果です。
しかし、実務でネットワーク自動化を担当するなら、 次の段階まで考えられると価値が高まります。
- 設定値をコードから分離する Inventory、group_vars、host_varsなどを使い、 共通処理と機器固有データを分けます。
- 認証情報を安全に管理する SSH鍵やAnsible Vaultなどを利用し、 パスワードを平文で管理しないようにします。
- GitでPlaybookを管理する 誰が、いつ、どの設定ロジックを変更したのかを追跡できるようにします。
- レビュー工程を作る 本番投入前にPlaybookと差分を別担当者が確認できるようにします。
- 投入後の検証まで自動化する showコマンドやAPIを利用して、 設定だけでなく状態まで確認します。
自動化の完成形は「設定コマンドを自動入力すること」ではありません。
設計、レビュー、バックアップ、変更、確認、履歴管理まで含めて 安全で再現可能な作業フローを作ることが重要です。
まとめ
- Ansibleを使うと、ネットワーク機器への設定処理を Playbookとして記述できる
- Inventoryでは対象機器、 Playbookでは実行する処理を定義する
- Cisco IOSをSSH経由で操作する場合、 network_cliとCisco IOS用Collectionを利用できる
-
cisco.ios.ios_configを使ってIOS設定を管理できる - Variablesを利用すると、 共通Playbookと機器固有値を分離できる
- 同じPlaybookを繰り返し実行するためには 冪等性を意識することが重要
- 本番では対象機器の確認、バックアップ、 差分確認、段階投入、事後確認を行う
- 自動化すると誤設定の展開も高速になるため、 安全設計が手作業以上に重要になる
Ansibleを使えること以上に、 「安全に自動化できる仕組みを設計できること」が 上級ネットワークエンジニアに求められるスキルです。
参考:公式ドキュメント
第6章では、Python、SSH、Ansible、REST API、JSON・YAML、 Git、テレメトリー、AIを使い、 ネットワーク運用を自動化・可視化する方法を学びます。

コメント