2014年12月24日水曜日

Ansibleを使ってAristaSWを設定してみる

■目的
 最近サーバーの世界ではPuppet、Chef等を使い、サーバーにログインする事無く設定変更を行う技術が出てきている。
同じくNW機器にログインせずに設定変更をしたいと考え、素人ながらAnsibleを使ったAristaSW(eAPI利用)の設定変更を試してみる。
結果として今回出来たのは、show version等のコマンドの実行、vlanの作成まででした。

■参考にさせて頂いたサイト
http://komeiy.hatenablog.com/entry/2014/08/20/204111
 →私には正直テクい内容でした、もっと前提条件の所で躓いてました。
https://galaxy.ansible.com/list#/roles/1359
 →ほぼこのサイトのやり方をトライ&エラーしながら行いました。
http://qiita.com/kakkotetsu/items/944c263c1580a230a9c0
 →もっと早く出会いたかった・・・。今後参考にさせて頂きたいと思いました。

■前提
・AnsibleSV×1台 → AristaSW×1台 の全2台構成
・Ansibleを入れたSVはCentOS6.5 に 「yum install ansible」 した状態になります。
・AristaSWでは特権モードに移る為のパスワード設定は無し
・AristaSWのVersionは 割と新しい奴だった。
・AristaSWではmanageIP以外のIP接続でもeAPIを実行可能
・AristaSWに接続するIPは「10.1.1.1」
・本稿のID/PWはわかりやすい形にしています。


作業の流れとしては
①AristaSWでeAPIを有効にする。
②AnsibleSVからAristaSWにssh、パスワード無しでログイン出来るようにユーザーの作成と証明書を設定する
③AnsibleSVに公開されているeos_roleをgit or ansible-galaxy で持ってくる(本稿はansible-galaxy)
④AnsibleSVでplaybookを作って実行
という流れになります。

■事前準備
基本的には
https://galaxy.ansible.com/list#/roles/1359
のサイトのやり方通り進めます。

①AristaSWで以下の通りコマンドを実行します。
---------------------------------------------------------

Step 1. グローバルコンフィグレーションモードに移行して
switch> enable
switch# configure
switch(config)#

Step 2. eAPIを有効化
switch(config)# management api http-commands
switch(config-mgmt-api-http-cmds)# no shutdown
・「show management api http-commands」で有効になっているか確認できます。
・HTTP/HTTPSを指定できます。
#デフォルトはHTTPS
 例)no protocol https → protocol http → no shutdown
Step 3. eAPI実行用のユーザー作成(と私は解釈しました。)
switch(config)# username eapi secret icanttellyou
---------------------------------------------------------
②次にAnsibleSV→AristaSWへsshアクセスするためのAristaSW側ユーザーの作成を行います。
Step 1. AristaSWの特権モードでbashと入力するとLinuxモードに入ります。
veos> enable
veos# bash

Arista Networks EOS shell

Step 2.  ansible ユーザーの作成とssh接続用の証明書を入れるディレクトリを作成
# create the user 'ansible' with temporary password 'password'
[admin@veos ~]$ sudo useradd -d /persist/local/ansible -G eosadmin ansible
[admin@veos ~]$ echo password | sudo passwd --stdin ansible
Changing password for user ansible.
passwd: all authentication tokens updated successfully.

# prepare the home directory so we can upload an ssh key
[admin@veos ~]$ sudo mkdir /persist/local/ansible/.ssh
[admin@veos ~]$ sudo chmod 700 /persist/local/ansible/.ssh
[admin@veos ~]$ sudo chown ansible:eosadmin /persist/local/ansible/.ssh
[admin@veos ~]$ sudo ls -lah /persist/local/ansible

# exit the Linux shell and disconnect
[admin@veos01 ~]$ logout
veos#logout
Connection to veos01 closed.

Step 3. 今度はAnsibleSV側にrootログインし、サーバー側にansibleユーザーを作成する。
useradd ansible
passwd ansible

新しいパスワード:  ansible
よくないパスワード: 辞書の単語に基づいています ansible
よくないパスワード: 簡単すぎます ansible
新しいパスワードを再入力してください: ansible
passwd: 全ての認証トークンが正しく更新できました。

・ここからユーザーをansibleに変更して証明書を作成していきます。

su - ansible

