Ansibleによるネットワーク機器の操作(3.設定変更【AWS】)

Ansibleによるネットワーク機器の操作(3.設定変更【AWS】)

【前々回】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インターフェースを作成されていることを確認します。

Router1
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】)

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