Exastro ITA 2.4× Ansibleでやってみよう♪ ネットワーク機器の自動設定

# はじめに
この記事では、Ciscoのネットワーク機器の設定変更をExastro×Ansibleを使ってやってみたいと思います。

# Exastro IT Automationとは
Exastro IT Automationは、システム情報をデジタル管理するためのフレームワークです。
手順書(IaC)や、手順書に代入されるパラメータを管理することでCMDBを実現することができるツールとなっています。  
詳しくは以下のサイトを読んでみてください。
https://ita.exastro.org/

# 今回のシナリオ
Cisco L3SWの設定変更をExastro ITAを使って自動化していきます。
今回の作業はios_commandモジュールを使ったPlaybookで構成した設定手順になります。
機器やOSによって様々なAnsibleモジュールが使用できます。

L3SWは以下の3つの作業で設定変更していきます。
1. 物理インタフェースにVLAN ID作成 
2. VLAN IDにIPv4アドレスを設定 (VLANルーティングは自動で設定)
3. running-configをstartup-configへ保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/4936a232-b56f-7298-ccd8-7a3ec3f3d612.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/2e56e134-e1d0-a49d-6018-dcc88b31dd56.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/6dc4742a-12a9-a1c6-77bc-38c31f6889f1.png)


また、Exastro ITAを使った各種登録作業の流れも整理しておきます。
![L3SW-02_全体作業.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119474/68a6cd4b-e87b-bab8-1f70-ca5739c36fa0.png)


# 作業環境
今回の作業環境は以下のようにしています。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/f4552e1c-cb5b-1fa3-15f4-37d8c7de008d.png)

# 機器の登録
では作業に入って行きます。
まず対象となる Cisco L3SW を登録します。

Ansible共通から機器一覧を選択して、登録ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/661e52e1-033c-2a58-8889-47dcefeb2fbd.png)

画面が遷移するので、パラメータを入力します。
対象機器となるL3SWのHW機器対象種別、ホスト名、IPアドレス等を入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/3ca21409-de71-dc29-3b0b-15f8cb301129.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/59110fd3-c86f-bfb9-3542-7361e892a1d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/bac6faa5-4b7c-c021-8046-5e948d1a83b0.png)

■設定パラメータ
+ HW機器種別：NW
+ ホスト名：CiscoL3SW
+ IPアドレス：対象スイッチのIPアドレス
+ ユーザ：root
+ パスワード：対象スイッチのパスワード
+ 認証方式：パスワード認証

「インベントリファイル追加オプション」には、Ansibleで使用するインベントリファイル情報を記載していきます。
今回は以下を入力しました。

```
ansible_connection: network_cli
ansible_network_os: ios
ansible_become: yes
ansible_become_method: enable
ansible_become_pass: '{{ __loginpassword__ }}'
```
ansible_become_passは特権モードになるためのパスワードです。
今回はログインパスワードと同一だったためパラメータ表記となっています。

※ITA独自変数の独自変数に "__loginpassword__" というものがあり、機器一覧に登録したログインパスワードの値を変数として扱えます。
[ITA独自変数 機器一覧](https://ita-docs.exastro.org/ja/2.4/manuals/ansible-driver/ansible_common.html#id11)


# オペレーションの作成
Cisco L3SWの新たなVLAN IDとIPアドレスを設定するオペレーションを登録します。
オペレーションとは実施する作業のことで、オペレーションに対して作業対象とパラメータが紐づきます。
基本コンソールから投入オペレーションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/5c16bb52-e0c3-bfe2-4a98-7ca11ced9ea6.png)

画面が遷移するので、パラメータを入力します。
投入するオペレーションの名前と実施予定日時を入力し、登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/a423d0f2-149f-9247-c5b0-91092427cdfd.png)
■設定パラメータ1
+ オペレーション名：L3SW設定1
+ 実施予定日時：現在時刻

■設定パラメータ2
+ オペレーション名：L3SW設定2
+ 実施予定日時：現在時刻

# メニュー定義と具体値入力
次にオペレーションに必要なパラメータ一覧と実行時に代入される具体値を設定していきます。
メニュー定義の作成と入力用具体値の2つの登録作業が必要です。

