pyATSを体験しよう！ 

※注意書き  
自動化についてというよりも、advent calenderでたくさん紹介されている
pyATS/Genieって何？色々自動的にはできるんだけどどうやって試せばいいの？
といった方々に向けての導入したい人向け、わかんないけどとにかく触ってみたい！
といった人向けの記事となります  

### 前提条件  
  
- DevNetのアカウントを所持していること。  
Ciscoのパートナーアカウントのようなものでなくだれでも作ることができるものなので  
この機会にぜひ作ってみてください。  
下記に参考URLをおいてます。
  
https://community.cisco.com/t5/devnet-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/devnet%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%82%88%E3%81%86/ta-p/3923720
  
- Cisco Anyconnectをインストールし、DevNetのsandboxにアクセスできること。  
これもDevNetのアカウントを作成したあと、sandboxページにsandbox labへんもアクセスの仕方  
のようなページがあるのでそちらを参考にしてみてください。  
またのちほど簡易的に紹介しますので改めてそちらも確認してみてください。

### 参考資料  
DevNetのページにてLearning Labという勉強用のページが複数あります。
SD-WAN、ACIといった色んなコンテンツがあるのですが、今回はpyATSに絞っています。
基本的にその学習用ページのStepに沿って一つ一つやっていけばチュートリアルになるようにできています。
  
Introduction to pyATS
https://developer.cisco.com/learning/lab/intro-to-pyats/step/1
  
  
今回はそのチュートリアルをやっている部分を画像やログを通してより敷居を低くしよう
といった記事となります。断じて手抜きというわけではありません。

### Step1 : pyATSの導入・事前準備  
- まずLabをReserveしましょう。
上記のIntroduction to pyATSのURLに行くとstep1のページにいくはずです。![reserve1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374565/369ffc0a-9f35-da26-2178-2463704f52d6.png)
  
ここで上記の画像で赤枠に囲った部分のURLを踏みましょう。
そうしますとSandboxのカタログページにとぶことができます。
  
![reserve2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374565/f7d16306-0ee4-d911-9538-2aa112b2e5d9.png)

そうしますと、先ほどのpyATSのページに記載のあった"Multi-IOS Cisco Test Network"
のラボをReserveしましょう。
"RESERVE"を押すと、こんなダイアログページがでてきます。  

![reserve3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374565/f9e2a65a-6804-9ebf-c0d2-4c39550b1f0e.png)


ここで予約する時間帯を指定します。注意する点が一つありまして、
青枠の部分をちゃんと日本時間になっているかどうか確認してください。
日本時間で予約したつもりがアメリカ時間で予約していて全然準備ができましたというメールが
こなくてなんで？となったことがある人がここにいます。
  
またとれる期間もだいたい二日間が限界です。それ以上とろうとするとエラーがでますのでご注意を。
予約した時間になると、Ciscoから準備ができましたというメールが来ます。  
![reserve4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374565/6a285972-95f5-01d8-e2a6-9748e07df485.png)


そこにラボアクセスのためのVPNの情報が記載されています。
ここでCisco AnyConnectというVPN接続用のアプリケーションがありますので
予約した時間が来る前にダウンロードしておきましょう。  
  
cisco AnyConnect ダウンロードページ
https://developer.cisco.com/site/sandbox/anyconnect/  

Instalation guide
https://devnetsandbox.cisco.com/Docs/VPN_Access/AnyConnect_Installation_Guide.pdf  
  
DevNetページにもURLが貼ってあるのですが念のため  
  
インストールができたらあとはメールに記載されているVPNの情報を
Cisco AnyConnectに入力してVPN接続できるようにするだけです。
準備が完了したら、teratermなどterminalソフトでssh接続できるかどうか試してみてください。
接続情報はRESERVEしたLabページに情報が記載してあります。

### Step2 : そもそもpyATSとはなんぞや  
  
大変申し訳ないですが、私の説明よりも、Advent calenderで前にpyATSのことを
書かれている人のものを見たほうが理解しやすいでしょう。
今回の本旨はとにかく触ってみよう！なので細かい部分は省略いたします。
  
その代わりといっては何ですが私がよく参考にさせていただいているページをご紹介させていただきます。  
  
参考ページ
https://qiita.com/advent-calendar/2019/network-automation  
  
pyATS/Genie: testbed.yaml の作り方の色々とYAMLファイルの確認方法
https://ccieojisan.net/post-1924/
↑特にこの方のブログでは詳細に紹介されているのでお勧めです。  
  
### Step3 : pyATSで遊ぼう!  
  
-  DevNetでpyATSを試すための環境を作りましょう。
    
DevNetのLabにアクセスできるようになりSSH接続できるようになれば
後は基本的にチュートリアル通りに進むだけです。
次の順序でコマンドを打っていきましょう。
  
