「サーバーはコード化した。でも、スイッチは手動ですか?」
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、Windows Serverの自動化について解説しました。
さて、サーバーの構築はAnsibleで爆速になりました。
しかし、そのサーバーを繋ぐ「ネットワーク機器(スイッチ、ルーター、ファイアウォール)」はどうでしょうか?
「VLANの設定変更依頼? あー、ネットワーク担当のAさんがExcelの台帳を見ながら、TeraTermマクロで来週やるって」
…これでは、ビジネスのスピード感が台無しです。
先生、耳が痛いです。
実は僕、Ciscoのコマンドとか全然詳しくなくて。
「enable って何?」レベルなんですけど、Ansibleなら勝手にやってくれるんですか?
あと、Pythonが動かないスイッチにどうやってAnsibleが命令するんですか?
いい質問ね。
ネットワーク機器はサーバーと違ってPythonが動かないから、Ansibleの動作原理が少し違うの。
でも安心して。Ansibleには主要なベンダー(Cisco, Juniper, Aristaなど)に対応したモジュールが揃っているわ。
これを使えば、ベンダーごとのコマンドの違いを意識せずに、「VLAN 10を作れ」と命じるだけで設定完了よ!
本記事では、AlmaLinux 9 をコントロールノードとし、ターゲットとなるネットワーク機器(Cisco IOS / Juniper Junos)に対して、設定変更やConfigバックアップを自動化する手順を徹底解説します。
🚀 Ansible応用講座(全8回)
現在地:【第7回】ネットワーク機器の自動化。Cisco/Juniperスイッチの設定管理
- 【第1回】静的ファイルは捨てろ。Dynamic InventoryによるAWS/クラウド環境の自動追従
- 【第2回】ロジックを極める。Loop制御、Block例外処理、Jinja2フィルタの魔術
- 【第3回】爆速化チューニング。Forks、Pipelining、Mitogenによるパフォーマンス改善
- 【第4回】標準機能で足りないなら。PythonによるCustom Module開発入門
- 【第5回】品質を保証する。MoleculeによるRoleの自動テストとCI連携
- 【第6回】Windowsも支配する。WinRM接続とPowerShell操作の完全ガイド
- 【第7回】ネットワーク機器の自動化。Cisco/Juniperスイッチの設定管理
- 【第8回】新時代の実行環境。Ansible Builder/RunnerによるExecution Environment (EE)
第1章:ネットワーク自動化の壁とAnsibleの仕組み
サーバー管理とネットワーク管理には、決定的な違いがあります。
1. エージェントレスの真価
LinuxサーバーならPythonスクリプトを送り込んで実行できますが、ネットワーク機器(スイッチやルーター)は独自のOSで動いており、Pythonをインストールしたりファイルを転送したりすることができません。
そこでAnsibleは、「ローカル(コントロールノード上)でモジュールを実行し、SSH経由でCLIコマンドを送信して、結果をパースする」という方式をとります。
2. network_cli 接続プラグイン
この通信方式を実現するのが ansible_connection: network_cli です。
通常のSSH接続(sftp使用)とは異なり、対話的なシェル操作を自動化するように振る舞います。
3. コレクションの導入
ネットワーク機器向けの機能は、各ベンダーが提供する「コレクション」として配布されています。
まずはこれらをインストールします。
# Cisco IOS用 ansible-galaxy collection install cisco.ios # Juniper Junos用 ansible-galaxy collection install junipernetworks.junos # 汎用ネットワークモジュール(念のため) ansible-galaxy collection install ansible.netcommon
第2章:インベントリと接続設定
ネットワーク機器への接続には、OS種類の指定など固有のパラメータが必要です。group_vars を使って定義します。
inventory.yml
all:
children:
switches:
children:
cisco_switches:
hosts:
switch01.example.com:
juniper_switches:
hosts:
switch02.example.com:
group_vars/cisco_switches.yml
ansible_connection: network_cli ansible_network_os: cisco.ios.ios ansible_user: admin ansible_ssh_pass: "CiscoPass123!" # 特権モード(enable)への昇格設定 ansible_become: yes ansible_become_method: enable ansible_become_pass: "EnablePass123!"
group_vars/juniper_switches.yml
ansible_connection: network_cli ansible_network_os: junipernetworks.junos.junos ansible_user: admin ansible_ssh_pass: "JuniperPass123!"
⚠️ 注意点:SSH鍵認証について
最近のネットワーク機器はSSH鍵認証にも対応していますが、設定が複雑な場合が多いため、まずはパスワード認証で疎通確認を行うのが定石です。
パスワードは第6回で学んだ Ansible Vault で暗号化しましょう。
第3章:Cisco IOSスイッチの操作 (cisco.ios)
まずは世界で最も普及している Cisco IOS の操作から始めます。
1. 情報収集 (Facts)
cisco.ios.ios_facts モジュールを使うと、機器のバージョンやシリアル番号、インターフェース情報などを構造化データ(JSON)として取得できます。
- name: Gather Facts
cisco.ios.ios_facts:
gather_subset: all
register: switch_facts
- name: Debug Facts
debug:
var: switch_facts
これで「バージョンごとの在庫管理」などが自動化できます。
2. 設定変更 (ios_config)
ios_config モジュールは、コンフィグモードに入って設定を変更します。
VLANを作成する例です。
- name: Create VLAN 100
cisco.ios.ios_config:
lines:
- name VLAN_Marketing
parents: vlan 100
# 実行前に差分があるか確認し、なければ実行しない(冪等性)
3. Configバックアップ (ios_config backup)
これが最も実用的な機能です。
設定変更をする前に、現在の running-config を自動でバックアップしてくれます。
- name: Save running-config with backup
cisco.ios.ios_config:
backup: yes
backup_options:
filename: "backup_{{ inventory_hostname }}_{{ ansible_date_time.iso8601 }}.cfg"
dir_path: ./backups/
定期実行(Cron + Ansible)すれば、Git管理されたコンフィグ自動バックアップシステムの完成です。
第4章:Juniper Junosスイッチの操作 (junipernetworks.junos)
JuniperなどのモダンなOSは、「設定を変更して、コミット(Commit)して初めて反映される」という仕組みを持っています。
Ansibleもこれに対応しています。
設定変更とコミット (junos_config)
- name: Configure Interface
junipernetworks.junos.junos_config:
lines:
- set interfaces ge-0/0/1 unit 0 family inet address 192.168.1.1/24
comment: "Configured by Ansible"
confirm: 5 # "commit confirmed 5" と同等!
プロの技: confirm オプションを指定すると、「設定反映後、一定時間内に確定操作がなければ自動ロールバック」されます。
これは、遠隔作業で設定ミスによりSSH接続が切れてしまった場合の命綱になります。
第5章:【実践】マルチベンダー対応Playbook
「CiscoとJuniperが混在している環境で、一括でSNMPサーバーの設定を入れたい」
そんな時は、group_vars と変数を活用して、ベンダーの差異を吸収します。
Playbook (setup_snmp.yml)
---
- name: Setup SNMP Server
hosts: switches
gather_facts: no
vars:
snmp_community: "public_ro"
tasks:
# Cisco用タスク
- name: Configure SNMP (Cisco)
cisco.ios.ios_config:
lines:
- snmp-server community {{ snmp_community }} RO
when: ansible_network_os == 'cisco.ios.ios'
# Juniper用タスク
- name: Configure SNMP (Juniper)
junipernetworks.junos.junos_config:
lines:
- set snmp community {{ snmp_community }} authorization read-only
when: ansible_network_os == 'junipernetworks.junos.junos'
ansible_network_os 変数(インベントリで定義済み)を使って条件分岐することで、1つのPlaybookで複数ベンダーに対応できます。
第6章:冪等性と「Config差分」の扱い
ネットワーク自動化で最も難しいのが「冪等性の担保」です。ios_config モジュールは優秀で、「現在の設定と投入する設定を比較し、差分がある時だけコマンドを実行する」ように動きます。
Check Mode (Dry Run) の活用
本番適用前に「何が変わるか」を確認することは必須です。
ansible-playbook setup_snmp.yml --check --diff
--diff オプションをつけると、実際に投入されるコマンドや、コンフィグのBefore/Afterが表示されます。
これを見て、意図しない設定変更(全ポートシャットダウンなど!)が含まれていないかを確認します。
💡 プロの経験談:replace vs merge
Ansibleのネットワークモジュールには、設定の適用方法として merge(追加・修正)と replace(置き換え)などがあります。
デフォルトは merge ですが、ACL(アクセスコントロールリスト)などを管理する場合は、古いルールを消すために replace や overridden を使う必要があります。
ここを間違えると、「追加したつもりが全部消えた」という事故になるので、必ず --check で確認しましょう。
第7章:トラブルシューティング
ネットワーク特有のエラーと対策です。
Q1. “Connection timed out” で接続できない
原因: SSHが許可されていない、またはACLでブロックされている。
対策: 手動SSHで接続できるか確認してください。また、コントロールノードのIPが機器のACLで許可されているか確認してください。
Q2. “operation requires privilege escalation”
原因: Cisco機器で特権モード(Enable)に入っていない。
対策: インベントリ変数で ansible_become: yes と ansible_become_method: enable を設定してください。
Q3. タイムアウトエラー (Timeout)
原因: show tech-support のような大量の出力を返すコマンドを実行すると、Ansibleのデフォルトタイムアウト(10秒〜30秒)を超えてしまう。
対策: ansible.cfg または変数でタイムアウト値を延ばします。
ansible_command_timeout: 60 # 60秒に延長
まとめ:ネットワークも「インフラ」の一部である
お疲れ様でした!
これで、サーバーもネットワークも、すべてAnsibleで統合管理できるようになりました。
今回の重要ポイント:
- ネットワーク機器は
network_cliで接続し、エージェントレスで操作する。 - ベンダーごとにコレクション(cisco.ios, junipernetworks.junos)を使い分ける。
ios_configのbackup: yesは、お手軽かつ最強のバックアップ手段。--check --diffで、変更内容を事前確認する癖をつける。
「ネットワークは手動、サーバーは自動」という分断された運用は、ミスの温床です。
Ansibleで全てをコード化し、インフラ全体を一貫したポリシーで管理しましょう。
さて、ここまで来ると、Ansibleの実行環境自体も複雑になってきます。
Pythonのバージョン、ライブラリの依存関係、コレクションのバージョン…。
チームメンバー全員が同じ環境でAnsibleを実行するにはどうすればいいでしょうか?
次回、応用講座 最終回となる第8回は「新時代の実行環境。Ansible Builder/RunnerによるExecution Environment (EE)」です。
Ansibleの実行環境そのものをコンテナ化(Execution Environment)し、どこでも同じ環境でPlaybookを実行できる最新技術について解説します。
Ansibleの未来へ、最後のステップです。お楽しみに!
▼ ネットワーク自動化を体感する ▼
GNS3やEVE-NGで実験
「VPS」で自分専用環境
NetOpsエンジニアへ
「ITエンジニア転職」

コメント