はじめに
2020/05/23 に、YouTube Live でつまずいきながら進める Ansible 【Part2】という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。
前回の Part1(動画、ふりかえりブログ)では、Ansible のインストール、インベントリファイルの作成、簡単な Playbook の作成を行いました。
Playbook は Cisco IOS の機器の、show ip route
コマンドの実行コマンドを、ファイルに保存するというものでした。しかし、まだ余計な情報が多かったり、思った形式になっていませんでした。
また、いきなり Playbook を作成してしまいましたが、その前に疎通確認のステップをしたほうが良かったように思います。
Part 2 では、疎通確認と、Playbook の改善をしました。
つまずいたエラーと原因、対処をふりかえります。
動画
■ 疎通確認
ping
モジュールを疎通確認として利用できない
ping
モジュールは、ターゲットノード(接続先)で Python が利用できるか確認するモジュールです。
よく ansible
コマンド(アドホックコマンド)と併用して、Ansible としての疎通確認(ICMP ではなく、ssh + python)に利用されます。
Cisco IOS に ping モジュールを利用したところ、接続情報が誤っているのにもかかからず ok
となってしまった。
$ ansible -i inventory.ini all -m ping rt01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
原因
Ansible 2.9 からの仕様。
ネットワーク機器向けのコネクションプラグイン利用時に ping
モジュールを使っても、ターゲットノードに接続しにいかないため、接続確認として機能しない。
参考: [Ansible] ネットワーク機器に接続する条件はバージョンやコネクションブラグインによって異なる - てくなべ (tekunabe)
対処
ping モジュールではなく、実際ににネットワーク機器に接続しに行くモジュールを利用する。
$ ansible -i inventory.ini all -m ios_facts [WARNING]: default value for `gather_subset` will be changed to `min` from `!config` v2.11 onwards rt01 | SUCCESS => { "ansible_facts": { "ansible_net_all_ipv4_addresses": [ "192.168.1.11", // ...(略)... ], "ansible_net_system": "ios", "ansible_net_version": "15.8(3)M2", "ansible_network_resources": {}, "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false }
コマンドは任意だがここでは show version
$ ansible -i inventory.ini all -m ios_command -a "commands='show version'" rt01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "stdout": [ // ...(略)... ], "stdout_lines": [ [ "Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.8(3)M2, RELEASE SOFTWARE (fc2)", "Technical Support: http://www.cisco.com/techsupport", "Copyright (c) 1986-2019 by Cisco Systems, Inc.", "Compiled Thu 28-Mar-19 14:06 by prod_rel_team", "", // ...(略)... "Configuration register is 0x0" ] ] }
参考: Network Debug and Troubleshooting Guide — Ansible Documentation
gather_facts
モジュールでも可能。
setup
モジュールは、ネットワーク機器に接続しにいかないため、疎通確認としては利用不可。
■ コマンド実行結果の整形
コマンド実行結果のファイルに余計な情報がは入ってしまう
例
{"changed": false, "stdout": ["Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP\n D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area \n N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2\n E1 - OSPF external type 1, E2 - OSPF external type 2\n i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2\n ia - IS-IS inter area, * - candidate default, U - per-user static route\n o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP\n a - application route\n + - replicated route, % - next hop override, p - overrides from PfR\n\nGateway of last resort is not set\n\n 10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks\nC 10.0.0.0/24 is directly connected, GigabitEthernet0/3\nL 10.0.0.1/32 is directly connected, GigabitEthernet0/3\nC 10.255.255.1/32 is directly connected, Loopback0\n 192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks\nC 192.168.1.0/24 is directly connected, GigabitEthernet0/0\nL 192.168.1.11/32 is directly connected, GigabitEthernet0/0"], "stdout_lines": [["Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP", " D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area ", " N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2", " E1 - OSPF external type 1, E2 - OSPF external type 2", " i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2", " ia - IS-IS inter area, * - candidate default, U - per-user static route", " o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP", " a - application route", " + - replicated route, % - next hop override, p - overrides from PfR", "", "Gateway of last resort is not set", "", " 10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks", "C 10.0.0.0/24 is directly connected, GigabitEthernet0/3", "L 10.0.0.1/32 is directly connected, GigabitEthernet0/3", "C 10.255.255.1/32 is directly connected, Loopback0", " 192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks", "C 192.168.1.0/24 is directly connected, GigabitEthernet0/0", "L 192.168.1.11/32 is directly connected, GigabitEthernet0/0"]], "failed": false}
原因
register
で保存したコマンド実行結果には、コマンド実行そのもの以外にもメタ情報が含まれるため。
対処
result
の内容を確認して、必要な箇所である、result.stdout[0]
を指定する。
例
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set 10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks C 10.0.0.0/24 is directly connected, GigabitEthernet0/3 L 10.0.0.1/32 is directly connected, GigabitEthernet0/3 C 10.255.255.1/32 is directly connected, Loopback0 192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.1.0/24 is directly connected, GigabitEthernet0/0 L 192.168.1.11/32 is directly connected, GigabitEthernet0/0
調べる際は、Playbook Debugger で試行錯誤できるのが便利。
- name: save to file copy: content: "{{ result.stdout[0] }}" dest: "show_ip_route_{{ inventory_hostname }}.log" debugger: always # タスク実行時に無条件で Playbook Debugger を起動
Playbook Debugger の使い方は、書籍「Ansible 実践ガイド 第3版」のP368「7-4-4 Playbook Debugger」にも掲載されています(宣伝)。
■ show コマンドの追加
show running-config
コマンドが実行できない
原因
権限不足。
ログインユーザーが一般ユーザーだったため、show ip route
は実行できても、how running-config
は実行できない。
対処
変数定義ファイル(今回は group_vars/ios.yml
)に、権限昇格のための以下の変数を追加。
ansible_become: true ansible_become_method: enable ansible_become_password: secret
参考: IOS Platform Options — Ansible Documentation
Part 3 にむけて
次回の Part 3 では、以下のアンケートで2番目に多かった、ルーティングの設定をしてみたいと思います。