AnsibleでArista EOSへ接続する方法を説明します。Ansibleでサーバ機器を操作する場合はPythonスクリプトを他機器へ転送する挙動になりますが、ネットワーク機器を操作する場合は「network_cli」と呼ばれる特殊な接続方法を使用します。
ネットワーク機器を操作する時は「network_cli」を使うのが多数派です。ですが、BIG-IPは「local」と呼ばれる接続を使うように例外もある事もご留意ください。
事前準備
Arista EOS SSH接続許可設定
Ansibleでネットワーク機器を操作するにはsshで接続する必要があります。telnetによる接続方法もありますが、telnetは従来のTeraTermマクロのようなexpectの仕組みを使うため、非常に難解な実装を求められます。そのため、特別な理由がない限りはsshを接続許可しましょう。
Arista EOSに対してSSH接続を許可する設定例は以下の通りです。
username admin secret admin
それではSSHログインが可能である事を確かめましょう。
# ssh 192.168.9.64 -l admin Password: R64>enable R64#
paramikoインストール
Ansibleでネットワーク機器を操作するにはparamikoと呼ばれるモジュールが必要です。paramiko未インストールの場合は以下のようなエラーメッセージが出力されます。
# ansible-playbook -i inventory.ini arista_eos_show_version.yml PLAY [arista_eos] ************************************************************** TASK [send show version] ******************************************************* An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible.module_utils.connection.ConnectionError: paramiko is not installed: No module named 'paramiko' fatal: [arista64]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/root/.ansible/tmp/ansible-local-2040jdt2d07n/ansible-tmp-1598601876.9596963-2046-258754605974205/AnsiballZ_eos_command.py\", line 102, in <module>\n _ansiballz_main()\n File \"/root/.ansible/tmp/ansible-local-2040jdt2d07n/ansible-tmp-1598601876.9596963-2046-258754605974205/AnsiballZ_eos_command.py\", line 94, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/root/.ansible/tmp/ansible-local-2040jdt2d07n/ansible-tmp-1598601876.9596963-2046-258754605974205/AnsiballZ_eos_command.py\", line 40, in invoke_module\n runpy.run_module(mod_name='ansible.modules.network.eos.eos_command', init_globals=None, run_name='__main__', alter_sys=True)\n File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\n return _run_module_code(code, init_globals, run_name, mod_spec)\n File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\n mod_name, mod_spec, pkg_name, script_name)\n File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\n exec(code, run_globals)\n File \"/tmp/ansible_eos_command_payload_jhzpc5gl/ansible_eos_command_payload.zip/ansible/modules/network/eos/eos_command.py\", line 248, in <module>\n File \"/tmp/ansible_eos_command_payload_jhzpc5gl/ansible_eos_command_payload.zip/ansible/modules/network/eos/eos_command.py\", line 219, in main\n File \"/tmp/ansible_eos_command_payload_jhzpc5gl/ansible_eos_command_payload.zip/ansible/module_utils/network/eos/eos.py\", line 637, in run_commands\n File \"/tmp/ansible_eos_command_payload_jhzpc5gl/ansible_eos_command_payload.zip/ansible/module_utils/network/eos/eos.py\", line 107, in get_connection\n File \"/tmp/ansible_eos_command_payload_jhzpc5gl/ansible_eos_command_payload.zip/ansible/module_utils/connection.py\", line 185, in __rpc__\nansible.module_utils.connection.ConnectionError: paramiko is not installed: No module named 'paramiko'\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1} PLAY RECAP ********************************************************************* arista64 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
それでは、paramikoをインストールしましょう。
pip install paramiko
インベントリファイルの作成
Arista EOSと接続できるよう以下のようなインベントリファイルを作成します。
cat << EOF > inventory.ini [arista_eos:vars] ansible_user = 'admin' ansible_password = 'admin' ansible_connection = 'network_cli' ansible_network_os = 'eos' ansible_become = 'yes' ansible_become_method = 'enable' #ansible_become_password = 'password' [arista_eos] arista64 ansible_host=172.16.0.111 EOF
ansible_network_osはOSの種類によって適宜変更が必要です。Arista EOSを使用する場合は「ansible_network_os」は「eos」を指定します。
ansible_become_methodとansible_become_passは、privilege level 15でログインする事ができるならば指定不要です。また、Aristaはenableパスワードを指定しない運用も可能ですので、その場合はansible_become_passwordを省略する事もできます。
動作確認
「show version」を実行するプレイブックを作成します。
cat << EOF > arista_eos_show_version.yml --- - hosts: arista_eos gather_facts: no tasks: - name: send show version eos_command: commands: "show version" EOF
疎通可能である事を確認するため、実行結果が「OK」となる事を確認します。
# ansible-playbook -i inventory.ini arista_eos_show_version.yml PLAY [arista_eos] ************************************************************** TASK [send show version] ******************************************************* ok: [arista64] PLAY RECAP ********************************************************************* arista64 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
現時点でshowコマンドの出力結果は表示されていませんが、showコマンドの結果を表示する方法は「Ansible操作例 – Arista EOSの操作方法の説明」で紹介します。