1.gitからサンプルコードをcloneしましょう
 git clone https://github.com/CiscoDevNet/pyats-ios-sample.git  

```
[developer@devbox ~]$ git clone https://github.com/CiscoDevNet/pyats-ios-sample.git
Cloning into 'pyats-ios-sample'...
remote: Enumerating objects: 73, done.
Unpacking objects:   1% (1/73)   Unpacking objects:   2% (2/73)   Unpacking objects:   4% (3/73)   Unpacking objects:   5% (4/73)   Unpacking objects:   6% (5/73)   Unpacking objects:   8% (6/73)   Unpacking objects:   9% (7/73)   Unpacking objects:  10% (8/73)   Unpacking objects:  12% (9/73)   Unpacking objects:  13% (10/73)   remote: Total 73 (delta 0), reused 0 (delta 0), pack-reused 73
Unpacking objects:  15% (11/73)   Unpacking objects:  16% (12/73)   Unpacking objects:  17% (13/73)   Unpacking objects:  19% (14/73)   Unpacking objects:  20% (15/73)   Unpacking objects:  21% (16/73)   Unpacking objects:  23% (17/73)   Unpacking objects:  24% (18/73)   Unpacking objects:  26% (19/73)   Unpacking objects:  27% (20/73)   Unpacking objects:  28% (21/73)   Unpacking objects:  30% (22/73)   Unpacking objects:  31% (23/73)   Unpacking objects:  32% (24/73)   Unpacking objects:  34% (25/73)   Unpacking objects:  35% (26/73)   Unpacking objects:  36% (27/73)   Unpacking objects:  38% (28/73)   Unpacking objects:  39% (29/73)   Unpacking objects:  41% (30/73)   Unpacking objects:  42% (31/73)   Unpacking objects:  43% (32/73)   Unpacking objects:  45% (33/73)   Unpacking objects:  46% (34/73)   Unpacking objects:  47% (35/73)   Unpacking objects:  49% (36/73)   Unpacking objects:  50% (37/73)   Unpacking objects:  52% (38/73)   Unpacking objects:  53% (39/73)   Unpacking objects:  54% (40/73)   Unpacking objects:  56% (41/73)   Unpacking objects:  57% (42/73)   Unpacking objects:  58% (43/73)   Unpacking objects:  60% (44/73)   Unpacking objects:  61% (45/73)   Unpacking objects:  63% (46/73)   Unpacking objects:  64% (47/73)   Unpacking objects:  65% (48/73)   Unpacking objects:  67% (49/73)   Unpacking objects:  68% (50/73)   Unpacking objects:  69% (51/73)   Unpacking objects:  71% (52/73)   Unpacking objects:  72% (53/73)   Unpacking objects:  73% (54/73)   Unpacking objects:  75% (55/73)   Unpacking objects:  76% (56/73)   Unpacking objects:  78% (57/73)   Unpacking objects:  79% (58/73)   Unpacking objects:  80% (59/73)   Unpacking objects:  82% (60/73)   Unpacking objects:  83% (61/73)   Unpacking objects:  84% (62/73)   Unpacking objects:  86% (63/73)   Unpacking objects:  87% (64/73)   Unpacking objects:  89% (65/73)   Unpacking objects:  90% (66/73)   Unpacking objects:  91% (67/73)   Unpacking objects:  93% (68/73)   Unpacking objects:  94% (69/73)   Unpacking objects:  95% (70/73)   Unpacking objects:  97% (71/73)   Unpacking objects:  98% (72/73)   Unpacking objects: 100% (73/73)   Unpacking objects: 100% (73/73), done.
[developer@devbox ~]
```

2.directoryを移動してシミュレーション環境を立ち上げましょう
cd pyats-ios-sample
virl up

```
[developer@devbox ~]$cd pyats-ios-sample
[developer@devbox pyats-ios-sample]$
[developer@devbox pyats-ios-sample]$
[developer@devbox pyats-ios-sample]$virl up
Creating default environment from topology.virl
Localizing rsa modulus 768 with: rsa modulus 1024
[developer@devbox pyats-ios-sample]$

```

3.環境が立ち上がったか確認しましょう
virl nodes
立ち上がっていた場合下記のようになっているかと思います。
もしStateがACTIVEになっていなかった場合、時間がたってからretryしてみてください。  


```
[developer@devbox pyats-ios-sample]$virl nodes
Here is a list of all the running nodes
+-----------+----------+---------+-------------+------------+----------------------+--------------------+
| Node      | Type     | State   | Reachable   | Pro+ocol   | Management Address   | E|+er+al Address   |
+-----------+----------+---------+-------------+------------+----------------------+--------------------+
| ios1      | IOSv     | ACTIVE  | REACHABLE   | telnet     | 10.255.0.5           | N/A                |
+-----------+----------+---------+-------------+------------+----------------------+--------------------+
| ios2      | IOSv     | ACTIVE  | REACHABLE   | telnet     | 10.255.0.6           | N/A                |
+-----------+----------+---------+-------------+------------+----------------------+--------------------+
| ~mgmn-lxc | mgmt-lxc | ACTIVE  | REACHABLE   | ssh        | 10.255.0.4           | 172.16.30.60       |
+-----------+----------+---------+-------------+------------+----------------------+--------------------+
[developer@devbox pyats-ios-sample]$
[developer@devbox pyats-ios-sample]$
```