### メニュー定義の作成
オペレーションに必要となる変数一覧(Exastro ITAのメニュー定義)を作成していきます。
パラメータシート作成 > パラメータシート定義・作成 を選択し、メニューを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/23939486-4cbf-1c65-2c49-7e3a4aa469e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/403d3d6c-dbd8-d706-ff49-7a2fb0e92791.png)

■項目1
+ 項目名：VLAN ID
+ 項目の名前(Rest API用)：vlan_id
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■項目2
+ 項目名：Physical Interface
+ 項目の名前(Rest API用)：physical_interface
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■項目3
+ 項目名：Virtual Interface
+ 項目の名前(Rest API用)：virtual_interface
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■項目4
+ 項目名：IPv4 Address
+ 項目の名前(Rest API用)：ipv4_address
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■項目5
+ 項目名：Subnetmask
+ 項目の名前(Rest API用)：subnetmask
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■項目6
+ 項目名：Save When
+ 項目の名前(Rest API用)：save_when
+ 入力方式：文字列(単一行)
+ 最大バイト数：32

■パラメータ作成情報
+ パラメータシート名：L3SW設定
+ パラメータシート名(Rest)：L3SW_setting
+ 表示順序：1

### 入力用具体値
基本コンソールから入力用 > 登録したメニュー定義(L3SW設定) を選択し、登録ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/d8eb9961-2eca-9aac-1bb9-567a9422eac1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/988c7ce1-6c01-d7df-792f-1d5a8bb5d214.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/7c96930e-175f-b3e3-a2c6-4aebd822c206.png)

■登録パラメータ1
+ ホスト名：CiscoL3SW
+ オペレーション名：L3SW設定1
+ VLAN ID：10
+ Physical Interface：Gi0/10
+ Virtual Interface：Vlan10
+ IPv4 Address：192.168.10.1
+ Subnetmask：255.255.255.0
+ Save When：modified

■登録パラメータ2
+ ホスト名：CiscoL3SW
+ オペレーション名：L3SW設定2
+ VLAN ID：20
+ Physical Interface：Gi0/20
+ Virtual Interface：Vlan20
+ IPv4 Address：192.168.20.1
+ Subnetmask：255.255.255.0
+ Save When：modified

# Playbookの登録
実際にCisco L3SWに設定するためのPlaybookを登録しましょう。
Ansible-Legacy > Playbook素材集 から登録を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/40778ce4-61e2-3eaa-bebf-a63ca9cade46.png)


プレイブック素材名にはアップロードするPlaybookの分かりやすい名前を入力し、プレイブック素材欄でローカルからPlaybookをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/7a4a137e-25ce-a6d0-a45a-27e23f51df7b.png)

■登録パラメータ1
+ playbook素材集：L3スイッチvlan作成
+ playbook素材：	create_vlan.yml

■登録パラメータ2
+ playbook素材集：L3スイッチipv4アドレス設定
+ playbook素材：	set_ipv4address.yml

■登録パラメータ3
+ playbook素材集：L3スイッチ設定保存
+ playbook素材：	save_config.yml


### 今回アップロードしたPlaybook
今回アップロードしたPlaybookを記載します。

```yml:create_vlan.yml
---
- name: set Vlan ID to physical interface
  ios_command:
    commands:
      - config terminal
      - vlan {{ VAR_vlan_id }}

      - interface {{ VAR_physical_intfc_name }}
      - switchport mode access
      - switchport access vlan {{ VAR_vlan_id }}
```

```yml:set_ipv4address.yml
---
- name: set ipv4 address to interface
  ios_command:
    commands:
      - config terminal
      - interface {{ VAR_infc_name }}
      - ip address {{ VAR_ipv4_address }} {{ VAR_subnetmask }}
      - no shutdown
```  

```yml:save_config.yml
---
- name: save running to startup when modified
  ios_config:
    save_when: "{{ VAR_save_when }}"
```  

# Movement登録
先ほど登録したプレイブック素材を組み合わせてMovementを登録します。
Ansible-Legacy > Movement一覧から登録開始を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/0d3904b5-a09a-0dda-0ef6-d2893c36a7f6.png)

Movement名は登録するMovementの分かりやすい名前を、ホスト指定形式はIPもしくはホスト名を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/b3241d16-660e-b22b-51b1-b32b453e30e0.png)