ssh-keygen -t rsa
Enter passphrase (empty for no passphrase):  #ここでは無しにしました。
Enter same passphrase again:  #ここでは無しにしました。
cd /home/ansible/.ssh/

・scpを使って証明書をAristaSWにコピーします。

scp id_rsa.pub ansible@10.1.1.1:.ssh/authorized_keys


Step 4. 証明書がコピー出来たら今度はAristaSWに戻って以下を実行します。
[ansible@veos ~]$ vi /mnt/flash/rc.eos

#!/bin/sh
useradd -d /persist/local/ansible -G eosadmin ansible

Step 5. 一発リブートしておきます。
[ansible@veos ~]$ sudo reboot

ここまでの作業で
AnsibleSV(ansibleユーザー状態) → AristaSW に対してsshでパスワードを聞かれること無くログイン出来るようになっていると思います。

③AnsibleSVの準備
 ・AnsibleSVで「yum install ansible」を実行し ansible が使える状態になっている事。
 ・今回/etc/ansible 配下で「ansible-galaxy install arista.eos」を実行
  /etc/ansible/roles/arista.eos/  というディレクトリが出来てここにroleが入っている。

 ※私がやったときはansible.eos内、「eapilib-0.1.0.tar.gz」ファイルを/tmp/に移さなければ後続作業でエラーになった。

 ・hostsファイルの作成
  /etc/ansible/ に設定対象となるAristaSWを記載する
---------------------------------------------------------
   [test-arista]
    10.1.1.1
---------------------------------------------------------

 ・ansibleコマンドを使ってAristaSWとの接続が出来るか確認してみる。

       「ansible test-arista -m ping --ask-pass」

     10.1.1.1 | success >> {
         "changed": false,
         "ping": "pong"
     }
    ↑上記結果が返ってくればOK
 
   「ansible arista -m ping --ask-pass」
    のコマンドも試してみると良い。


■Playbookの作成
今回成功したのは以下の二つのplaybookだけでした。
・Playbookは/etc/ansible配下に置きました。
・commands: の所に引数で指定されたコマンドが実行されます。

・show系のcommand実行Play-book #catで開いています。
・実行の仕方は「ansible-playbook example.yaml」コマンドを実行
[ansible@localhost ansible]$ cat example.yaml
- name: arista
  hosts: arista
  gather_facts: yes
  sudo: true

  vars:
   eapi_username: eapi
   eapi_password: icanttellyou
   eapi_protocol: http
   commands:
     - show version
     - show lldp neighbors

  roles:
     - role: arista.eos

  tasks:
    - name: run an arbitrary EOS command
      action: eos_command
      args: { commands: "{{ commands }}",
              eapi_username: "{{ eapi_username }}",
              eapi_password: "{{ eapi_password }}",
              eapi_protocol: "{{ eapi_protocol }}"}
      register: eos_command_output

    - debug: var=eos_command_output

・VLAN作成のPlay-book #catで開いています。
・実行の仕方は「ansible-playbook example.yaml」コマンドを実行
[ansible@localhost ansible]$ cat vlan3.yaml
- name: arista
  hosts: arista
  gather_facts: yes
  sudo: true

  roles:
    - role: arista.eos

  tasks:
    - name: create vlan 666
      connection: local
      eos_vlan: name=test vlanid=666
                eapi_username=eapi
                eapi_password=icanttellyou
                eapi_protocol=http
                eapi_hostname={{ inventory_hostname }}

■終わり
今回ansible-galaxy上に載っているコマンドを試してみましたが上手く動かず、色々やっているうちにeAPIをHTTPSからHTTPに変えたり、ひょっとしてAristaのmanageIPからしかeAPI実行出来ないのかとか色々切り分けをしました。
基本的にはAnsibleSV→AristaSW間で認証なしsshが実施可能な状態まで持っていければ後はPlaybookの書き方がキモだなと体感。
ただ・・・アテクシrubyとか使えない人なので・・・今後勉強していこうと思います。
#playbookは基本的に人のをパクって何とか凌いでいます。

AnsibleでF5やA10等のバランサーも設定出来るようなので今後の発展に期待したいと思います。
AristaのACL制御などをAnsible使って行えたらいいなぁ~などと思ってます。

私の体験が誰かの生産性向上に役立っていただけることを祈って






0 件のコメント:

コメントを投稿