yamaha
Ansible

Ansible telnetモジュールでYamahaルータを操作

以前、あきばで2000円でGetしたYamaha RTX1100が僕のお家にございます。

これをAnsibleで操作しようと試したのですが、↓の方が書かれているように
Yamahaのルータはsshによるコマンド実行ができないんですねー。

https://www.bluecore.net/?p=5212

こうなってしまいます
$ ssh yamaha@10.0.0.1 'show config'
yamaha@10.0.0.1's password: 
Received disconnect from 10.0.0.1 port 22:2: Channel request 'exec' is not supported
Disconnected from 10.0.0.1 port 22

よろしいならば、2.4から加わったtelnetモジュールだということで試してみたら、こんなエラーが出ました。
※Versionは2.5.0でした

https://docs.ansible.com/ansible/2.4/telnet_module.html

$ ansible-playbook -i hosts rtx1100_telnet.yml

PLAY [rtx1100] *************************************************************************************

TASK [show config] *********************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: a bytes-like object is required, not 'AnsibleUnicode'
fatal: [10.0.0.1]: FAILED! => {"msg": "Unexpected failure during module execution.", "stdout": ""}

PLAY RECAP *****************************************************************************************
10.0.0.1                   : ok=0    changed=0    unreachable=0    failed=1   

な、なんだってー Σ(゚Д゚)
telnetlibのサンプルコードは上手く行ったのに...orz

https://docs.python.jp/3/library/telnetlib.html

ぐぐるとどうやらBugだったようで8日前にmergeされてました。

https://github.com/ansible/ansible/pull/43609

ではmergeされたのを試してみます。
いったんvenvを切って、dev版をインストール

$ python3 -m venv dev
$ source dev/bin/activate
$ python3 -m pip install git+https://github.com/ansible/ansible.git@devel

2.7.0.dev0が入りました。

$ ansible --version
ansible 2.7.0.dev0
  config file = None
  configured module search path = ['/home/lulucan/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /work/an/dev/lib/python3.5/site-packages/ansible
  executable location = /work/an/dev/bin/ansible
  python version = 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609]

これで試してみると...

$ ansible-playbook -i hosts rtx1100_telnet.yml --check

PLAY [rtx1100] *************************************************************************************

TASK [show config] *********************************************************************************
skipping: [10.0.0.1]

TASK [debug] ***************************************************************************************
ok: [10.0.0.1] => {
    "result.output": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP *****************************************************************************************
10.0.0.1                   : ok=1    changed=0    unreachable=0    failed=0   

(dev) lulucan@:nw$ ansible-playbook -i hosts rtx1100_telnet.yml 

PLAY [rtx1100] *************************************************************************************

TASK [show config] *********************************************************************************
changed: [10.0.0.1]

TASK [debug] ***************************************************************************************
ok: [10.0.0.1] => {
    "result.output": [
        "1 (Mon Apr 25 13:46:36 2011)\r\n  Copyright (c) 1994-2011 Yamaha Corporation.\r\n  Copyright (c) 1991-1997 Regents of the University of California.\r\n  Copyright (c) 1995-2004 Jean-loup Gailly and Mark Adler.\r\n  Copyright (c) 1998-2000 Tokyo Institute of Technology.\r\n  Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.\r\n  Copyright (c) 2002 RSA Security Inc. All rights reserved.\r\n  Copyright (c) 1997-2004 University of Cambridge. All rights reserved.\r\n  Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.\r\n  Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.\r\n  Copyright (c) 1998-2004 The OpenSSL Project.  All rights reserved.\r\n  Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.\r\n  Copyright (c) 2006 Digital Arts Inc. All Rights Reserved.\r\n00:a0:de:68:37:a1, 00:a0:de:68:37:a2, 00:a0:de:68:37:a3, \r\nMemory 32Mbytes, 3LAN, 1BRI\r\n>"
    ]
}

PLAY RECAP *****************************************************************************************
10.0.0.1                   : ok=2    changed=1    unreachable=0    failed=0   


キタ━(゚∀゚)━!

ちゃんと通りました。
outputが1行で戻ってくるのか...
改行で区切るtemplateにでも突っ込めばいいのかなぁ..??

Playbookはこんな感じでした。

rtx1100_telnet.yml
---
- hosts: rtx1100
  connection: local
  gather_facts: False

  tasks:
  - name: show config
    telnet:
      user: "{{ user }}"
      password: "{{ pass }}"
      login_prompt: "Password: "
      prompts:
        - "[>|#]|Password: "
      command:
        - show config
    register: result

  - debug:
      var: result.output

おしまいです。(・ω<) てへぺろ