【前々回】Ansibleによるネットワーク機器の操作(1.インストール〜疎通確認【AWS】)
【前回】Ansibleによるネットワーク機器の操作(2.ログ取得【AWS】)
Ansibleを利用し、ネットワーク機器の設定を変更します。ネットワーク環境等の構成については、前々回を参照してください。
ディレクトリの作成
以下の構成となるようにディレクトリを作成します。
mkdir change_config
cd change_config
mkdir files
mkdir log
ansible
└ change_config
├── files # 取得コマンドを記述したファイルを格納
└── log # 取得したログを格納
インベントリーファイルの作成
前回作成したインベントリーファイルを利用します。
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を作成します。今回はRouter1を対象として、「設定変更前のコンフィグを取得 → 設定変更 → 設定変更後のログを取得」という作業を自動化します。
vi change_config.yml
- hosts: Router1 #設定変更対象はRouter1を指定
gather_facts: false
tasks:
- name: create time
set_fact:
exe_date: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
run_once: true
- name: create parent directory
set_fact:
logdir_date: "{{ playbook_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: get before show run #事前ログ取得
ios_command:
commands: "{{ item }}"
register: show_result
loop: "{{ lookup('file', 'files/show_clock_run.txt').splitlines() }}"
- name: set before show results
set_fact:
show_results: "{{ show_result.results }}"
- name: save before show run
blockinfile:
block: "{{ item.stdout[0] }}"
path: "{{ logdir.path }}/10_before_{{ inventory_hostname }}_show_{{ exe_date }}.log"
marker: "====================== {{ item.item }} ======================="
create: yes
loop: "{{ show_results }}"
loop_control:
label: "{{ item.item }}"
- name: change_config #設定変更を実施
ios_config:
src: Router1_change_config.txt
- name: get after show run #事後ログ取得
ios_command:
commands: "{{ item }}"
register: show_result
loop: "{{ lookup('file', 'files/show_clock_run.txt').splitlines() }}"
- name: set after show results
set_fact:
show_results: "{{ show_result.results }}"
- name: save after show run
blockinfile:
block: "{{ item.stdout[0] }}"
path: "{{ logdir.path }}/20_after_{{ inventory_hostname }}_show_{{ exe_date }}.log"
marker: "====================== {{ item.item }} ======================="
create: yes
loop: "{{ show_results }}"
loop_control:
label: "{{ item.item }}"
実行コマンドファイルの作成
ログ取得コマンド
設定変更前後に取得するコマンドを記載したファイルを作成します。
vi files/show_clock_run.txt
show clock
show run
設定変更コマンド
設定変更コマンドを記載したファイルを作成します。今回は、loopbackインターフェースを作成し、IPアドレスを設定します。
vi Router1_change_config.txt
interface Loopback0
ip address 1.1.1.1 255.255.255.255
Playbookの実行
作成したインベントリーファイルを指定してPlaybookを実行します。
ansible-playbook -i net_hosts change_config.yml
[ec2-user@ip-10-0-0-100 change_config]$ ansible-playbook -i net_hosts change_config.yml
PLAY [Router1] **************************************************************************************************************************************************************************************************
TASK [create time] **********************************************************************************************************************************************************************************************
ok: [Router1]
TASK [create parent directory] **********************************************************************************************************************************************************************************
ok: [Router1]
TASK [create directory for log] *********************************************************************************************************************************************************************************
changed: [Router1]
TASK [get before show run] **************************************************************************************************************************************************************************************
ok: [Router1] => (item=show clock)
ok: [Router1] => (item=show run)
TASK [set before show results] **********************************************************************************************************************************************************************************
ok: [Router1]
TASK [save before show run] *************************************************************************************************************************************************************************************
changed: [Router1] => (item=show clock)
changed: [Router1] => (item=show run)
TASK [change_config] ********************************************************************************************************************************************************************************************
changed: [Router1]
TASK [get after show run] ***************************************************************************************************************************************************************************************
ok: [Router1] => (item=show clock)
ok: [Router1] => (item=show run)
TASK [set after show results] ***********************************************************************************************************************************************************************************
ok: [Router1]
TASK [save after show run] **************************************************************************************************************************************************************************************
changed: [Router1] => (item=show clock)
changed: [Router1] => (item=show run)
PLAY RECAP ******************************************************************************************************************************************************************************************************
Router1 : ok=10 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
設定変更確認
ログの確認
ログ格納フォルダが作成されていることを確認します。
ls -l log/
[ec2-user@ip-10-0-0-100 change_config]$ ls -l log/
合計 0
drwxrwxr-x 2 ec2-user ec2-user 103 11月 27 07:44 log_20211127074415
設定変更前と設定変更後のログが取得できていることを確認します。
ls -l log/log_20211127074415/
[ec2-user@ip-10-0-0-100 change_config]$ ls -l log/log_20211127074415/
合計 24
-rw-rw-r-- 1 ec2-user ec2-user 8462 11月 27 07:44 10_before_Router1_show_20211127074415.log
-rw-rw-r-- 1 ec2-user ec2-user 8529 11月 27 07:44 20_after_Router1_show_20211127074415.log
設定変更前後のログの差分を確認します。
diff log/log_20211127074415/10_before_Router1_show_20211127074415.log log/log_20211127074415/20_after_Router1_show_20211127074415.log
[ec2-user@ip-10-0-0-100 change_config]$ diff log/log_20211127074415/10_before_Router1_show_20211127074415.log log/log_20211127074415/20_after_Router1_show_20211127074415.log
2c2
< *23:34:50.381 UTC Thu Nov 25 2021
---
> *23:35:00.971 UTC Thu Nov 25 2021
8c8
< Current configuration : 8126 bytes
---
> Current configuration : 8193 bytes
10c10
< ! Last configuration change at 23:32:07 UTC Thu Nov 25 2021
---
> ! Last configuration change at 23:34:59 UTC Thu Nov 25 2021 by cisco
70a71,73
> !
> interface Loopback0
> ip address 1.1.1.1 255.255.255.255
実機の確認
下記コマンドを実行し、loopbackインターフェースを作成されていることを確認します。
show ip interface brief
Router1#show ip interface brief
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 192.168.2.1 YES NVRAM up up
GigabitEthernet0/1 172.16.1.254 YES NVRAM up up
GigabitEthernet0/2 unassigned YES NVRAM administratively down down
GigabitEthernet0/3 unassigned YES NVRAM up up
Loopback0 1.1.1.1 YES manual up up
【補足】冪等性(べきとうせい)の動作確認
Ansibleには、冪等性という概念が導入されています。loopbackインターフェースが作成されている状態で、もう一度同じPlaybookを実行すると、ルータの状態を確認し、設定変更は行われません。
[ec2-user@ip-10-0-0-100 change_config]$ ansible-playbook -i net_hosts change_config.yml
PLAY [Router1] **************************************************************************************************************************************************************************************************
〜〜〜〜 中略 〜〜〜〜
TASK [change_config] ********************************************************************************************************************************************************************************************
ok: [Router1]
〜〜〜〜 中略 〜〜〜〜
PLAY RECAP ******************************************************************************************************************************************************************************************************
Router1 : ok=10 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
TASK [change_config]のところが、”changed”ではなく、”ok”となっており、設定変更が行われていないことがわかります。
Cisco等のネットワーク機器の場合、”no shutdown”コマンド等、コンフィグ上に現れないコマンドも多くあるため、完全に冪等性が担保されるわけではないことに注意する必要があります。
最終的なディレクトリ構成
最終的なディレクトリ構成は下記の通りです。
ansible
└── change_config
├── net_hosts
├── Router1_change_config.txt
├── change_config.yml
├── files
│ └── show_clock_run.txt
└── log
└── log_20211127074415
├── 10_before_Router1_show_20211127074415.log
└── 20_after_Router1_show_20211127074415.log
以上で、Ansibleによるネットワーク機器の操作(3.設定変更【AWS】)の説明は完了です。
【前々回】Ansibleによるネットワーク機器の操作(1.インストール〜疎通確認【AWS】)
【前回】Ansibleによるネットワーク機器の操作(2.ログ取得【AWS】)