Ansibleによるネットワーク機器の操作(2.ログ取得【AWS】)

Ansibleによるネットワーク機器の操作(2.ログ取得【AWS】)

【前回】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】)

  • URLをコピーしました!
  • URLをコピーしました!
目次