LoginSignup
23
18

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-02-24

はじめに

なぜネットワーク機器の設定や管理が自動化されないのか?
ネットワーク周りはサーバーインフラと比べて自動化があまり進んでいないのが現状です。
まずはネットワークが自動化されない理由を整理しました。
こちらの記事から引用しています。

  1. ネットワーク機器ベンダーが独自OSを実装しているため、対象OSが多い
  2. 標準的な外部APIが確立されていない
  3. 作業失敗時の影響が大きい
  4. エンジニアのスキルが自動化から遠い
  5. 自動化のアイディアが出づらい
  6. 手作業でなんとかなる作業量
  7. インフラ要員は人が減らされがち

しかし、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サーバーを構築する
    • 売れ筋ランキング機能は新しいサーバー上に実装する

ネットワーク図

新機能サーバーの追加前と追加後のネットワーク図を見てみます。
まず、サーバー追加前の論理ネットワークはこのようになっています。
全体_サーバー追加前論理NW.png

サーバー追加後はこのようにしたいと考えています。
全体_サーバー追加後論理NW.png

この場合、設定変更が必要なネットワーク機器はこの3つです。
設定変更箇所.PNG

作業環境

今回の作業環境を整理しておきます。

全体_作業環境.png

  • CentOS Linux 7 (サーバー用)
    • Exastro IT Automation 1.6.0
    • Ansible 2.10.4
  • 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つの作業で設定変更していきます。

  1. 物理インタフェースにVLAN ID作成
  2. VLAN IDにIPv4アドレスを設定 (VLANルーティングは自動で設定)
  3. running-configをstartup-configへ保存

L3SW-01_設定作業.png

また、Exastro ITAを使った各種登録作業の流れも整理しておきます。
L3SW-02_全体作業.png

機器の登録

まず対象となるCisco L3SWを登録します。
基本コンソールから機器一覧を選択します。
L3SW-03_機器の登録.png

画面が遷移するので、登録欄から登録開始を選択します。
対象機器となるL3SWのHW機器対象種別、ホスト名、IPアドレス等を入力していきます。
L3SW-04_機器の登録.png

インベントリファイル欄には、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アドレスを設定する、というオペレーションを登録します。
先ほどと同じように、基本コンソールから投入オペレーションを選択します。
L3SW-05_オペレーション作成.png

画面が遷移するので、登録欄から登録開始を選択します。
投入するオペレーションの名前と実施予定日時を入力し、登録します。
L3SW-06_オペレーション作成.png

今回は「新機能APサーバー用 L3SW設定」と「新機能DBサーバー用 L3SW設定」の2つのオペレーションを登録しました。
L3SW-07_オペレーション一覧.png

メニュー定義の作成

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

パラメータ一覧となるメニュー定義の作成

オペレーションに必要となる変数一覧(Exastro ITAのメニュー定義)を作成していきます。
基本コンソール→メニュー定義/作成を選択し、メニューを作成します。
L3SW-09_メニュー作成.png

パラメータを設定したら「項目」を選択し、新しい項目を増やしてパラメータを追加していきましょう。

実行時に代入される具体値の設定

基本コンソールから入力用→登録したメニュー定義(ここではCisco L3SW設定)を選択し、登録開始を選択します。
L3SW-10_具体値入力.png

登録作業では、これまでの作業で登録した機器、オペレーション、パラメータに設定する具体値をそれぞれ入力していきます。
L3SW-11_具体値入力.png

Playbookの登録

実際にCisco L3SWに設定するためのPlaybookを登録しましょう。
Ansible-Legacy→プレイブック素材→登録欄から登録開始を選択します。
L3SW-12_Playbook登録.png

プレイブック素材名にはアップロードするPlaybookの分かりやすい名前を入力し、プレイブック素材欄でローカルからPlaybookをアップロードします。

L3SW-13_Playbookアップロード.png

Movementの登録

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

L3SW-14_Movement登録.png

Movement名は登録するMovementの分かりやすい名前を、ホスト指定形式はIPもしくはホスト名を選択します。
必要に応じてヘッダーセクション欄にPlaybookに必要なヘッダー情報を追記しましょう。
今回の記事では不要です。
L3SW-15_Movementヘッダー登録.png

次に、Movementにプレイブック素材を紐付けます。
Ansible-Legacy→Movement詳細→登録欄から登録開始を選択します。
L3SW-16_Movementとプレイブック紐付け.png

Movementには先ほど登録したMovementを選択、プレイブック素材には登録したプレイブックを、インクルード順序にはプレイブックを実行する順序を入力します。
L3SW-17_Movementとプレイブック紐付け.png

インクルード順序とは

一つのMovementに複数のプレイブック素材を登録する場合、実行順序を指定したい場合があります。
今回のようにVLAN IDを作成してから、作成したVLAN IDのIPv4アドレス設定の場合はそれにあたります。
このような場合、インクルード順序で指定すれば実行順序を保つことが出来ます。
L3SW-18_インクルード順序.png

これでMovementの登録とプレイブックの紐付けが完了しました。

代入値登録

登録した2つのオペレーションにそれぞれパラメータを登録していきましょう。
ここでは、最初に作成したメニュー定義とMovement(プレイブック)に登録された変数を結びつけてパラメータを投入していきます。
ここまでの作業を整理したものを示します。
L3SW-19_ここまでの作業整理.png

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→代入値自動登録設定→登録欄から登録開始します。
L3SW-20_代入値自動登録設定.png

