■ はじめに
現在開発中の Ansible 2.7 (develブランチ) で、ネットワーク機器への 参照系コマンドを実行するモジュール cli_command
が登場したことを知りました。
Ansible 2.7 New Modules
— Carlin (@curry9999) 2018年8月7日
2018/08/07
cli_command
名前の通り、ネットワークデバイスに対して、任意のコマンドを投げるモジュールです。色々な場面で使用できる反面、カオスなPlaybookにならないよう注意が必要だと思います。#ansiblehttps://t.co/9mtIDyD3W0
Ansible 2.7 の ROADMAP を眺めていたときにモジュール名だけは見たことがあったのですが、実際に devel にマージされたようなので、Junos と IOS で試した結果を記載します。
なお、同じく Ansible 2.7 で開発中の 設定系 コマンドを投入するモジュール cli_config については「Ansible 2.7 で導入予定のネットワークモジュール cli_configを試す」をご参照ください。
基本情報
cli_command モジュール 公式ドキュメント
cli_command - Run a cli command on cli-based network devices — Ansible Documentation
対応プルリク
コード (cli_command.py)
ansible/cli_command.py at devel · ansible/ansible · GitHub
※現在(2018/8/7)開発中のため、仕様が変わる可能性があります。後日確認時点で、リストで指定する commands
オプションから、文字列で指定する command
オプションに変更されています。詳細は、公式ドキュメントをご参照ください。
■ 準備(開発版 Ansible のインストール)
pip install git+https://github.com/ansible/ansible.git@devel
現在、これで開発中の Ansible 2.7 がインストールされます。
■ Juniper Junos で試す
インベントリファイル
以下のインベントリファイルを用意します。今回は各変数は Playbook 内で定義することにします。
[junos] 172.16.0.1
Playbook
今回は、show version
コマンドの結果を画面に表示するだけの、以下の Playbook を用意します。
ポイントは、コネクションタイプに network_cli
を指定するところです。通常の、Junos に対しては、netconf
を指定して、NETCONF で接続することが多いかと思いますが、 cli_command
モジュールは netconf
には対応していません。
他、ansible_network_os
変数も(私が)忘れがちですが、指定します。
- hosts: junos gather_facts: no tasks: - name: command test cli_command: commands: - show version register: result - name: debug debug: msg: "{{ result.stdout_lines[0] }}" vars: ansible_connection: network_cli ansible_network_os: junos ansible_user: testuser ansible_ssh_pass: testuserpsss
実行
無事に実行され、 show version
の結果が表示されました。
(ansible27) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory junos_27.yml PLAY [junos] *************************************************************************** TASK [command test] ******************************************************************** ok: [172.16.0.1] TASK [debug] *************************************************************************** ok: [172.16.0.1] => { "msg": [ "Hostname: vsrx1", "Model: firefly-perimeter", "JUNOS Software Release [12.1X47-D15.4]" ] } PLAY RECAP ***************************************************************************** 172.16.0.1 : ok=2 changed=0 unreachable=0 failed=0
なお、ansible_connection: netconf
を指定した場合は、以下のエラーになります。
connection type netconf is not valid forthis module
■ Cisco IOS で試す
インベントリファイル
Junosのときと同様、変数は Playbook 内で定義することにします。
[ios] 172.16.0.2
Playbook
- hosts: ios gather_facts: no tasks: - name: command test cli_command: commands: - show version register: result - name: debug debug: msg: "{{ result.stdout_lines[0] }}" vars: ansible_connection: network_cli ansible_network_os: ios ansible_user: testuser ansible_ssh_pass: testuserpass
実行
無事に実行され、 show version
の結果が表示されました。
(ansible27) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory ios_27.yml PLAY [ios] ******************************************************************************************************************* TASK [command test] ********************************************************************************************************** ok: [172.16.0.2] TASK [debug] ***************************************************************************************************************** ok: [172.16.0.2] => { "msg": [ "Cisco IOS XE Software, Version 16.08.01a", "Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1a, RELEASE SOFTWARE (fc1)", "Technical Support: http://www.cisco.com/techsupport", "Copyright (c) 1986-2018 by Cisco Systems, Inc.", "Compiled Tue 03-Apr-18 18:43 by mcpre", (...略...) ] } PLAY RECAP ******************************************************************************************************************* 172.16.0.2 : ok=2 changed=0 unreachable=0 failed=0
■ Junos も IOS もまとめて試す
お気づきかもしれませんが、前述の Junos 向け Playbook と、IOS 向け Playbook の差分は、 hosts
と ansible_network_os
しかありません。そのため、変数定義の方法を工夫することで、Playbook は1つにまとめる事ができます。
準備するファイルは、インベントリファイル、変数ファイル、Playbook です。
イベントリファイル
[junos] 172.16.0.1 [ios] 172.16.0.2
変数ファイル
- group_vars/junos.yml
ansible_connection: network_cli ansible_network_os: junos ansible_user: testuser ansible_ssh_pass: testuserpass
- group_vars/ios.yml
ansible_connection: network_cli ansible_network_os: ios ansible_user: testuser ansible_ssh_pass: testuserpass
もっと工夫の余地がありますが、あまりファイル数が増えてもサンプルとして見通しが悪くなるため、この辺にしておきます。
Playboook
前述のプラットフォーム別の Playbook との違いは hosts: all
にしたことと、変数定義をしなくなったことです。
これでプラットフォーム固有の記述はなくなりました。
- hosts: all gather_facts: no tasks: - name: command test cli_command: commands: - show version register: result - name: debug debug: msg: "{{ result.stdout_lines[0] }}"
実行
1つの Playbook で Junos、IOS の両方の show version
コマンドの結果を表示することができました。
(ansible27) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory all_27.yml PLAY [all] ************************************************************************************ TASK [command test] *************************************************************************** ok: [172.16.0.1] ok: [172.16.0.2] TASK [debug] ********************************************************************************** ok: [172.16.0.2] => { "msg": [ "Cisco IOS XE Software, Version 16.08.01a", "Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1a, RELEASE SOFTWARE (fc1)", "Technical Support: http://www.cisco.com/techsupport", "Copyright (c) 1986-2018 by Cisco Systems, Inc.", "Compiled Tue 03-Apr-18 18:43 by mcpre", (...略...) ] } ok: [172.16.0.1] => { "msg": [ "Hostname: vsrx1", "Model: firefly-perimeter", "JUNOS Software Release [12.1X47-D15.4]" ] } PLAY RECAP ********************************************************************************* 172.16.0.1 : ok=2 changed=0 unreachable=0 failed=0 172.16.0.2 : ok=2 changed=0 unreachable=0 failed=0
■ まとめ
簡単ですが、 cli_command
モジュールの動作を確認しました。
最近のネットワークモジュールは、プラットフォームに依存しないタイプ(内部で ansible_network_os
変数を見てプラットフォーム固有モジュールを呼ぶ?)も増えてきており、 cli_command
モジュールもその流れだと思います。