てくなべ (tekunabe)

ansible / network / automation

[Ansible] 「つまずき Ansible 【Part4】インターフェースとOSPFの設定」ふりかえり

はじめに

2020/06/06 に、YouTube Live で「つまずき Ansible 【Part4】インターフェースとOSPFの設定」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。

tekunabe.connpass.com

今回は、Cisco IOS の機器に、インターフェースの有効化、IPアドレスの設定、OSPFを有効化する Playbook を作りました。

つまずいたエラーと原因、対処をふりかえります。

動画

www.youtube.com


■ 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]$ 

補足

開発中のようですが、ios_ospfv2 モジュールはこちらです。 cisco.ios/ios_ospfv2.py at master · ansible-collections/cisco.ios · GitHub

Ansible 実践ガイド 第3版のサンプル(P282)でも同様のことをしています(宣伝)。

ただし、配信時に handler を使ったコンフィグの保存の説明をしていますが「blockで囲って〜」は誤りです。handler を使う上で、特に block で囲う要はありません。

Part 5 にむけて

次回はまだやることを決められていません。

ansible-galaxy ?

ご意見(ありがとうございます!)

ご参加グログ(ありがとうございます!)

note.com