JANOG47 NETCON問題解説(SC1-300-2)

イベント参加

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 によってパスフレーズの自動入力をさせるようにします。

Ansible ネットワークの例 — Ansible Documentation

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は特にインターネットアクセス(=ネットの検索)を制限していないので「調べたら解決できる!」というレベルを目指して作ってみました。表示されたエラーメッセージなどから、適切な情報にたどり着けるかといった「情報の取捨選択」「検索能力」にも関連する問題になったかなぁと思っていますが、実際に解いた人の感想を聞いてみたいですね。(オフライン開催だったら懇親会のときの話題にしたかった…)

コメント

タイトルとURLをコピーしました