4.pyATS実行用のtestbed fileを生成します。
virl generate pyats
※今回はsample code内に本シミュレーション用に自動生成してくれるスクリプトがあるのでそちらを使用しています。  
 
```
[developer@devbox pyats-ios-sample]$virl generate pyats
Writing default_testbed.yaml
```

5.生成されたtestbed fileの中身を確認します。
cat default_testbed.yaml


```
[developer@devbox pyats-ios-sample]$cat default_testbed.yaml
testbed:

  name: pyats-ios-sample_default_27GGKj

  tacacs:
      username: "%ENV{PYATS_USERNAME}"
  passwords:
      tacacs: "%ENV{PYATS_PASSWORD}"
      enable: "%ENV{PYATS_AUTH_PASS}"
      line: "%ENV{PYATS_PASSWORD}"
  servers:
    
    ~mgmt-lxc:
      address: 172.16.30.60
      server: ~mgmt-lxc

    

devices:

  ios1:
    alias: ios1
    os: ios
    type: IOSv
    connections:

      defaults:
        class: unicon.Unicon
      console:
        protocol: telnet
        ip: 10.10.20.160
        port: 17023
    custom:
      abstraction:
        order: [os, type]

  ios2:
    alias: ios2
    os: ios
    type: IOSv
    connections:

      defaults:
        class: unicon.Unicon
      console:
        protocol: telnet
        ip: 10.10.20.160
        port: 17025
    custom:
      abstraction:
        order: [os, type]

topology:
  ios1:
    interfaces:
      GigabitEthernet0/1:
        ipv4: 10.10.10.1/24
        link: ios1-to-ios2
        type: ethernet
      GigabitEthernet0/0:
        ipv4: 10.255.0.5/16
        link: guest
        type: ethernet
  ios2:
    interfaces:
      GigabitEthernet0/1:
        ipv4: 10.10.10.2/24
        link: ios1-to-ios2
        type: ethernet
      GigabitEthernet0/0:
        ipv4: 10.255.0.6/16
        link: guest
        type: ethernet
[developer@devbox pyats-ios-sample]$
[developer@devbox pyats-ios-sample]$
```
生成された中身はこんな感じです。
yamlファイルなのでAnsibleなどで慣れている人にはわかりやすいかもしれません。

6.それでは実行してみましょう。  

```
[developer@devbox pyats-ios-sample]$make test
<省略>
2019-12-15T11:09:10: %EASYPY-INFO: +------------------------------------------------------------------------------+
2019-12-15T11:09:10: %EASYPY-INFO: |                             Task Result Summary                              |
2019-12-15T11:09:10: %EASYPY-INFO: +------------------------------------------------------------------------------+
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.commonSetup                                     PASSED
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.PingTestcase[device=ios1]                       PASSED
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.PingTestcase[device=ios2]                       PASSED
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.VerifyInterfaceCountTestcase[device=ios1]       PASSED
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.VerifyInterfaceCountTestcase[device=ios2]       PASSED
2019-12-15T11:09:10: %EASYPY-INFO: Task-1: pyats_ios_example.commonCleanup                                   PASSED

```
全体の出力結果はもっと長く、何をしているのか細かい動作のメッセージが出力されるので
実際に確認してみてください。

今回やっていることは出力されているメッセージをみればわかりますが一応解説を。

1.ios1,2に接続できるようにする
2.ios1,2に相互でping疎通テスト
3.以下showコマンドでの確認
show version
show ip interface brief


### まとめ  
これで体験という意味では終わりとなります。
今回pyATSの中身や機能については一切触れておりませんが、このチュートリアルを行うことでどういった学習が必要か
イメージがつかめるようになると思います。

このチュートリアルを体験というレベルで終わらせないためには、ここから実行コードの中身を調べたり、
pyATS関連のドキュメントを読み進めていくといいと思います。

私自身実際にどんなふうに動くのかイメージがわからないとどうやって勉強すればわからなかったですが
このDevNetのチュートリアルをやって、実際に実行したコードの中身などを読んでみてようやく学習方針を決めた人間です。
また、友人にも勉強してみたいけど環境ってどうやって用意すればいいのか、
英語のドキュメントに抵抗感があるという人もいたのでこのような形で投稿してみました。  

これから勉強しようと思う人たちの一助になれば幸いです。