kakkotetsu

Python が入っていない NW 機器も Ansible で (一応) 制御できる (original : 2015/02/15)

この記事は某所で 2015/02/15 に書いたもののコピーです。
そのため 2017/05/13 時点ではやや古い情報も含まれています。(以下一例)

  • Ansible のバージョンが当時の 1.8 から 2.3 くらいまであがっているので、挙動が異なる部分がある筈

.

概要

本項でやること

target に python が入っていなくても ssh 接続可能ならば Ansible で一応制御できる、ということを軽く確認します。 Linux ベースではないネットワーク機器(Cisco IOS etc)などで使える筈です。

気をつけること(≒結論)

ansible:1.8.2 では、以下を満たせばいける筈です。

  • gather_factsno にすること
  • コマンド実行 module は raw を使うこと (shellcommand ではない)
  • sshcommand で target にリモートコマンド実行できること

参考情報(公式より)

何でコマンド実行 module として raw を使うのか

Ansible の config ファイルで使える ssh 系のオプション設定

環境情報

Ansible

target device (NW機器)

Python が入っていない NW 機器代表として Juniper Firefly を使いました。 FreeBSD ベースではありますが。

  • OS:12.1X47-D10.4

サンプル

設定ファイル/Playbook

hosts

実行時に --ask-pass とか使ったり、環境変数を使ったりでパスワードベタ書きは回避可能です。

[junos]
192.168.101.70

[junos:vars]
ansible_ssh_user=kotetsu
ansible_ssh_pass=kotetsu

ansible.cfg

ssh 接続に Paramiko と OpenSSH のいずれを使うか、という話がありますが…今回はオプションが豊富な OpenSSH を使っています。

[defaults]
transport=ssh

[ssh_connection]
ssh_args= -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ControlMaster=no -o ControlPersist=60s
scp_if_ssh=false

Playbook

単純に ssh の command で show version | no-more を実行して、結果を debug で表示させるだけです。

- name: not support Python node
  hosts: junos
  gather_facts: no
  sudo: false

  tasks:
    - name: show version
      raw: show version | no-more
      register: output_show_version

    - debug: var=output_show_version

実行例

$ ansible-playbook playbook_junos.yml -i hosts

PLAY [not support Python node] ************************************************

TASK: [show version] **********************************************************
ok: [192.168.101.70]

TASK: [debug var=output_show_version] *****************************************
ok: [192.168.101.70] => {
    "output_show_version": {
        "invocation": {
            "module_args": "show version | no-more",
            "module_name": "raw"
        },
        "rc": 0,
        "stderr": "",
        "stdout": "Could not chdir to home directory /var/home/kotetsu: No such file or directory\r\nHostname: fw01\r\nModel: firefly-perimeter\r\nJUNOS Software Release [12.1X47-D10.4]\r\n",
        "stdout_lines": [
            "Could not chdir to home directory /var/home/kotetsu: No such file or directory",
            "Hostname: fw01",
            "Model: firefly-perimeter",
            "JUNOS Software Release [12.1X47-D10.4]"
        ]
    }
}

PLAY RECAP ********************************************************************
192.168.101.70             : ok=2    changed=0    unreachable=0    failed=0

雑記

  • ssh で command exec できない機器もそれなりにある筈(手元では Yamaha RTX1200 が該当)…その場合には本方式は使えないので、自前で role を作るとか、Ansible 以外の手法(e.x. 必殺の expect)を使うとかになる筈
  • 例として Junos 使っていますが、それなら netconf を使えるので(2015/02 現在、公式が出している role は貧弱ですが)本項のようなやり方はあまりしない筈
  • 本項のやり方は、あくまで exec しているだけなので、設定投入とかは tftp サーバからファイルを copy して…的な手法になりそう