AnsibleでCisco IOS XE(Cisco IOS含む)へ接続する方法を説明します。Ansibleでサーバ機器を操作する場合はPythonスクリプトを他機器へ転送する挙動になりますが、ネットワーク機器を操作する場合は「network_cli」と呼ばれる特殊な接続方法を使用します。
ネットワーク機器を操作する時は「network_cli」を使うのが多数派です。ですが、BIG-IPは「local」と呼ばれる接続を使うように例外もある事もご留意ください。
事前準備
Cisco IOS SSH接続許可設定
Ansibleでネットワーク機器を操作するにはsshで接続する必要があります。telnetによる接続方法もありますが、telnetは従来のTeraTermマクロのようなexpectの仕組みを使うため、非常に難解な実装を求められます。そのため、特別な理由がない限りはsshを接続許可しましょう。
Cisco IOSに対してSSH接続を許可する設定例は以下の通りです。
hostname R60 ip domain-name gokatei.go crypto key generate rsa modulus 2048 ! enable password cisco username cisco password cisco ! line vty 0 4 transport input all login local
それではSSHログインが可能である事を確かめましょう。
(venv-ans28) [root@ansible70 ~]# ssh 192.168.9.60 -l cisco Warning: Permanently added '192.168.9.60' (RSA) to the list of known hosts. ************************************************************************** * IOSv is strictly limited to use for evaluation, demonstration and IOS * * education. IOSv is provided as-is and is not supported by Cisco's * * Technical Advisory Center. Any use or disclosure, in whole or in part, * * of the IOSv Software or Documentation to any third party for any * * purposes is expressly prohibited except as otherwise authorized by * * Cisco in writing. * Password: **************************************************************** ************************************************************************** * IOSv is strictly limited to use for evaluation, demonstration and IOS * * education. IOSv is provided as-is and is not supported by Cisco's * * Technical Advisory Center. Any use or disclosure, in whole or in part, * * of the IOSv Software or Documentation to any third party for any * * purposes is expressly prohibited except as otherwise authorized by * * Cisco in writing. * ************************************************************************** R60>enab R60>enable Password: R60#
paramikoインストール
Ansibleでネットワーク機器を操作するにはparamikoと呼ばれるモジュールが必要です。paramiko未インストールの場合は以下のようなエラーメッセージが出力されます。
# ansible-playbook -i inventory.ini cisco_ios_show_version.yml PLAY [cisco_ios] *************************************************************** TASK [send show version] ******************************************************* fatal: [cisco60]: FAILED! => {"msg": "paramiko is not installed: No module named 'paramiko'"} PLAY RECAP ********************************************************************* cisco60 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
それでは、paramikoをインストールしましょう。
pip install paramiko
インベントリファイルの作成
Cisco IOSと接続できるよう以下のようなインベントリファイルを作成します。
cat << EOF > inventory.ini [cisco_ios:vars] ansible_user = 'cisco' ansible_password = 'cisco' ansible_connection = 'network_cli' ansible_network_os = 'ios' ansible_become = 'yes' ansible_become_method = 'enable' ansible_become_password = 'cisco' [cisco_ios] cisco60 ansible_host=192.168.9.60 EOF
ansible_network_osはOSの種類によって適宜変更が必要です。IOS XEはIOSとの下位互換をほぼ保っているので、IOS XEを使用する場合でも、「ansible_network_os」は「ios」を指定します。
ansible_become_methodとansible_become_passは、privilege level 15でログインする事ができるならば指定不要です。
IOSとの接続方法はまだまだ枯れておらず、バージョンアップ時に仕様変更が発生するリスクは十分あります。最新仕様は「IOS Platform Options」に記載されていますので、必ず最新仕様を確認するようにしましょう。
動作確認
「show version」を実行するプレイブックを作成します。
cat << EOF > cisco_ios_show_version.yml --- - hosts: cisco_ios gather_facts: no tasks: - name: send show version ios_command: commands: "show version" EOF
疎通可能である事を確認するため、実行結果が「OK」となる事を確認します。
# ansible-playbook -i inventory.ini cisco_ios_show_version.yml PLAY [cisco_ios] *************************************************************** TASK [send show version] ******************************************************* ok: [cisco60] PLAY RECAP ********************************************************************* cisco60 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
現時点でshowコマンドの出力結果は表示されていませんが、showコマンドの結果を表示する方法は「Ansible操作例 – Cisco IOSの操作方法の説明」で紹介します。