【Ansible】AnsibleでCisco機器を制御してみる(サンプルコード2 port設定編)


# 1. はじめに

[こんなこと](https://www.ansible.com/press/red-hat-brings-devops-to-the-network-with-new-ansible-capabilities)とか[そんなこと](https://www.redhat.com/ja/about/press-releases/red-hat-brings-devops-network-new-ansible-capabilities)
というわけで、ansibleのcoreのnetwork moduleが充実したみたいです。
＃ 取り上げるの遅いですよね…
＃＃　さらには続編書くのもおそいorz

(いろいろ省略…[前回記事](http://qiita.com/onifinger/items/4fdc70706dbbff595310)等をごらんくださいませ)
使ったのは

+ ios_config.py

でして、動作環境などは2016年3月時点の状況です。

# 2. 実行環境

|items|version|notes|
|---|---|---|
|mac OSX|10.10.x|母艦OS|
|Oracle Virtualbox|5.0.16 r105871|HV用途|
|CentOS|7.2|ansible machine|
|ansible|2.0.1.0|[ここ](http://releases.ansible.com/ansible-network/latest/)からげっと|
|Catalyst 3560E|IOS12.2|弄れるのがこれしかなかた|

# 3. Vlan addするサンプルコード
```yaml:inventory_file
[cisco]
192.168.199.2
192.168.199.3

[cisco:vars]
ansible_ssh_user=operator
ansible_ssh_pass=operators_password
enable_pass=enable
```

```yaml:add_vlan.yml
---

- hosts: all
  gather_facts: no
  
  tasks:
   - name: add vlan
     local_action:
       module: ios_config
       authorize: yes
       auth_pass: a
       username: "{{ ansible_ssh_user }}"
       password: "{{ ansible_ssh_pass }}"
       host: "{{ inventory_hostname }}"
       lines:
         - description *** config by ansible ***
         - switchport access vlan 3112
         - switchport mode access
       parents: ['interface GigabitEthernet 0/27']
       replace: block
```

２台分のCisco機器のGi0/27にVlan 3112が設定されます。

# 4. playbook解説
1. 基本的な組み立て
    手でやるなら以下です。

    ```
    $ enable
    Password:
    # conf t
    #(config) int Gi 0/27
    #(config-if) description *** config by ansible ***
    #(config-if) switchport access vlan 3112
    #(config-if) switchport mode access
    ```

2. add vlan タスク
    例によって
    local_action module内で、cisco moduleを呼びます。
    local_actionじゃなくとも、[こちらの記事](http://qiita.com/akira6592/items/7695881f91dee1036e4a)では別のやり方が紹介されています。
**[ここ](https://github.com/privateip/Ansible-Webinar-Mar2016)からも確認できる通り、connection: local　がスマートなんだと思います！**

    で、中身は以下の通り。

    ```py:playbook_detail
      local_action:
       module: ios_config                 //使いたいモジュールを宣言
       authorize: yes                     //特権モードに移行
       auth_pass: "{{ enable_pass}}"      //特権モードのパスワード
       username: "{{ ansible_ssh_user }}" //初回ログイン時ユーザ
       password: "{{ ansible_ssh_pass }}" //初回ログイン時ユーザのパスワード
       host: "{{ inventory_hostname }}"   //ループ用
       lines:                             //ここから設定コマンドに入ります
         - description *** config by ansible ***   //description追加
         - switchport access vlan 3112             //vlan3112を追加
         - switchport mode access                  //tagしないので
       parents: ['interface GigabitEthernet 0/27'] //1階層上=I/Fを定義
       replace: block                              //一種の誤り制御っぽい
    ```

    特筆すべきは、parents: と replace:だと考えます。
parents: はlines: に並んだconfigを叩く階層を指示することができ、
今回はGi0/27にvlan 3112を足したいのでこのように書きました。

    だがしかし、どうもlinesのみを使って対話的な設定作業を想像しながら以下のように書いても問題なく動くようでした。

    ```yaml:playbook_detail_other
      tasks:
   - name: add vlan
     (中略)
       lines:
         - interface Gi0/27
         - description *** config by ansible ***
         - switchport access vlan 3112
         - switchport mode access
       replace: block
    ```

   あと一つ、replace: ですが、これはlines: に並んだ入力が誤っていた場合にプッシュしないなどの制御をするような説明がありました。これの有用性はまだ検証できていません。
　　
# 5. 留意点(2016/6更新)
2016年6月現在、構成上の留意点は特になくなりました！
参考までに以前書いていたこと↓

+ RedHat印のansibleでのみ動作可
    + mac OSXのbrew installで入るversionにはNW関連のupdateが含まれない(version 1.9.4)
    + yum installで入れるansibleにも同じくupdateが含まれない
    + githubにはあるのでcloneしても可

# 6. あとがき
真のネットワーク屋さんたちはNETCONFで頑張っている感があります。
この辺はNetOpsCoding #3に幸運にも参加できることになったので
そこで情報収集したいと思います。

なぜAnsibleを頑張るかというと、オペレータ向けのオペレーションツールにおいて、
統一先候補として有力じゃないかと考えたためです。

システム運用に従事するオペレータの方々はなるだけオペ手段を統一した方が
ツール学習コストやら引き継ぎやらが楽だと考えます。
Ansibleがサーバで結構使えるということはみなさまご存知だと思いますが、
これがネットワーク機器へも適用可能だとなれば、オペはAnsibleでいいよね
というようにならんかな…という妄想がモチベーションなのです。

まだまだ道は遠いですけれども。