はじめに
2020/06/06 に、YouTube Live で「つまずき Ansible 【Part4】インターフェースとOSPFの設定」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。
今回は、Cisco IOS の機器に、インターフェースの有効化、IPアドレスの設定、OSPFを有効化する Playbook を作りました。
つまずいたエラーと原因、対処をふりかえります。
動画
■ OSPFの設定
Unsupported parameters
というエラーが発生
TASK [enalbe ospf] *********************************************************************************************** fatal: [rt01]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Unsupported parameters for (ios_config) module: parates Supported parameters include: after, auth_pass, authorize, backup, backup_options, before, defaults, diff_against, diff_ignore_lines, host, intended_config, lines, match, multiline_delimiter, parents, password, port, provider, replace, running_config, save_when, src, ssh_keyfile, timeout, username"}
原因
parents
オプションのスペルが誤っていた。
対処
parents
に修正して再実行。
なんともいえないエラーが発生
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: rt01(config)# fatal: [rt01]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 102, in
\n ansiballz_main()\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 94, in ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 40, in invoke_module\n runpy.run_module(mod_name='ansible.modules.network.ios.ios_config', 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
原因
ios_config
モジュールの parents
オプションで指定したコマンドをよく見たら、router ospf 1
と指定するべきところ route ospf 1
になっていた。
IOS 側の仕様として、グローバルコンフィギュレーションモードで route
と指定しても、まだコマンドをユニークに絞りきれない(route-map
? router
? など )ため、何も実行されなかった 。
いっそのことコマンドが誤っていれば、エラーのなかに % Invalid input detected at '^' marker.
という IOS が出力したメッセージが含まれる。しかし、今回は誤っているというより、候補が複数ある状態という中途半端なコマンドだったため、なんともいえないエラーになった。
なお、省略したコマンドでもユニークに絞り込めるレベルであれば設定は可能。しかし、冪等性担保の観点から、省略せずに指定するのが良い。
対処
router ospf 1
に修正して再実行
おまけ
実行した Playbook(最終形)
--- - hosts: rt01 gather_facts: false tasks: # - name: set route # ios_static_route: # prefix: 0.0.0.0 # mask: 0.0.0.0 # next_hop: 192.168.1.1 - name: no shut Gi0/3 ios_interfaces: config: - name: GigabitEthernet0/3 enabled: True - name: set ip address ios_l3_interfaces: config: - name: GigabitEthernet0/3 ipv4: - address: 10.0.0.1/24 - name: enalbe ospf ios_config: parents: - router ospf 1 lines: - network 10.0.0.0 0.0.0.255 area 0 tags: - ospf - name: save ios_config: save_when: modified tags: - save
全実行ログ
(ansible) [vagrant@stumble stumble]$ ll total 20 -rw-rw-r--. 1 vagrant vagrant 34 Jun 5 13:32 ansible.cfg drwxrwxr-x. 1 vagrant vagrant 96 May 23 01:06 group_vars -rw-rw-r--. 1 vagrant vagrant 67 May 23 01:06 inventory.ini -rw-rw-r--. 1 vagrant vagrant 243 Jun 5 13:55 memo.md -rw-rw-r--. 1 vagrant vagrant 360 Jun 6 01:18 set.yml (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml PLAY [rt01] ************************************************************************* TASK [Gathering Facts] ************************************************************** [WARNING]: Ignoring timeout(10) for ios_facts [WARNING]: default value for `gather_subset` will be changed to `min` from `!config` v2.11 onwards ok: [rt01] TASK [no shut Gi0/3] *************************************************************** changed: [rt01] PLAY RECAP ************************************************************************** rt01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml PLAY [rt01] ************************************************************************* TASK [no shut Gi0/3] *************************************************************** ok: [rt01] TASK [set ip address] *************************************************************** changed: [rt01] PLAY RECAP ************************************************************************** rt01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml -t ospf PLAY [rt01] ****************************************************************************************************** TASK [enalbe ospf] *********************************************************************************************** fatal: [rt01]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Unsupported parameters for (ios_config) module: parates Supported parameters include: after, auth_pass, authorize, backup, backup_options, before, defaults, diff_against, diff_ignore_lines, host, intended_config, lines, match, multiline_delimiter, parents, password, port, provider, replace, running_config, save_when, src, ssh_keyfile, timeout, username"} PLAY RECAP ******************************************************************************************************* rt01 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml -t ospf PLAY [rt01] *************************************************************************************************** TASK [enalbe ospf] ******************************************************************************************** An exception occurred during task execution. To see the full traceback, use -vvv. The error was: rt01(config)# fatal: [rt01]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 102, in <module>\n _ansiballz_main()\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 94, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/home/vagrant/.ansible/tmp/ansible-local-28450uu8hydjf/ansible-tmp-1591442691.3088439-28456-252030280888868/AnsiballZ_ios_config.py\", line 40, in invoke_module\n runpy.run_module(mod_name='ansible.modules.network.ios.ios_config', 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 (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml -t ospf PLAY [rt01] *************************************************************************************************** TASK [enalbe ospf] ******************************************************************************************** changed: [rt01] PLAY RECAP **************************************************************************************************** rt01 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (ansible) [vagrant@stumble stumble]$ ansible-playbook -i inventory.ini set.yml -t ospf,save PLAY [rt01] ********************************************************************************************* TASK [enalbe ospf] ************************************************************************************** ok: [rt01] TASK [save] [f:id:akira6592:20200606210830p:plain][f:id:akira6592:20200606210830p:plain]********************************************************************************************* changed: [rt01] PLAY RECAP ********************************************************************************************** rt01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (ansible) [vagrant@stumble stumble]$
補足
Ansible2.10くらいからOSPFの専用モジュールができるようだが、今は専用のモジュールがないためios_configモジュールを使う。
— tatematsu_san (@tk4_jj) 2020年6月6日
汎用のConfig投入モジュールがあるのはいいよなあ…#tekunabe
開発中のようですが、ios_ospfv2
モジュールはこちらです。
cisco.ios/ios_ospfv2.py at master · ansible-collections/cisco.ios · GitHub
#tekunabe
— うさぎエンジニア (@usagi_automate) 2020年6月6日
わたしはsaveをhundler で書くのが最近のスタイル
Ansible 実践ガイド 第3版のサンプル(P282)でも同様のことをしています(宣伝)。
ただし、配信時に handler を使ったコンフィグの保存の説明をしていますが「blockで囲って〜」は誤りです。handler を使う上で、特に block で囲う要はありません。
Part 5 にむけて
次回はまだやることを決められていません。
ansible-galaxy ?
ご意見(ありがとうございます!)
Big-IPかAristaがあると個人的にはいと嬉し😁 #tekunabe
— fuguman777 (@fugumen) 2020年6月6日
ご参加グログ(ありがとうございます!)