インフラのーと

インフラエンジニアが気になったことを書いていきます。アウトプットのための技術ブログ。

Ansible を触ってみた感想:ネットワーク自動化を目指すときの課題

最近、ネットワーク機器の設定にも Ansible を活用する話をよく聞くようになりました。よく目にするキーワードが自動化です。実際に Ansible を検証で触ってみたので、Ansible を使ってネットワーク自動化を目指すときに課題だと思ったことについてまとめます。

Ansible だけでは状態の妥当性が検証できない

Ansible を使ってネットワーク機器に対して設定をすることは出来ますが、設定後に設定対象の機器が意図した状態であるかどうかを検証することはできません。Ansible は設定 (config)の冪等性は担保してくれますが、状態(status)の正常性は確認してくれません。

ネットワーク機器の設定変更フロー

ネットワーク機器の設定変更作業がどのように行われるのか、簡単に説明します。ネットワーク機器に対して設定変更を行う際は、次のような作業が必要になります。ネットワーク自動化を実現するためには、以下のすべての作業を、人の手を介さずに出来るようになることが理想だと思いますが、Ansible が出来るのは 3. だけです。

  1. 作業前のネットワークの状態を確認
  2. config 作成
  3. config 投入
  4. config 変更後のネットワークの状態確認

ルーターに OSPF を設定してみる

次のような状態で RT4 を新しく設置することを考えます。そこで、RT4 にAnsible から以下の設定をしてみます。

  • interface address
    • Loopback0
    • Gi 0/1
    • Gi 0/2
  • OSPF

f:id:naoki029:20190610091356p:plain

ルーター側の準備

Ansible を適用するためには管理 IP と認証情報を設定しておく必要があります。ここでは、RT4 に対して、ansible ユーザーを作成し、ssh 接続のための公開鍵を登録しておきます。

RT4(config)#ip ssh pubkey-chain
RT4(config)#ip ssh pubkey-chain # ansible ユーザーの公開鍵を登録
RT4(conf-ssh-pubkey)#username ansible
RT4(conf-ssh-pubkey-user)#key-string
RT4(conf-ssh-pubkey-data)# 公開鍵をコピペ
RT4(conf-ssh-pubkey-data)#exit

RT4(config)#ip ssh server algorithm authentication publickey # 公開鍵認証を有効化

Zero touch プロビジョニングをしたければ、DHCP と TFTP サーバーを用意する方法もあります。

ルータもスイッチも、プラグ&プレイで楽々!… その2

Ansible 2.8.0 で SEIKO の SmartCS が ansible 対応したみたいなので、これと組み合わせればコンソール経由で Zero touch プロビジョニングも出来るのか気になっています。触ってみたい。

www.seiko-sol.co.jp


話がそれました。inventory と playbook は次のようにします。

inventory

[rt4]
172.16.1.74

[rt4:vars]
user=ansible

playbook rt4.yaml

- hosts: rt4
  gather_facts: false
  connection: local
  user: "{{user}}"
  tasks:
    - name: configure interface gi 0/1
      ios_config:
        lines:
          - ip address 10.0.0.10 255.255.255.252
          - ip ospf network point-to-point
          - no shutdown
        parents: interface GigabitEthernet0/1
    - name: configure interface gi 0/2
      ios_config:
        lines:
          - ip address 10.0.0.13 255.255.255.252
          - ip ospf network point-to-point
          - no shutdown
        parents: interface GigabitEthernet0/2
    - name: configure interface lo0
      ios_config:
        lines:
          - ip address 192.168.0.4 255.255.255.255
          - no shutdown
        parents: interface Loopback0
    - name: configure ospf 1
      ios_config:
        lines:
          - network 10.0.0.10  0.0.0.0 area 0
          - network 10.0.0.13  0.0.0.0 area 0
          - network 192.168.0.4 0.0.0.0 area 0
        parents: router ospf 1

Ansible 実行前の RT4 の設定と状態を確認しておきます。OSPF と Interface の設定がされていないことがわかります。

RT4#show run | section router ospf 
RT4#show run | section interface GigabitEthernet0/1
interface GigabitEthernet0/1
 no ip address
 duplex full
 speed auto
 media-type rj45
RT4#show run | section interface GigabitEthernet0/2
interface GigabitEthernet0/2
 no ip address
 duplex full
 speed auto
 media-type rj45
RT4#

続いて、show コマンドを使って RT4 の状態を確認しておきます。これで、設定前に状態が正常であることが確認できました。

RT4#show run | section router ospf
RT4#show ip int brief
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 172.16.1.74 YES NVRAM up up # 管理用
GigabitEthernet0/1 unassigned YES manual up up
GigabitEthernet0/2 unassigned YES manual up up
RT4#

