1月27日、28日に開催された NETCON at JANOG47、なかなか盛況だったみたいですね。私も作問者として参加させてもらいましたので、作った問題(300-4と300-2)について解説してみようと思います。長いので、300-4については別記事にしてあります。
なお、以下の解説ではNETCONの実際の画面や問題文ではなく、作問時に使った検証環境を用いています。見た目が違ったりすると思いますが、そのへんはご容赦ください。
300-2 概要
Ansibleを使った問題です。と言っても、Ansible自体をいろいろ設定するのではなく、Ansibleを使って機器とうまくやり取りするために何が必要なのか、という観点で作問しています。
トポロジ
各機器の初期設定
Ansible実行ホスト
検証環境はCentOS 7で、Ansbileは centos-release-ansible-29
のリポジトリからインストールしています。
$ cat ~/.ansible.cfg [defaults] deprecation_warnings=False host_key_checking=False $ cd netcon $ ls hosts pb-ping.yaml pb-show_version.yaml $ cat hosts [vEOS] 10.0.0.10 ansible_network_os=eos [vIOS] 10.0.0.20 ansible_network_os=ios [XRv] 10.0.0.30 ansible_network_os=iosxr [vSRX] 10.0.0.40 ansible_network_os=vsrx [all:vars] ansible_connection=network_cli ansible_user=netcon ansible_password=janog47 $ cat pb-ping.yaml - hosts: all gather_facts: no tasks: - name: ping ping: $ cat pb-show_version.yaml - hosts: vEOS gather_facts: no tasks: - name: Get vEOS version info eos_command: commands: show version register: sh_ver_veos - debug: var: sh_ver_veos - hosts: vIOS gather_facts: no tasks: - name: Get vIOS version info ios_command: commands: show version register: sh_ver_ios - debug: var: sh_ver_ios - hosts: XRv gather_facts: no tasks: - name: Get XRv version info iosxr_command: commands: show version register: sh_ver_xr - debug: var: sh_ver_xr - hosts: vSRX gather_facts: no tasks: - name: Get vSRX version info iosxr_command: commands: show version register: sh_ver_vsrx - debug: var: sh_ver_vsrx
vEOS
hostname vEOS ! username netcon role network-admin secret 0 JANOG47 ! interface Management1 ip address 10.0.0.10/24 no shutdown !
vIOS
hostname vIOS ! vrf definition MGMT ! address-family ipv4 exit-address-family ! aaa new-model ! ip domain name netcon.janog.gr.jp ! username netcon privilege 1 password 0 janog47 ! interface GigabitEthernet0/0 vrf forwarding MGMT ip address 10.0.0.20 255.255.255.0 no shutdown ! ip ssh version 2 ip ssh server algorithm authentication password ! line vty 0 transport input ssh
XRv
hostname XRv domain name janog.gr.jp username netcon password 7 050107012E4B1A5E ! interface MgmtEth0/0/CPU0/0 ipv4 address 10.0.0.30 255.255.255.0 no shutdown ! ssh server v2 ssh server vrf default end ※設定後、CLIで以下のコマンドを実行 crypto key generate rsa
vSRX
set system host-name vSRX set system root-authentication encrypted-password "$6$J1Q.E/cS$mbW/TzZG3oC1.qh4p2IPiZoD2eLqN5Os4sIxbRN8m0rhXY5ZDPV6JVZpritD7JI1QDNr5tW7dgzod0bFyV.3b0" set system login user netcon uid 2000 set system login user netcon class operator set system login user netcon authentication encrypted-password "$6$GkTYaxTo$4XwVFbz/uiS0F3EBq8KSqIMKCW0iGCoGCWTDKswAl7pvN4arVYHtf735IcXWbTYRhgUYlNSxr5FZ2M65ncXcD0" set interfaces fxp0 unit 0 family inet address 10.0.0.40/24
※ netcon
ユーザーのパスワード設定に失敗する場合は set system login user netcon authentication plain-text-password
を使い、janog47
を設定してください。
問題
Ansibleでshow versionを取得するPlaybookが期待通りに動作しない。
Linuxノードで以下のコマンドを実行した際に、全てのノードから show version
の結果が取得できるようにしなさい。
cd ~/netcon
ansible-playbook -i hosts pb-show_version.yaml
初期状態の確認
まずは設問のコマンドを実行してどうなるか見てみましょう。
$ cd ~/netcon $ ansible-playbook -i hosts pb-show_version.yaml PLAY [vEOS] ******************************************************************** TASK [Get vEOS version info] *************************************************** An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible.module_utils.connection.ConnectionError: Failed to authenticate: ('Bad authentication type', [u'publickey', u'keyboard-interactive']) (allowed_types=[u'publickey', u'keyboard-interactive']) fatal: [10.0.0.10]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/home/user/.ansible/tmp/ansible-local-8815SX17sd/ansible-tmp-1611997766.55-8825-196435060511469/AnsiballZ_eos_command.py\", line 102, in\n _ansiballz_main()\n File \"/home/user/.ansible/tmp/ansible-local-8815SX17sd/ansible-tmp-1611997766.55-8825-196435060511469/AnsiballZ_eos_command.py\", line 94, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/home/user/.ansible/tmp/ansible-local-8815SX17sd/ansible-tmp-1611997766.55-8825-196435060511469/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/python2.7/runpy.py\", line 176, in run_module\n fname, loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 82, in _run_module_code\n mod_name, mod_fname, mod_loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 72, in _run_code\n exec code in run_globals\n File \"/tmp/ansible_eos_command_payload_Wu9k3Z/ansible_eos_command_payload.zip/ansible/modules/network/eos/eos_command.py\", line 248, in \n File \"/tmp/ansible_eos_command_payload_Wu9k3Z/ansible_eos_command_payload.zip/ansible/modules/network/eos/eos_command.py\", line 219, in main\n File \"/tmp/ansible_eos_command_payload_Wu9k3Z/ansible_eos_command_payload.zip/ansible/module_utils/network/eos/eos.py\", line 637, in run_commands\n File \"/tmp/ansible_eos_command_payload_Wu9k3Z/ansible_eos_command_payload.zip/ansible/module_utils/network/eos/eos.py\", line 107, in get_connection\n File \"/tmp/ansible_eos_command_payload_Wu9k3Z/ansible_eos_command_payload.zip/ansible/module_utils/connection.py\", line 185, in __rpc__\nansible.module_utils.connection.ConnectionError: Failed to authenticate: ('Bad authentication type', [u'publickey', u'keyboard-interactive']) (allowed_types=[u'publickey', u'keyboard-interactive'])\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1} PLAY RECAP ********************************************************************* 10.0.0.10 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
むむむっ、最初のvEOSの実行からfailedになっています。何となく最後のあたりを見ると
ConnectionError: Failed to authenticate: ('Bad authentication type', [u'publickey', u'keyboard-interactive']) (allowed_types=[u'publickey', u'keyboard-interactive'])\n"
とか書いてあるので、認証に失敗しているようです。AnsibleはネットワークOSをCLIで制御する際は基本的にSSHで接続しますので、SSHで接続できるか確認してみましょう。え?ユーザー名とパスワードが分からない?設問のコマンドをよく見てみましょう。
ansible-playbook -i hosts pb-show_version.yaml
Ansibleで処理を行う対象ホストの情報は -i
オプションで指定した「インベントリファイル」に記載されています。まずはここで指定されているファイルを見てみるのが良さそうです。
$ cat ~/netcon/hosts [vEOS] 10.0.0.10 ansible_network_os=eos [vIOS] 10.0.0.20 ansible_network_os=ios [XRv] 10.0.0.30 ansible_network_os=iosxr [vSRX] 10.0.0.40 ansible_network_os=vsrx [all:vars] ansible_connection=network_cli ansible_user=netcon ansible_password=janog47
一番下の [all:vars]
でユーザー名とパスワードが書いてあるので、これがSSH接続に使われる情報だとわかります。
本来はここに平文パスワードを書くべきではありません。Ansible vaultを使って暗号化したり、ssh-agent によってパスフレーズの自動入力をさせるようにします。
vEOS
では早速SSH接続してみます。
$ ssh netcon@10.0.0.10 The authenticity of host '10.0.0.10 (10.0.0.10)' can't be established. ECDSA key fingerprint is SHA256:F0m4YhpFn5QBEBlB+5ZMB9LHzN6QEZ7CD1iwH3+BwvA. ECDSA key fingerprint is MD5:16:19:ab:5d:2f:06:fe:59:0e:b2:b1:54:98:98:4e:04. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.0.10' (ECDSA) to the list of known hosts. Password: (janog47を入力) Password: (janog47を入力) Password: (janog47を入力) Permission denied (publickey,keyboard-interactive).
おっと、接続できません。SSHでこのような接続エラーの場合は入力したパスワードが間違っている可能性が高いです。しかし、インベントリファイルで確認した通りのものを入れているのにどうしてでしょうか?ひょっとして、接続先ホスト側が間違っているのでしょうか?確認できるかな?
vEOS#show users accounts user: admin role: network-admin privilege level: 1 user: netcon role: network-admin privilege level: 1 vEOS#show run sec username username netcon role network-admin secret sha512 $6$.4kFsf2Hzf/Pdty7$.LkbVMiP4wLxrDmzRWH6GJTPt7uqW1/Z2DVYPZxF/
やっぱりハッシュ化されているので見えませんね…でもパスワードが間違っている以外考えられない!やってみよう!
vEOS#configure session change-netcon-password vEOS(config-s-change)#username netcon role network-admin secret janog47 vEOS(config-s-change)#show session-config diffs --- system:/running-config +++ session:/change-netcon-password-session-config @@ -12,7 +12,7 @@ ! no aaa root ! -username netcon role network-admin secret sha512 $6$.4kFsf2Hzf/Pdty7$.LkbVMiP4wLxrDmzRWH6GJTPt7uqW1/Z2DVYPZx/ +username netcon role network-admin secret sha512 $6$c9yJ5sdRD.0McDuJ$zzhb7OuuYt00I0BVaxjCOC/6yiHtIkjK9QLYMXF1 ! interface Ethernet1 ! vEOS(config-s-change)#commit
さぁどうだ…?
$ ssh netcon@10.0.0.10 Password: Last login: Sat Jan 30 09:14:24 2021 from 10.0.0.100 vEOS>exit $ ansible-playbook -i hosts pb-show_version.yaml PLAY [vEOS] ******************************************************************** TASK [Get vEOS version info] *************************************************** ok: [10.0.0.10] TASK [debug] ******************************************************************* ok: [10.0.0.10] => { "sh_ver_veos": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "stdout": [ "vEOS\nHardware version: \nSerial number:(略) } } PLAY [vIOS] ********************************************************************* TASK [Get vIOS version info] **************************************************** fatal: [10.0.0.20]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "[Errno None] Unable to connect to port 22 on 10.0.0.20"} PLAY RECAP ********************************************************************* 10.0.0.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.20 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
やった!vEOS の show version
が取れるようになった!とおもったら次は vIOS も failed …
vIOS
今度はさっきと出力が違いますね。
"[Errno None] Unable to connect to port 22 on 10.0.0.20"
port 22 に接続できないということは、SSHがデフォルトのポート22番で起動していない可能性があります。ではvIOSのSSHサーバの状態を見てみましょう。
vIOS#show ip ssh SSH Disabled - version 2.0 %Please create RSA keys to enable SSH (and of atleast 768 bits for SSH v2). Authentication methods:password Authentication Publickey Algorithms:x509v3-ssh-rsa,ssh-rsa Hostkey Algorithms:x509v3-ssh-rsa,ssh-rsa Encryption Algorithms:aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc MAC Algorithms:hmac-sha1,hmac-sha1-96 Authentication timeout: 120 secs; Authentication retries: 3 Minimum expected Diffie Hellman key size : 1024 bits IOS Keys in SECSH format(ssh-rsa, base64 encoded): NONE
「SSH Disabled」という時点でSSHが起動していないことがわかりますね。しかもその下の行に対処法まで書いてくれています。親切ですね。
%Please create RSA keys to enable SSH (and of atleast 768 bits for SSH v2).
どうやらRSA鍵が作成されていないようです。ここでいうRSA鍵とはSSHホスト鍵のことで、Ciscoのドキュメントでもコマンドを入れて作成する必要があると書いてあります。
上記ドキュメントの「RSA キー ペアを生成します。」がこの作業です。やってみましょう。作成する鍵の長さも「atleast 768 bits」とあるので、768以上にします。
vIOS#conf t Enter configuration commands, one per line. End with CNTL/Z. vIOS(config)#crypto key generate rsa The name for the keys will be: vIOS.netcon.janog.gr.jp Choose the size of the key modulus in the range of 360 to 4096 for your General Purpose Keys. Choosing a key modulus greater than 512 may take a few minutes. How many bits in the modulus [512]: 768 ←鍵長を768以上にする。512のままだとSSH version 1になる % Generating 768 bit RSA keys, keys will be non-exportable… [OK] (elapsed time was 5 seconds) vIOS(config)# *Jan 30 09:41:42.561: %SSH-5-ENABLED: SSH 2.0 has been enabled vIOS(config)#end vIOS# *Jan 30 09:41:46.732: %SYS-5-CONFIG_I: Configured from console by console vIOS#show ip ssh SSH Enabled - version 2.0 ←Enabled になった! Authentication methods:password Authentication Publickey Algorithms:x509v3-ssh-rsa,ssh-rsa Hostkey Algorithms:x509v3-ssh-rsa,ssh-rsa Encryption Algorithms:aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc MAC Algorithms:hmac-sha1,hmac-sha1-96 Authentication timeout: 120 secs; Authentication retries: 3 Minimum expected Diffie Hellman key size : 1024 bits IOS Keys in SECSH format(ssh-rsa, base64 encoded): vIOS.netcon.janog.gr.jp ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQCxZDfKYagwUo0ekCFwa3M6oO55ZY2Fube56sg7PfHl +CFcfty8cTJ1XJamHvYMtspJy0YGtJifM+iJSZb4IMtFoo5Jsz7+i2BTjo+ZhDVewBIQJEPKgxuKv16i jnjIZDM= vIOS#
vIOSでSSHサーバが起動したようなので、Ansible側を実行してみます。
$ ansible-playbook -i hosts pb-show_version.yaml PLAY [vEOS] ******************************************************************** TASK [Get vEOS version info] *************************************************** ok: [10.0.0.10] TASK [debug] ******************************************************************* ok: [10.0.0.10] => { (略) PLAY [vIOS] ******************************************************************** TASK [Get vIOS version info] *************************************************** ok: [10.0.0.20] TASK [debug] ******************************************************************* ok: [10.0.0.20] => { "sh_ver_ios": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "stdout": [ (略) } PLAY [XRv] ********************************************************************* TASK [Get XRv version info] **************************************************** fatal: [10.0.0.30]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "unable to set terminal parameters"} PLAY RECAP ********************************************************************* 10.0.0.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.20 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.30 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vIOSも取れるようになりました!そして今度はXRv…
XRv
今度はかなり情報が少ないです。
"msg": "unable to set terminal parameters"
はてさて、まずはSSHできるか確認してみましょう。
$ ssh netcon@10.0.0.30 The authenticity of host '10.0.0.30 (10.0.0.30)' can't be established. RSA key fingerprint is SHA256:fF23wlkZ7flptxBD3O0BVOTglKMiSTSfp/B7WxJ51T4. RSA key fingerprint is MD5:e6:20:c0:af:a4:07:23:ee:74:de:d7:7a:96:e6:bf:b8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.0.30' (RSA) to the list of known hosts. IMPORTANT: READ CAREFULLY (略) Please login with any configured user/password, or cisco/cisco netcon@10.0.0.30's password:
おや?一度接続できたようなのに、別のユーザーでログインしろと言われています。netconユーザーは使えないのでしょうか?
RP/0/0/CPU0:XRv#show run username netcon Sat Jan 30 09:54:20.463 UTC username netcon password 7 050107012E4B1A5E !
設定には入っているみたいですね。このユーザーでログインできるのか試してみると、コンソールには入れるみたいです。
RP/0/0/CPU0:XRv#exit (略) User Access Verification Username: netcon Password:(janog47 を入力) RP/0/0/CPU0:XRv#
前掲のコンフィグをよーく見ると、netconユーザーにはパスワードだけしか設定されていません。
IOS-XRは「ユーザーが属するグループによって実行できる機能(権限)が変わる」設定があるのですが、このコンフィグには group
コマンドによる所属グループ設定がされていません。そのため、このユーザーは「ログインはできるが他に何もできない」ユーザーになっているのです。
RP/0/0/CPU0:XRv#show user Sat Jan 30 10:02:27.300 UTC netcon ←netconユーザーでログインしている RP/0/0/CPU0:XRv#show user group Sat Jan 30 10:02:33.409 UTC ←何も表示されない=どのグループにも所属していない RP/0/0/CPU0:XRv#show version % This command is not authorized ←show versionコマンドが実行できない。 RP/0/0/CPU0:XRv#
ですのでここでは netcon
ユーザーを適切なグループに所属させる必要があります。新たにグループを作る必要はないので、事前定義済みのグループの中から選べば十分です。ここでは netadmin
に所属させてみます。
RP/0/0/CPU0:XRv#exit (略) User Access Verification Username: cisco Password:(cisco を入力) RP/0/0/CPU0:XRv#show user Sat Jan 30 10:13:47.233 UTC cisco RP/0/0/CPU0:XRv#conf Sat Jan 30 10:13:58.912 UTC RP/0/0/CPU0:XRv(config)#username netcon group netadmin RP/0/0/CPU0:XRv(config)#show config Sat Jan 30 10:14:09.112 UTC Building configuration… !! IOS XR Configuration 6.1.2 username netcon group netadmin ! end RP/0/0/CPU0:XRv(config)#commit Sat Jan 30 10:14:12.431 UTC RP/0/0/CPU0:XRv(config)#end RP/0/0/CPU0:XRv#show run username netcon Sat Jan 30 10:15:05.728 UTC username netcon group netadmin password 7 050107012E4B1A5E !
ではAnsible側を実行してみます。
$ ansible-playbook -i hosts pb-show_version.yaml PLAY [vEOS] ******************************************************************** TASK [Get vEOS version info] *************************************************** ok: [10.0.0.10] TASK [debug] ******************************************************************* ok: [10.0.0.10] => { (略) PLAY [vIOS] ******************************************************************** TASK [Get vIOS version info] *************************************************** ok: [10.0.0.20] TASK [debug] ******************************************************************* ok: [10.0.0.20] => { (略) PLAY [XRv] ********************************************************************* TASK [Get XRv version info] **************************************************** ok: [10.0.0.30] TASK [debug] ******************************************************************* ok: [10.0.0.30] => { "sh_ver_xr": { "ansible_facts": { (略) PLAY [vSRX] ******************************************************************** TASK [Get vSRX version info] *************************************************** fatal: [10.0.0.40]: FAILED! => {"msg": "network os vsrx is not supported"} PLAY RECAP ********************************************************************* 10.0.0.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.20 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.30 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.40 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
XRvも取れました!最後はvSRX…
vSRX(というよりも、Ansible)
最後のvSRXは出力が違いますね。network os vsrx is not supported
って、AnsibleはvSRXをサポートしていないのでしょうか?
…ではないのです。
Ansibleのインベントリファイルに限らず、似たような内容のファイルを編集するときにはコピー・アンド・ペースト後に必要なところだけ編集すると思いますが、この出力は「コピペ後の編集ミス」によるものなのです。インベントリファイルとAnsibleのプレイブックの関連箇所を見てみましょう。
$ cat hosts (略) [XRv] 10.0.0.30 ansible_network_os=iosxr [vSRX] 10.0.0.40 ansible_network_os=vsrx (略)
インベントリファイルの方で「10.0.0.40は、Ansibleではvsrxとして扱え」という指示をしているのですが、ホストグループとして記述している「[vSRX]」に引きずられているみたいですね。
vSRXはJuniperのNOS(Network OS、ルータなどで動作している基本ソフトウェア)である「JUNOS」が稼働しています。そのため、Ansibleに対して指示するべきNOSの種類は「junos」じゃないといけないのです。ホストグループ名と異なる内容を設定しないといけないのに、ついつい修正間違いをしてしまったようです。
$ cat pb-show_version.yaml (略) - hosts: XRv gather_facts: no tasks: - name: Get XRv version info iosxr_command: commands: show version register: sh_ver_xr - debug: var: sh_ver_xr - hosts: vSRX gather_facts: no tasks: - name: Get vSRX version info iosxr_command: commands: show version register: sh_ver_vsrx - debug: var: sh_ver_vsrx
プレイブックの方も見てみると、なんとコマンドを実行するタスクを指示する部分(下から5行目)が「iosxr_command」のままになっています。きっとひとつ上のXRvの処理をコピペしたときに修正するのを忘れたんでしょうね…
ということで、この2点を正しく修正します。修正後は以下のようになります。
$ cp -p hosts hosts.err $ cp -p pb-show_version.yaml pb-show_version.yaml.err $ vi hosts (修正実施) $ vi pb-show_version.yaml (修正実施) $ diff -u hosts.err hosts --- hosts.err 2021-01-30 04:32:59.035422879 -0500 +++ hosts 2021-01-30 05:31:16.826813009 -0500 @@ -8,7 +8,7 @@ 10.0.0.30 ansible_network_os=iosxr [vSRX] -10.0.0.40 ansible_network_os=vsrx +10.0.0.40 ansible_network_os=junos [all:vars] ansible_connection=network_cli $ diff -u pb-show_version.yaml.err pb-show_version.yaml --- pb-show_version.yaml.err 2021-01-30 04:32:44.037820683 -0500 +++ pb-show_version.yaml 2021-01-30 05:33:23.557454479 -0500 @@ -32,7 +32,7 @@ gather_facts: no tasks: - name: Get vSRX version info - iosxr_command: + junos_command: commands: show version register: sh_ver_vsrx - debug:
で、これで実行すると
$ ansible-playbook -i hosts pb-show_version.yaml PLAY [vEOS] ******************************************************************** TASK [Get vEOS version info] *************************************************** ok: [10.0.0.10] TASK [debug] ******************************************************************* ok: [10.0.0.10] => { (略) PLAY [vIOS] ******************************************************************** TASK [Get vIOS version info] *************************************************** ok: [10.0.0.20] TASK [debug] ******************************************************************* ok: [10.0.0.20] => { (略) PLAY [XRv] ********************************************************************* TASK [Get XRv version info] **************************************************** ok: [10.0.0.30] TASK [debug] ******************************************************************* ok: [10.0.0.30] => { "sh_ver_xr": { "ansible_facts": { (略) TASK [Get vSRX version info] *************************************************** [WARNING]: arguments wait_for, match, rpcs are not supported when using transport=cli ok: [10.0.0.40] TASK [debug] ******************************************************************* ok: [10.0.0.40] => { "sh_ver_vsrx": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, (略) PLAY RECAP ********************************************************************* 10.0.0.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.20 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.30 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.40 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
無事、vSRXからも情報が取得できるようになりました。
回答例
ということで、回答のまとめです。NETCONでは報告書として回答を提出することになっていましたので、それにならってこんな感じの回答をしてみました。なお、報告フォーマットに指定はないので、これとは違う形で報告していても減点されたりしていないはずです。
以下の通り報告します。
■vEOS
Ansibleで接続するユーザーのパスワードが誤っていたため、以下のコマンドで再設定を行いました。username netcon role network-admin secret 0 janog47
■vIOS
SSHホスト鍵が未生成であったたため、以下のコマンドでホスト鍵を生成しました。conf t
crypto key generate rsa
■XRv
Ansibleで接続するユーザーにグループ設定が不足していたため、暫定的に以下のコマンドでNetAdmin権限を付与しました。
configure
username netcon group netadmin
commit
■vSRX
vSRX側には問題はありませんでしたが、Ansibleのインベントリファイル(hosts)およびプレイブックに誤りがあったため、以下の通り修正しました。
$ cp -p hosts hosts.err $ cp -p pb-show_version.yaml pb-show_version.yaml.err $ vi hosts (修正実施) $ vi pb-show_version.yaml (修正実施) $ diff -u hosts.err hosts --- hosts.err 2021-01-30 04:32:59.035422879 -0500 +++ hosts 2021-01-30 05:31:16.826813009 -0500 @@ -8,7 +8,7 @@ 10.0.0.30 ansible_network_os=iosxr [vSRX] -10.0.0.40 ansible_network_os=vsrx +10.0.0.40 ansible_network_os=junos [all:vars] ansible_connection=network_cli $ diff -u pb-show_version.yaml.err pb-show_version.yaml --- pb-show_version.yaml.err 2021-01-30 04:32:44.037820683 -0500 +++ pb-show_version.yaml 2021-01-30 05:33:23.557454479 -0500 @@ -32,7 +32,7 @@ gather_facts: no tasks: - name: Get vSRX version info - iosxr_command: + junos_command: commands: show version register: sh_ver_vsrx - debug:
以上、よろしくお願いします。
まとめ
IOS-XRのグループやAnsibleのnetwork_os指定など、知らないと解決できないものも混ざっていますが、今回のNETCONは特にインターネットアクセス(=ネットの検索)を制限していないので「調べたら解決できる!」というレベルを目指して作ってみました。表示されたエラーメッセージなどから、適切な情報にたどり着けるかといった「情報の取捨選択」「検索能力」にも関連する問題になったかなぁと思っていますが、実際に解いた人の感想を聞いてみたいですね。(オフライン開催だったら懇親会のときの話題にしたかった…)
コメント