具体値は先ほどメニュー定義の「入力用」で設定したものから自動で登録されます。
L3SW-21_代入値自動登録設定.png

Conductorでの実行

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

画面右下から登録したMovementをドラッグ・アンド・ドロップでパレットに配置します。

配置したパレットのINとOUTをドラッグ・アンド・ドロップすることで連結し、フローを作成出来ます。
右下のタブをFunctionに切り替えることで分岐や他のConductorの呼び出しが行えます。
L3SW-23_Conductor操作.png

作成と保存が終わったら実行してみましょう。

メニューグループ→Conductor→Conductor実行を選択すると画面が遷移します。

Conductor[一覧]から実行したいConductorを呼び出し、実行したいオペレーションを選択するとConductorが表示されます。
L3SW-24_Conductor実行.png

間違いがなければ実行ボタンを選択しましょう。

以上でExcastro ITAを使ったCisco L3SWの設定は完了です。

無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認しましょう。
#show startup-config
L3SW-25_実行結果.png

補足: アップロードしたPlaybookの確認

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

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 }}
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
save_config.yml
---
- 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設定を追加するための作業の流れは以下のようになります。

  1. 新規WEBサーバー用のPool作成
  2. 新規WEBサーバー用のNode作成
  3. 作成したPoolにNodeメンバー登録
  4. 新規WEBサーバー用の仮想サーバー作成 BIG-IP-06.png

機器の登録

Exastro ITAで設定されるBIG-IPを登録します。

BIG-IP-10_機器登録.png

BIG-IPの設定ではAnsibleのbigipモジュールを使用するため、インベントリファイル欄には以下を記載しておきます。

bigip_user: admin
bigip_delegate_to: localhost

最後に登録ボタンを選択して登録完了です。

メニュー定義と具体値入力

BIG-IPでWEBサーバー用の新たなロードバランス設定を追加する、というオペレーションを登録します。

同じように、基本コンソールから投入オペレーションを登録します。

image.png

今回は以下2つのオペレーションを登録しました。

  • 新機能WEBサーバー用 LB設定
  • 新機能WEBサーバー用 LB設定追加

メニュー定義の作成と具体値の入力

L3SWと同じように、オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。

メニュー定義の作成

オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。
BIG-IP-08_メニュー.png

具体値の入力

続けて作成したメニュー定義に対する具体値を入力します。
BIG-IP-09_具体値.png

Playbookの登録

実際にBIG-IPに設定するためのPlaybookを登録します。
今回は以下の4つのPlaybookを登録しました。

image.png

Movementの登録

先ほど登録したプレイブック素材を組み合わせてMovementを登録していきます。

image.png

Conductorでの実行

無事にオペレーションの登録が終わったら、これらをConductorを使って実行してみましょう。
作成したConductorはこのようになります。
image.png

間違いがなければ実行ボタンを選択します。
無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認します。
BIG-IP-07_実行結果.png

補足: アップロードしたPlaybookの確認

アップロードしたBIG-IPのPlaybookを記載しておきます。

create_pool.yml
---
- 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
create_node.yml
---
- 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
add_node_to_pool.yml
---
- 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
create_virtual_server.yml
---
- 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定義を追加するための作業の流れは以下のようになります。

(コンフィグバックアップ)
1. 新規WEBサーバー用の仮想IPアドレス作成
2. 新規WEBサーバー用の(穴あけ用)IPアドレス範囲作成
3. 新規WEBサーバー~新規APサーバーのスタティックルート作成
4. FWポリシーの新規定義
FortiGate-05.png

機器の登録

まずはExastro ITAで設定されるFortiGateを登録します。
FortiGate-08_機器一覧.png

Ansibleのfortiosモジュールを使用するため、インベントリファイル欄には以下を入力します。
ansible_network_os: fortios
最後に登録ボタンを選択して登録完了です。

メニュー定義と具体値入力

新規WEBサーバー用の新たなFW定義を追加する というオペレーションを登録します。
設定内容はL3SW, BIG-IPと大きく変わりはありません。
image.png

メニュー定義の作成

オペレーションに必要なパラメータ一覧と実行時に代入される具体値をそれぞれ設定していきます。
FortiGate-06.png

具体値の入力

続けて作成したメニュー定義に対する具体値を入力します。
FortiGate-07.png

Playbookの登録

実際にBIG-IPに設定するためのPlaybookを登録します。
image.png

Movementの登録

先ほど登録したプレイブック素材を組み合わせてMovementを登録していきます。
FortiGate-03.png

Conductorでの実行

無事にオペレーションの登録と代入値設定が終わったら、これらをConductorを使って実行してみましょう。

image.png

無事に完了したら対象機器にログインして、思ったとおりに設定されているか確認します。
FortiGate-04.png

補足: アップロードしたPlaybookの確認

アップロードしたFortiGateのPlaybookを記載しておきます。

create_virtual_ip.yml
---
- 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"
create_static_route.yml
---
- 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 }}"

create_firewall_address_range.yml
---
- 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 }}"
create_firewall_policy.yml
---
- 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としての作り方は大きく変わります。
ぜひ、自分で触ってみることをオススメします。

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18