【前回】Ansibleによるネットワーク機器の操作(1.インストール〜疎通確認【AWS】)
【次回】Ansibleによるネットワーク機器の操作(3.設定変更【AWS】)
Ansibleを利用し、コンフィグ情報やルーティング情報等のログを取得します。ネットワーク環境等の構成については、前回を参照してください。
ディレクトリの作成
以下の構成となるようにディレクトリを作成します。
mkdir get_log
cd get_log
mkdir files
mkdir log
mkdir -p roles/get_ios_command/tasks
mkdir -p roles/get_nxos_command/tasks
mkdir -p roles/save_cisco_command_logdir/tasks
ansible
└ get_log
├── files # 取得コマンドを記述したファイルを格納
├── log # 取得したログを格納
└── roles # メインのPlaybookから呼び出されるロール(子タスク)を定義
├── get_ios_command # ios用のコマンドを実行するロール(子タスク)を定義
│ └── tasks
├── get_nxos_command # nxos用のコマンドを実行するロール(子タスク)を定義
│ └── tasks
└── save_cisco_command_logdir # 取得したログを整形し保存するロール(子タスク)を定義
└── tasks
インベントリーファイルの修正
ルーター(Router)/スイッチ(Switch)/ネクサス(Nexus)のグループ毎に取得するコマンドを指定できるように、前回作成したインベントリーファイルを修正します。
vi net_hosts
[Router]
Router1 ansible_host=192.168.1.100
[Router:vars]
ansible_ssh_user=cisco
ansible_ssh_pass=cisco
ansible_become=yes
ansible_become_method=enable
ansible_become_pass=cisco
ansible_connection=network_cli
ansible_network_os=ios
commands_show=Router_show.txt # 追記
[Switch]
Switch1 ansible_host=192.168.1.101
[Switch:vars]
ansible_ssh_user=cisco
ansible_ssh_pass=cisco
ansible_become=yes
ansible_become_method=enable
ansible_become_pass=cisco
ansible_connection=network_cli
ansible_network_os=ios
commands_show=Switch_show.txt # 追記
[Nexus]
Nexus1 ansible_host=192.168.1.102
[Nexus:vars]
ansible_ssh_user=cisco
ansible_ssh_pass=Ciscopass1
ansible_become=yes
ansible_become_method=enable
ansible_become_pass=cisco
ansible_connection=network_cli
ansible_network_os=nxos
commands_show=Nexus_show.txt # 追記
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Playbookの作成
メインのPlaybook
ログを取得するためのPlaybookを作成します。
vi get_log.yml
- hosts: all
gather_facts: false
tasks:
- name: create time #ログ取得日時をYYYYMMDDhhmmss形式で取得
set_fact:
exe_date: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
run_once: true
- name: create parent directory#ログ格納ディレクトリ名を取得
set_fact:
logdir_date: "{{ inventory_dir }}/log/log_{{ exe_date }}"
run_once: true
- name: create directory for log #ログ格納ディレクトリを作成
file:
path: "{{ logdir_date }}/"
state: directory
register: logdir
delegate_to: localhost #ディレクトリ作成はローカルホスト上で実行
run_once: true
- name: Router section #Routerグループの場合の処理
hosts: Router
gather_facts: false
roles:
- { role: get_ios_command, when: "'Router' in groups and inventory_hostname in groups['Router']" }
- { role: save_cisco_command_logdir, when: "'Router' in groups and inventory_hostname in groups['Router']" }
- name: Switch section #Switchグループの場合の処理
hosts: Switch
gather_facts: false
roles:
- { role: get_ios_command, when: "'Switch' in groups and inventory_hostname in groups['Switch']" }
- { role: save_cisco_command_logdir, when: "'Switch' in groups and inventory_hostname in groups['Switch']" }
- name: Nexus section #Nexusグループの場合の処理
hosts: Nexus
gather_facts: false
roles:
- { role: get_nxos_command, when: "'Nexus' in groups and inventory_hostname in groups['Nexus']" }
- { role: save_cisco_command_logdir, when: "'Nexus' in groups and inventory_hostname in groups['Nexus']" }
ios用のコマンド実行ロール
ios用のロールを作成します。
vi roles/get_ios_command/tasks/main.yaml
- name: get ios_command_show
ios_command:
commands: "{{ item }}"
register: show_result
loop: "{{ lookup('file', 'files/{{ commands_show }}').splitlines() }}"
- name: set show results
set_fact:
show_results: "{{ show_result.results }}"
nxos用のコマンド実行ロール
nxos用のロールを作成します。
vi roles/get_nxos_command/tasks/main.yaml
- name: get nxos_command_show
nxos_command:
commands: "{{ item }}"
register: show_result
loop: "{{ lookup('file', 'files/{{ commands_show }}').splitlines() }}"
- name: set show results
set_fact:
show_results: "{{ show_result.results }}"
取得したログを整形・保存するロール
取得したログを整形し、保存するロールを作成します。
vi roles/save_cisco_command_logdir/tasks/main.yaml
---
- name: save show per hosts
blockinfile:
block: "{{ item.stdout[0] }}"
# path: "{{ logdir.path }}/{{ inventory_hostname }}_show.log"
path: "{{ logdir.path }}/{{ inventory_hostname }}_show_{{ exe_date }}.log"
marker: "====================== {{ item.item }} ======================="
create: yes
loop: "{{ show_results }}"
loop_control:
label: "{{ item.item }}"
実行コマンドファイルの作成
グループ毎に取得するコマンドを記載したファイルを作成します。
vi files/Router_show.txt
show clock
show run
show version
show ip int brief
show ip route
show log
vi files/Siwtch_show.txt
show clock
show run
show version
show int status
show mac address-table
show log
vi files/Nexus_show.txt
show clock
show run
show version
show ip int brief
show ip route
show logging
Playbookの実行
作成したインベントリーファイルを指定してPlaybookを実行します。
ansible-playbook -i net_hosts log_get.yml
[ec2-user@ip-10-0-0-100 get_log]$ ansible-playbook -i net_hosts get_log.yml
PLAY [all] *********************************************************************************************************************************************************************************************
TASK [create time] *************************************************************************************************************************************************************************************
ok: [VPN-Router]
TASK [create parent directory] *************************************************************************************************************************************************************************
ok: [VPN-Router]
TASK [create directory for log] ************************************************************************************************************************************************************************
changed: [VPN-Router]
PLAY [Router section] **********************************************************************************************************************************************************************************
TASK [get_ios_command : get ios_command_show] **********************************************************************************************************************************************************
ok: [Router1] => (item=show clock)
ok: [VPN-Router] => (item=show clock)
ok: [Router1] => (item=show run)
ok: [Router1] => (item=show version)
ok: [VPN-Router] => (item=show run)
ok: [Router1] => (item=show ip int brief)
ok: [VPN-Router] => (item=show version)
ok: [Router1] => (item=show ip route)
ok: [Router1] => (item=show log)
ok: [VPN-Router] => (item=show ip int brief)
ok: [VPN-Router] => (item=show ip route)
ok: [VPN-Router] => (item=show log)
TASK [get_ios_command : set show results] **************************************************************************************************************************************************************
ok: [Router1]
ok: [VPN-Router]
TASK [save_cisco_command_logdir : save show per hosts] *************************************************************************************************************************************************
changed: [VPN-Router] => (item=show clock)
changed: [Router1] => (item=show clock)
changed: [Router1] => (item=show run)
changed: [VPN-Router] => (item=show run)
changed: [Router1] => (item=show version)
changed: [VPN-Router] => (item=show version)
changed: [Router1] => (item=show ip int brief)
changed: [VPN-Router] => (item=show ip int brief)
changed: [Router1] => (item=show ip route)
changed: [VPN-Router] => (item=show ip route)
changed: [Router1] => (item=show log)
changed: [VPN-Router] => (item=show log)
PLAY [Switch section] **********************************************************************************************************************************************************************************
TASK [get_ios_command : get ios_command_show] **********************************************************************************************************************************************************
ok: [L2Switch1] => (item=show clock)
ok: [L2Switch1] => (item=show run)
ok: [L2Switch1] => (item=show version)
ok: [L2Switch1] => (item=show int status)
ok: [L2Switch1] => (item=show mac address-table )
ok: [L2Switch1] => (item=show log)
TASK [get_ios_command : set show results] **************************************************************************************************************************************************************
ok: [L2Switch1]
TASK [save_cisco_command_logdir : save show per hosts] *************************************************************************************************************************************************
changed: [L2Switch1] => (item=show clock)
changed: [L2Switch1] => (item=show run)
changed: [L2Switch1] => (item=show version)
changed: [L2Switch1] => (item=show int status)
changed: [L2Switch1] => (item=show mac address-table )
changed: [L2Switch1] => (item=show log)
PLAY [Nexus section] ***********************************************************************************************************************************************************************************
TASK [get_nxos_command : get nxos_command_show] ********************************************************************************************************************************************************
ok: [Nexus1] => (item=show clock)
ok: [Nexus1] => (item=show run)
ok: [Nexus1] => (item=show version)
ok: [Nexus1] => (item=show ip int brief)
ok: [Nexus1] => (item=show ip route)
ok: [Nexus1] => (item=show logging)
TASK [get_nxos_command : set show results] *************************************************************************************************************************************************************
ok: [Nexus1]
TASK [save_cisco_command_logdir : save show per hosts] *************************************************************************************************************************************************
changed: [Nexus1] => (item=show clock)
changed: [Nexus1] => (item=show run)
changed: [Nexus1] => (item=show version)
changed: [Nexus1] => (item=show ip int brief)
changed: [Nexus1] => (item=show ip route)
changed: [Nexus1] => (item=show logging)
PLAY RECAP *********************************************************************************************************************************************************************************************
L2Switch1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Nexus1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Router1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
VPN-Router : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ログ格納フォルダが作成されていることを確認します。
ls -l log/
[ec2-user@ip-10-0-0-100 get_log]$ ls -l log/
合計 0
drwxrwxr-x 2 ec2-user ec2-user 166 11月 22 07:59 log_20211122075835
ホスト毎にログが取得できていることを確認します。
ls -l log/log_20211122075835/
[ec2-user@ip-10-0-0-100 ansible]$ ls -l log/log_20211122075835/
合計 92
-rw-rw-r-- 1 ec2-user ec2-user 8474 11月 22 07:59 L2Switch1_show_20211122075835.log
-rw-rw-r-- 1 ec2-user ec2-user 44739 11月 22 07:59 Nexus1_show_20211122075835.log
-rw-rw-r-- 1 ec2-user ec2-user 15546 11月 22 07:58 Router1_show_20211122075835.log
-rw-rw-r-- 1 ec2-user ec2-user 19253 11月 22 07:58 VPN-Router_show_20211122075835.log
取得したログの確認
VPN-Routerのログの中身を確認すると、Routerグループで指定したコマンドが取得できていることがわかります。
cat log/log_20211122075835/VPN-Router_show_20211122075835.log
[ec2-user@ip-10-0-0-100 get_log]$ cat log/log_20211122075835/VPN-Router_show_20211122075835.log
====================== show clock =======================
*14:11:11.050 UTC Sun Nov 21 2021
====================== show clock =======================
====================== show run =======================
Building configuration...
Current configuration : 7878 bytes
!
! Last configuration change at 14:02:27 UTC Sun Nov 21 2021
!
version 15.9
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname VPN-Router
〜〜〜〜 中略 〜〜〜〜
====================== show run =======================
====================== show version =======================
Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.9(3)M3, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2021 by Cisco Systems, Inc.
Compiled Wed 27-Jan-21 09:58 by prod_rel_team
〜〜〜〜 中略 〜〜〜〜
====================== show version =======================
====================== show ip int brief =======================
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 192.168.1.100 YES NVRAM up up
GigabitEthernet0/1 192.168.2.2 YES NVRAM up up
GigabitEthernet0/2 unassigned YES NVRAM up up
GigabitEthernet0/3 unassigned YES NVRAM up up
NVI0 192.168.1.100 YES unset up up
Tunnel1 169.254.173.150 YES NVRAM up up
====================== show ip int brief =======================
====================== show ip route =======================
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is 192.168.1.1 to network 0.0.0.0
S* 0.0.0.0/0 [1/0] via 192.168.1.1
10.0.0.0/24 is subnetted, 1 subnets
S 10.0.0.0 is directly connected, Tunnel1
169.254.0.0/16 is variably subnetted, 2 subnets, 2 masks
C 169.254.173.148/30 is directly connected, Tunnel1
L 169.254.173.150/32 is directly connected, Tunnel1
〜〜〜〜 中略 〜〜〜〜
====================== show ip route =======================
====================== show log =======================
Syslog logging: enabled (0 messages dropped, 3 messages rate-limited, 0 flushes, 0 overruns, xml disabled, filtering disabled)
〜〜〜〜 中略 〜〜〜〜
*Nov 21 14:02:27.199: %SYS-5-CONFIG_I: Configured from console by console
====================== show log =======================
最終的なディレクトリ構成
最終的なディレクトリ構成は下記の通りです。
ansible
└ get_log
├── net_hosts
├── files
│ ├── Nexus_show.txt
│ ├── Router_show.txt
│ └── Switch_show.txt
├── get_log.yml
├── log
│ └── log_20211122075835
│ ├── L2Switch1_show_20211122075835.log
│ ├── Nexus1_show_20211122075835.log
│ ├── Router1_show_20211122075835.log
│ └── VPN-Router_show_20211122075835.log
└── roles
├── get_ios_command
│ └── tasks
│ └── main.yaml
├── get_nxos_command
│ └── tasks
│ └── main.yaml
└── save_cisco_command_logdir
└── tasks
└── main.yaml
以上で、Ansibleによるネットワーク機器の操作(2.ログ取得【AWS】)の説明は完了です!
【前回】Ansibleによるネットワーク機器の操作(1.インストール〜疎通確認【AWS】)
【次回】Ansibleによるネットワーク機器の操作(3.設定変更【AWS】)