はじめに
なぜネットワーク機器の設定や管理が自動化されないのか?
ネットワーク周りはサーバーインフラと比べて自動化があまり進んでいないのが現状です。
まずはネットワークが自動化されない理由を整理しました。
こちらの記事から引用しています。
- ネットワーク機器ベンダーが独自OSを実装しているため、対象OSが多い
- 標準的な外部APIが確立されていない
- 作業失敗時の影響が大きい
- エンジニアのスキルが自動化から遠い
- 自動化のアイディアが出づらい
- 手作業でなんとかなる作業量
- インフラ要員は人が減らされがち
しかし、Python等のWeb開発フレームワーク整備やChefやAnsible等の構成管理ツールの充実により自動化の敷居が下がってきたとも考えられます。
この記事では、ありがちなネットワーク機器の設定変更をExastro×Ansibleを使ってやってみたいと思います。
Exastro IT Automationとは
Exastro IT Automationは、システム情報をデジタル管理するためのフレームワークです。
手順書(IaC)や、手順書に代入されるパラメータを管理することでCMDBを実現することができるツールとなっています。
詳しくは以下のサイトを読んでみてください。
Exastro IT Automationをインストールしてみた(v1.6.0)
Exastro IT Automationを実際に動かしてみた(クイックスタート))
Exastroコミュニティ (Github)
利用手順マニュアル メニュー作成機能
Exastro IT Automationのキホンの”キ”
Exastro IT Automation ver1.6.0のキホンの"キ"
今回紹介するシナリオ
Exastro ITAを使った自動設定のイメージを膨らませるため、こんなシナリオを考えてみました。
あなたはWEB3層モデルで構築されたECサイトの管理者です。
運営も軌道に乗ってきたため、新しい機能となる売れ筋ランキング表示機能をつけようと思いました。
機能追加にあたりサーバーを増設することにしましたが、ネットワーク機器の設定変更が必要です。
スクリプトを組んで個別設定していくことは可能ですが、今後も同じような作業出るかもしれない。
そう考えてExastro IT Automationを使って自動化してみようと思いました。
前提条件
シナリオを整理すると以下のような前提条件となります。
- ECサイトはオンプレミスで運用されている
- システムはWEB3層とした
- プレゼンテーション層はDMZネットワークに配置
- アプリケーション層及びデータ層はイントラネットワークに配置
- パブリックを介してユーザーにWebサービスを提供する
- 現在運用されているサーバーとは別にWebサーバー、APサーバーとDBサーバーを構築する
- 売れ筋ランキング機能は新しいサーバー上に実装する
ネットワーク図
新機能サーバーの追加前と追加後のネットワーク図を見てみます。
まず、サーバー追加前の論理ネットワークはこのようになっています。
作業環境
- CentOS Linux 7 (サーバー用)
- Exastro IT Automation 1.6.0
- Ansible 2.10.4
- Exastro IT Automation 1.6.0
- Windows 10 (クライアント用)
- Chromium版Edge
- Cisco L3SW
- Cisco IOS Software, C3560E Software (C3560E-UNIVERSALK9-M), Version 12.2(55)SE, RELEASE SOFTWARE (fc2)
- BIG-IP
- BIG-IP 15.1.0.5 Build 0.0.8 Point Release 5
- FortiGate
- FortiGate VM64 v6.2.6 build1175 (GA)
Cisco L3SWの設定変更
まずはCisco L3SWの設定変更をExastro ITAを使って自動化していきます。
今回の作業はios_commandモジュールを使ったPlaybookで構成した設定手順になります。
機器やOSによって様々なAnsibleモジュールが使用できますので、色々と試してみましょう。
L3SW設定作業の流れ
L3SWは以下の3つの作業で設定変更していきます。
- 物理インタフェースにVLAN ID作成
- VLAN IDにIPv4アドレスを設定 (VLANルーティングは自動で設定)
- running-configをstartup-configへ保存
また、Exastro ITAを使った各種登録作業の流れも整理しておきます。
機器の登録
まず対象となるCisco L3SWを登録します。
基本コンソールから機器一覧を選択します。
画面が遷移するので、登録欄から登録開始を選択します。
対象機器となるL3SWのHW機器対象種別、ホスト名、IPアドレス等を入力していきます。
インベントリファイル欄には、Ansibleで使用するインベントリファイル情報を記載していきます。
今回は以下を入力しました。
ansible_connection: network_cli
ansible_network_os: cisco.ios.ios
ansible_become_pass: {{ ansible_ssh_pass}}
ansible_become_passは特権モードになるためのパスワードです。
今回はログインパスワードと同一だったためパラメータ表記となっています。
最後に登録ボタンを選択して登録完了です。
メニュー定義と具体値入力
Cisco L3SWの新たなVLAN IDとIPアドレスを設定する、というオペレーションを登録します。
先ほどと同じように、基本コンソールから投入オペレーションを選択します。
画面が遷移するので、登録欄から登録開始を選択します。
投入するオペレーションの名前と実施予定日時を入力し、登録します。
今回は「新機能APサーバー用 L3SW設定」と「新機能DBサーバー用 L3SW設定」の2つのオペレーションを登録しました。
メニュー定義の作成
次にオペレーションに必要なパラメータ一覧と実行時に代入される具体値を設定していきます。
メニュー定義の作成と入力用具体値の2つの登録作業が必要です。
パラメータ一覧となるメニュー定義の作成
オペレーションに必要となる変数一覧(Exastro ITAのメニュー定義)を作成していきます。
基本コンソール→メニュー定義/作成を選択し、メニューを作成します。
パラメータを設定したら「項目」を選択し、新しい項目を増やしてパラメータを追加していきましょう。
実行時に代入される具体値の設定
基本コンソールから入力用→登録したメニュー定義(ここではCisco L3SW設定)を選択し、登録開始を選択します。
登録作業では、これまでの作業で登録した機器、オペレーション、パラメータに設定する具体値をそれぞれ入力していきます。
Playbookの登録
実際にCisco L3SWに設定するためのPlaybookを登録しましょう。
Ansible-Legacy→プレイブック素材→登録欄から登録開始を選択します。
プレイブック素材名にはアップロードするPlaybookの分かりやすい名前を入力し、プレイブック素材欄でローカルからPlaybookをアップロードします。
Movementの登録
先ほど登録したプレイブック素材を組み合わせてMovementを登録します。
Ansible-Legacy→Movement一覧→登録欄から登録開始を選択します。
Movement名は登録するMovementの分かりやすい名前を、ホスト指定形式はIPもしくはホスト名を選択します。
必要に応じてヘッダーセクション欄にPlaybookに必要なヘッダー情報を追記しましょう。
今回の記事では不要です。
次に、Movementにプレイブック素材を紐付けます。
Ansible-Legacy→Movement詳細→登録欄から登録開始を選択します。
Movementには先ほど登録したMovementを選択、プレイブック素材には登録したプレイブックを、インクルード順序にはプレイブックを実行する順序を入力します。
インクルード順序とは
一つのMovementに複数のプレイブック素材を登録する場合、実行順序を指定したい場合があります。
今回のようにVLAN IDを作成してから、作成したVLAN IDのIPv4アドレス設定の場合はそれにあたります。
このような場合、インクルード順序で指定すれば実行順序を保つことが出来ます。
これでMovementの登録とプレイブックの紐付けが完了しました。
代入値登録
登録した2つのオペレーションにそれぞれパラメータを登録していきましょう。
ここでは、最初に作成したメニュー定義とMovement(プレイブック)に登録された変数を結びつけてパラメータを投入していきます。
ここまでの作業を整理したものを示します。
2つのオペレーションへの代入値設定は以下の通りです。
オペレーション | Vlan ID | 物理インタフェース | 仮想インタフェース | IPアドレス | サブネットマスク |
---|---|---|---|---|---|
新機能APサーバー用 L3SW設定 | 11 | Gi0/15 | Vlan11 | 192.168.11.1 | 255.255.255.0 |
新機能DBサーバー用 L3SW設定 | 21 | Gi0/16 | Vlan21 | 192.168.21.1 | 255.255.255.0 |
これまでと同じようにExastro ITAに代入値を登録していきます。
Ansible-Legacy→代入値自動登録設定→登録欄から登録開始します。
具体値は先ほどメニュー定義の「入力用」で設定したものから自動で登録されます。
Conductorでの実行
無事にオペレーションの登録が終わったらConductorを使って実行してみましょう。
Conductorはオペレーションを自由に組み合わせてジョブフローとして実行できるツールです。
画面右下から登録したMovementをドラッグ・アンド・ドロップでパレットに配置します。
配置したパレットのINとOUTをドラッグ・アンド・ドロップすることで連結し、フローを作成出来ます。
右下のタブをFunctionに切り替えることで分岐や他のConductorの呼び出しが行えます。
作成と保存が終わったら実行してみましょう。
メニューグループ→Conductor→Conductor実行を選択すると画面が遷移します。
Conductor[一覧]から実行したいConductorを呼び出し、実行したいオペレーションを選択するとConductorが表示されます。
間違いがなければ実行ボタンを選択しましょう。
以上でExcastro ITAを使ったCisco L3SWの設定は完了です。
無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認しましょう。
#show startup-config
補足: アップロードしたPlaybookの確認
今回アップロードしたPlaybookを記載しておきます。
---
- 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 }}
---
- name: set ipv4 address to interface
ios_command:
commands:
- config terminal
- interface {{ VAR_infc_name }}
- ip address {{ VAR_ipv4_address }} {{ VAR_subnetmask }}
- no shutdown
---
- name: save running to startup when modified
ios_config:
save_when: "{{ VAR_save_when }}"
BIG-IPの設定変更
L3SWと同じようにBIG-IPの設定変更をExastro ITAを使って自動化していきます。
Ansibleのbigipモジュールを使ったPlaybookを構成した設定手順になっています。
BIG-IP設定作業の流れ
BIG-IPにLB設定を追加するための作業の流れは以下のようになります。
機器の登録
Exastro ITAで設定されるBIG-IPを登録します。
BIG-IPの設定ではAnsibleのbigipモジュールを使用するため、インベントリファイル欄には以下を記載しておきます。
bigip_user: admin
bigip_delegate_to: localhost
最後に登録ボタンを選択して登録完了です。
メニュー定義と具体値入力
BIG-IPでWEBサーバー用の新たなロードバランス設定を追加する、というオペレーションを登録します。
同じように、基本コンソールから投入オペレーションを登録します。
今回は以下2つのオペレーションを登録しました。
- 新機能WEBサーバー用 LB設定
- 新機能WEBサーバー用 LB設定追加
メニュー定義の作成と具体値の入力
L3SWと同じように、オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。
メニュー定義の作成
オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。
具体値の入力
Playbookの登録
実際にBIG-IPに設定するためのPlaybookを登録します。
今回は以下の4つのPlaybookを登録しました。
Movementの登録
先ほど登録したプレイブック素材を組み合わせてMovementを登録していきます。
Conductorでの実行
無事にオペレーションの登録が終わったら、これらをConductorを使って実行してみましょう。
作成したConductorはこのようになります。
間違いがなければ実行ボタンを選択します。
無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認します。
補足: アップロードしたPlaybookの確認
アップロードしたBIG-IPのPlaybookを記載しておきます。
---
- name: create pool
bigip_pool:
state: "present"
name: "{{ VAR_pool_name }}"
monitors: "{{ VAR_pool_monitors }}"
lb_method: "{{ VAR_lb_method }}"
provider:
server: "{{ ansible_ssh_host }}"
password: "{{ ansible_ssh_pass }}"
user: "{{ ansible_ssh_user }}"
validate_certs: "no"
delegate_to: localhost
---
- name: create node
bigip_node:
host: "{{ VAR_node_addr }}"
name: "{{ VAR_node_name }}"
provider:
server: "{{ ansible_ssh_host }}"
password: "{{ ansible_ssh_pass }}"
user: "{{ ansible_ssh_user }}"
validate_certs: "no"
delegate_to: localhost
---
- name: Add member to pool
bigip_pool_member:
pool: "{{ VAR_pool_name }}"
partition: "{{ VAR_partition_name }}"
name: "{{ VAR_pool_member_name }}"
host: "{{ VAR_pool_member_addr }}"
port: "{{ VAR_pool_member_port }}"
provider:
server: "{{ ansible_ssh_host }}"
password: "{{ ansible_ssh_pass }}"
user: "{{ ansible_ssh_user }}"
validate_certs: "no"
delegate_to: localhost
---
- name: create virtual server
bigip_virtual_server:
name: "{{ VAR_vs_name }}"
destination: "{{ VAR_dst_addr }}"
port: "{{ VAR_port_number }}"
enabled_vlans: "all"
profiles: "{{ VAR_profiles_list }}"
pool: "{{ VAR_pool_name }}"
snat: "automap"
provider:
server: "{{ ansible_ssh_host }}"
password: "{{ ansible_ssh_pass }}"
user: "{{ ansible_ssh_user }}"
validate_certs: "no"
delegate_to: localhost
FortiGateの設定変更
最後に、L3SW, BIG-IPと同じようにFortiGateの設定変更をExastro ITAを使って自動化します。
ここでは新規WEBサーバー用FW定義を追加していきます。
FortiGate FW定義追加の流れ
FortiGateにFW定義を追加するための作業の流れは以下のようになります。
(コンフィグバックアップ)
機器の登録
まずはExastro ITAで設定されるFortiGateを登録します。
Ansibleのfortiosモジュールを使用するため、インベントリファイル欄には以下を入力します。
ansible_network_os: fortios
最後に登録ボタンを選択して登録完了です。
メニュー定義と具体値入力
新規WEBサーバー用の新たなFW定義を追加する というオペレーションを登録します。
設定内容はL3SW, BIG-IPと大きく変わりはありません。
メニュー定義の作成
オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。
具体値の入力
Playbookの登録
実際にBIG-IPに設定するためのPlaybookを登録します。
Movementの登録
先ほど登録したプレイブック素材を組み合わせてMovementを登録していきます。
Conductorでの実行
無事にオペレーションの登録と代入値設定が終わったら、これらをConductorを使って実行してみましょう。
無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認します。
補足: アップロードしたPlaybookの確認
アップロードしたFortiGateのPlaybookを記載しておきます。
---
- name: create virtual IP
fortios_firewall_vip:
vdom: "root"
state: "present"
firewall_vip:
name: "{{ VAR_vip_name }}"
arp_reply: "enable"
extip: "{{ VAR_extip }}"
extintf: "{{ VAR_extintf }}"
mappedip:
- range: "{{ VAR_mappedip_range }}"
nat_source_vip: "disable"
type: "static-nat"
portforward: "disable"
---
- name: Configure IPv4 static routing tables.
fortinet.fortios.fortios_router_static:
vdom: root
state: "present"
router_static:
status: "enable"
dst: "{{ VAR_dst_ip }}"
gateway: "{{ VAR_gateway_ip }}"
distance: "10"
weight: "0"
priority: "0"
device: "{{ VAR_device_name }}"
---
- name: create IPv4 address
fortios_firewall_address:
vdom: "root"
state: "present"
firewall_address:
name: "{{ VAR_iprange_name }}"
type: "iprange"
visibility: "enable"
associated_interface: "{{ VAR_iprange_intfc }}"
color: "5"
start_ip: "{{ VAR_iprange_start }}"
end_ip: "{{ VAR_iprange_end }}"
---
- name: create fw policy
fortios_firewall_policy:
vdom: "root"
state: "present"
firewall_policy:
name: "{{ VAR_fw_policy_name }}"
srcintf:
- name: "{{ VAR_srcintf_name }}"
dstintf:
- name: "{{ VAR_dstintf_name }}"
srcaddr:
- name: "all"
dstaddr:
- name: "{{ VAR_dstaddr_name }}"
action: "accept"
status: "enable"
schedule: "always"
service:
- name: "HTTP"
logtraffic: "utm"
logtraffic_start: "disable"
nat: "disable"
最後に
今回はExastro×AnsibleでWeb3層モデルを構成しているネットワーク機器の自動設定をしてみました。
ECサイトを一例としてオペレーション~プレイブックとパラメータ設定をしていますが、構築しているシステムの規模によってCMDBとしての作り方は大きく変わります。
ぜひ、自分で触ってみることをオススメします。