Ansible を実行します。

[root@master ansible]# ansible-playbook -i inventory rt4.yaml 

PLAY [rt4] ****************************************************************************

TASK [configure interface gi 0/1] *****************************************************
changed: [172.16.1.74]

TASK [configure interface gi 0/2] *****************************************************
changed: [172.16.1.74]

TASK [configure interface lo0] ********************************************************
changed: [172.16.1.74]

TASK [configure ospf 1] ***************************************************************
changed: [172.16.1.74]

PLAY RECAP ****************************************************************************
172.16.1.74                : ok=4    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master ansible]#

設定を確認してみます。Interface と OSPF の設定がされていることがわかります。

RT4#show run | section interface GigabitEthernet0/1
interface GigabitEthernet0/1
 ip address 10.0.0.10 255.255.255.252
 ip ospf network point-to-point
 duplex full
 speed auto
 media-type rj45
RT4#show run | section interface GigabitEthernet0/2
interface GigabitEthernet0/2
 ip address 10.0.0.13 255.255.255.252
 ip ospf network point-to-point
 duplex full
 speed auto
 media-type rj45
RT4#show run | section interface Loopback0
interface Loopback0
 ip address 192.168.0.4 255.255.255.255
RT4#show run | section router ospf
router ospf 1
 network 10.0.0.10 0.0.0.0 area 0
 network 10.0.0.13 0.0.0.0 area 0
 network 192.168.0.4 0.0.0.0 area 0

続いて状態を確認してみます。 インターフェースに対して IP が設定され、OSPF のネイバーが確立しており、状態が正常であることが確認できます。

RT4#show ip int brief
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0/0         172.16.1.74     YES NVRAM  up                    up      
GigabitEthernet0/1         10.0.0.10       YES manual up                    up      
GigabitEthernet0/2         10.0.0.13       YES manual up                    up      
Loopback0                  192.168.0.4     YES manual up                    up      
RT4#
RT4#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.0.1       0   FULL/  -        00:00:39    10.0.0.14       GigabitEthernet0/2
192.168.0.3       0   FULL/  -        00:00:33    10.0.0.9        GigabitEthernet0/1
RT4#

これで、Ansible を使って RT4 に対して設定変更を行うことができました。

上記で示したように、ネットワーク機器に対して設定を行う際は、設定の前後で機器の状態が正しいかどうか確認する必要があります。実施に以下の内容を手動で確認しています。

  • インターフェースの状態が up であるかどうか。
  • OSPF のネイバーが確立できているかどうか。
    • State が FULL であるか。

これらの状態は、設定対象の機器の状態にのみ依存するものではありません。自分以外の機器の状態に大きく依存します。ネットワークの状態が正しいかどうかは Ansible は判断してくれません。サーバー向けの yum モジュールであれば、特定のパッケージがインストールされている状態であるかどうかをチェックし、その上でサーバーに対して操作を行いますが、ネットワーク機器の状態は見てくれません。

Ansible を実行した後のルーターの状態が正しいかどうかどうかは人が確認する必要があります。もちろん Ansible でも show コマンドの結果を出力する方法はありますが、あくまで結果を表示するだけです。判断してくれるのは、playbook に書かれた設定が投入されているかどうかだけです。

状態の妥当性を自動で検証したければ、show コマンドの出力を解析する方法を別途用意する必要があります。これがネットワーク自動化を目指す上での課題かなと思っています。頑張って解析スクリプトを書いていくうちに、「これ SNMP でやった方が早いんじゃ。。。」ないみたいなことになりそうだなと思いました。

ネットワーク機器を Ansible で設定できると、何が嬉しいのか

Ansible を使うことで、サーバーやアプリケーションといったネットワーク機器以外のものと一緒に設定を行えることが最大のメリットだと思いました。

Ansible はプログラムの中で conf t が出来る環境を提供してくれます。これまではプログラム上でネットワーク機器の設定を行おうとした場合、sshtelnet を介した対話的なシェルをプログラム上で制御する必要がありました。Ansible を使えば、この辺を上手くラッピングしてくれているので、対話的なシェルを意識することなく、上位レイヤーからネットワークの設定を簡単に行うことがとができます。

スイッチ、ルーターは、アプリケーション同士が通信を行うために存在しています。ネットワーク機器のみが単体で設置されることはありません。そこには必ず接続してくるサーバーなりクライアントが存在します。スイッチ、ルーター、サーバーを接続した上で、Ansible を活用することでアプリケーションに必要なすべての機器の設定を一括で行うことが出来るようになります。逆にネットワークだけだと、費用対効果が低いような気がしています。ネットワークのみではなく、インフラ、アプリケーションも含めて一括で展開できるようになることを目指すべきだと、実際に触ってみて思いました。