LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-15

1. はじめに

こんなこととかそんなこと
というわけで、ansibleのcoreのnetwork moduleが充実したみたいです。
# 取り上げるの遅いですよね…
## さらには続編書くのもおそいorz

(いろいろ省略…前回記事等をごらんくださいませ)
使ったのは

  • 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 ここからげっと
Catalyst 3560E IOS12.2 弄れるのがこれしかなかた

3. Vlan addするサンプルコード

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
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

2台分の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じゃなくとも、こちらの記事では別のやり方が紹介されています。
    ここからも確認できる通り、connection: local がスマートなんだと思います!

    で、中身は以下の通り。

    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のみを使って対話的な設定作業を想像しながら以下のように書いても問題なく動くようでした。

    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でいいよね
というようにならんかな…という妄想がモチベーションなのです。

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

7
7
3

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
7
7