Network機器をAnsibleで操作(?)してみた

f:id:komeiy:20140820203642j:plain

RAWコマンドならいけるよねということで夜な夜な試してみましたメモです。今回、showコマンドやwr memなどしか試していないです。個人的には設定投入はエラー処理とか考えると他に任せたいなと思います。

Network機器でAnsibleの環境

新たに準備するのが面倒だったので以前に使ったvirtual boxで。古くてすいません。 opensshのバージョンは気にした方が良いです。理由は後述します。

$ ansible --version
ansible 1.9.1

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

$ sudo yum list installed | grep openssh
openssh.x86_64                     5.3p1-112.el6_7                     @updates

Ansible設定

SFTPが開いていないデバイスのために念のためscp_if_sshTrueにしておきます。 セッションは1分あれば十分と判断し、60sにしています。

$ more ansible.cfg
[defaults]
host_key_checking = False
transport=ssh
log_path=ansible.log

[ssh_connection]
scp_if_ssh=True
ssh_args = -o ControlMaster=auto -o ControlPersist=60s

インベントリはメーカーごとに分けています。ここは環境により分けて頂ければと思います。

$ more hosts
[all:vars]
ansible_ssh_user=<username>
ansible_ssh_pass=<password>

[cisco]
1.1.1.1

冒頭に書いた通りrawモジュールを使ってコマンドを打ちます。 show runを出力するtaskと出力をローカルに保存するtaskを作っています。

$ more show-run.yml
---
- hosts: cisco
  gather_facts: no

  tasks:
  - name: sh run
    raw : "show run"
    register: show_run
  - name: sh run output
    local_action: shell /bin/echo "{{ show_run.stdout }}" > /home/komei/ansible-
test/sh_run_{{ inventory_hostname }}.txt
$ ansible-playbook show-run.yml -i hosts

PLAY [cisco] ******************************************************************

TASK: [sh run] ****************************************************************
ok: [1.1.1.1]

TASK: [sh run output] *********************************************************
changed: [1.1.1.1 -> 127.0.0.1]

PLAY RECAP ********************************************************************
1.1.1.1                  : ok=2    changed=1    unreachable=0    failed=0
$ ls -la
-rw-rw-r--  1 komei komei   689 Aug 24  23:55 sh_run_1.1.1.1.txt

1つイケてないのがインデントがなくすべて前詰めになってしまう点です。。copyコマンド入れてもプロンプトが出るし何かうまい方法ないかな。。 スイッチ側の設定を書いてないですが、Ansibleなので基本的にSSH開けておけばOKです。たた、個人的にはprivilegeレベルを下げたユーザでアクセスさせたいため、show runではなくwr mem & show confで動かすつもりです。↓みたいな感じ。

$ more show-conf.yml
---
- hosts: cisco
  gather_facts: no

  tasks:
  tasks:
  - name: wr mem
    raw : "wr mem"
  - name: sh conf
    raw : "show conf"
    register: show_conf
  - name: sh conf output
    local_action: shell /bin/echo "{{ show_conf.stdout }}" > /home/komei/ansible
-test/sh_conf_{{ inventory_hostname }}.txt

その他

エラーが出た時の対処

文言通りsshpassを入れてください

TASK: [sh run] **************************************************************** 
fatal: [1.1.1.1] => to use the 'ssh' connection type with passwords, you must install the sshpass program

$ sudo yum install sshpass

opensshのバージョンによってはparamikoを使ってしまってtty周りで苦戦するかもしれません。

http://docs.ansible.com/ansible/intro_getting_started.html

However, when using Enterprise Linux 6 operating systems as the control machine (Red Hat Enterprise Linux and derivatives such as CentOS), the version of OpenSSH may be too old to support ControlPersist. On these operating systems, Ansible will fallback into using a high-quality Python implementation of OpenSSH called ‘paramiko’.

使いどころ

全台のwr memくらいなら有りかなくらいです。バージョンとかはSNMPでGETすれば良いと思いますし。ただ、RAWコマンドがうまく通らないメーカーもあったので、うーんという感じです。もう少し頑張ればわかるかな。。バックアップの仕組みはインデントの件もあるので、copyコマンドで吐き出した方が良いと思います。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

入門Ansible

入門Ansible

Ansible: Up and Running

Ansible: Up and Running