■登録パラメータ1
+ Movement名：L3SW_VLAN作成
+ ホスト指定形式：IP

■登録パラメータ2
+ playbook素材集：L3SW_設定保存
+ playbook素材：IP

### Movementとプレイブック素材の紐づけ
Ansible-Legacy > Movement-Playbook紐付 から登録を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/1ba1b419-3627-97c3-d637-5f84ff98bb56.png)

Movementには先ほど登録したMovementを選択、プレイブック素材には登録したプレイブックを、インクルード順序にはプレイブックを実行する順序を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/69b61466-71df-fcee-5cf0-db9ac809134f.png)

■登録パラメータ1
+ Movement名：L3SW_VLAN作成
+ Playbook素材：L3スイッチvlan作成
+ インクルード順序：1

■登録パラメータ2
+ Movement名：L3SW_VLAN作成
+ Playbook素材：L3スイッチipv4アドレス設定
+ インクルード順序：2

■登録パラメータ3
L3スイッチvlan作成
+ Movement名：L3SW_設定保存
+ Playbook素材：L3スイッチ設定保存
+ インクルード順序：1

1つのMovementに複数のプレイブック素材を登録する場合、実行順序を指定したいケースがあります。
今回はまさにそのケースで、VLAN IDを作成してから作成したVLAN IDのIPv4アドレス設定をするという順番をインクルード順序で指定して実行が出来ます。

# 代入値登録
登録した2つのオペレーションにそれぞれパラメータを登録していきましょう。
ここでは、最初に作成したメニュー定義とMovement（プレイブック）に登録された変数を結びつけてパラメータを投入していきます。

Ansible-Legacy > 代入値自動登録設定から登録開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/cbc04963-d57c-765e-092b-3d565457442f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/5d491812-8d0b-c03f-222d-dbec8054b2ff.png)

■登録パラメータ1
+ 項目：VLAN ID
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_VLAN作成:VAR_vlan_id"

■登録パラメータ2
+ 項目：Physical Interface
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_VLAN作成:VAR_physical_intfc_name"

■登録パラメータ3
+ 項目：Virtual Interface
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_VLAN作成:VAR_infc_name"

■登録パラメータ4
+ 項目：IPv4 Address
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_VLAN作成:VAR_ipv4_address"

■登録パラメータ5
+ 項目：Subnetmask
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_VLAN作成:VAR_subnetmask"

■登録パラメータ6
+ 項目：Save When
+ 登録方式：Value型
+ Movement名：L3SW_VLAN作成
+ 変数名："L3SW_設定保存:VAR_save_when"

# Conductorでの実行
無事にオペレーションの登録が終わったらConductorを使って実行してみましょう。
Conductorはオペレーションを自由に組み合わせてジョブフローとして実行できるツールです。

画面右下から登録したMovementをドラッグ・アンド・ドロップでパレットに配置します。
配置したパレットのINとOUTをドラッグ・アンド・ドロップすることで連結し、フローを作成出来ます。
右下のタブをFunctionに切り替えることで分岐や他のConductorの呼び出しが行えます。

Conductor > Conductor編集/作業実行から登録開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/ed2866e5-8b21-df1a-d4fc-a501c9980b2a.png)

作成と保存が終わったら実行ボタンから実行してみましょう。
今回は2つオペレーションがあるので2回実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/42a9242c-3610-d4d9-30bd-c2300e15f7c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/025793c2-7e98-3549-048a-4190815c1de8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/54a06fa3-04f3-b52f-9527-b42bd1297125.png)

以上でExcastro ITAを使ったCisco L3SWの設定は完了です。
無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認しましょう。

`#show startup-config`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/075082c4-6baa-c854-5d05-b9ad77e3ba42.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/67ab41ca-c422-be55-2d01-df3b102f62c0.png)

vlan10とvlan20が追加され、IPアドレスも設定されていました。

# まとめ
今回はExastro×Ansibleでネットワーク機器の自動設定をしてみました。
Ansibleにはネットワーク機器用のモジュールもあり、ネットワーク機器が対象でもサーバ設定と同じような感覚で設定出来ることが分かりました。
ぜひ、本記事を参考にしてご自分でも触ってみて下さい。