てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 「つまずき Ansible 【Part16】モジュールの指定をFQCN表記に移行する」ふりかえり

はじめに

2020/09/20 に、YouTube Live で「つまずき Ansible 【Part16】モジュールの指定をFQCN表記に移行する」という配信をしました。

実際に作業しながらエラーと戦って進めるシリーズです。

tekunabe.connpass.com

今回は、Asnible 2.10 と Collection な Playbook を FQCN 表記に移行する作業をしました。

やったことや、わかったことをふりかえります。

  • 環境
    • ansible-base 2.10.1

動画

youtu.be


■ やったこと

基本的には、下記のブログの流れに沿いました。

tekunabe.hatenablog.jp

  • ポイント
    • Ansible 2.10 では多くのモジュールが collection に移行して、移行したモジュール名などは基本的に FQCN で指定する
    • Ansible 2.9 まで標準で含まれていたモジュールについては、装飾なしの名前指定でも FQCN へのリダイレクトの仕組みがある
      • なので、標準だったモジュールについては FQCN 指定は必須ではない(全部試したわけではないですが)
    • ansible-playbook コマンドに -vvv をつけるとリダイレクト先の FQCN が確認できるので、FQCN 表記にするならそれを参考にする
      • チェックモード(-C--check)でも確認できる
      • --syntax-check では不可
    • モジュールだけでなく、フィルターやプラグインも collection へ移行されている

再掲にはなりますが、最終的には各ファイルは以下のようになりました。

変数定義ファイル

---
ansible_network_os: cisco.ios.ios
ansible_connection: ansible.netcommon.network_cli
ansible_user: ansible
ansible_password: p@ssword
ansible_become: true
ansible_become_method: ansible.netcommon.enable 
ansible_become_password: secret

ansible.cfg

[defaults]
host_key_checking = false
stdout_callback=community.general.yaml

Playbook

---
- hosts: rt01
  gather_facts: false

  vars:
    ntp_server: 10.0.0.123

  tasks:
    - name: assert ntp server
      assert:
        that: ntp_server | ansible.netcommon.ipv4

    - name: ios test
      cisco.ios.ios_config:
        lines:
          - "ntp server {{ ntp_server }}"

いただいた質問

インターネットへの接続性は不要です。FQCN への対応表を静的なファイルで自分の中でももっていてそれを利用します。

私もやってみましたが、やはりファイルが見つからないというエラーでした。

(ab210) [root@2a5505f15a98 stumble]# ansible-playbook -i inventory.ini tofqcn.yml -vvv --checkERROR! Unexpected Exception, this is probably a bug: [Errno 2] No such file or directory: b'/root/envs/ab210/lib64/python3.6/site-packages/ansible/config/ansible_builtin_runtime.yml'
the full traceback was:

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 888, in _find_spec
AttributeError: '_AnsibleCollectionFinder' object has no attribute 'find_spec'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/envs/ab210/bin/ansible-playbook", line 92, in <module>
    mycli = getattr(__import__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass)
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/cli/__init__.py", line 21, in <module>
    from ansible.inventory.manager import InventoryManager
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/inventory/manager.py", line 39, in <module>
    from ansible.utils.helpers import deduplicate_list
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 890, in _find_spec
  File "<frozen importlib._bootstrap>", line 864, in _find_spec_legacy
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/utils/collection_loader/_collection_finder.py", line 172, in find_module
    return _AnsibleInternalRedirectLoader(fullname=fullname, path_list=path)
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/utils/collection_loader/_collection_finder.py", line 632, in __init__
    builtin_meta = _get_collection_metadata('ansible.builtin')
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/utils/collection_loader/_collection_finder.py", line 965, in _get_collection_metadata
    collection_pkg = import_module('ansible_collections.' + collection_name)
  File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "/root/envs/ab210/lib64/python3.6/site-packages/ansible/utils/collection_loader/_collection_finder.py", line 502, in load_module
    with open(to_bytes(metadata_path), 'rb') as fd:
FileNotFoundError: [Errno 2] No such file or directory: b'/root/envs/ab210/lib64/python3.6/site-packages/ansible/config/ansible_builtin_runtime.yml'
(ab210) [root@2a5505f15a98 stumble]# 


Part17 にむけて

以下のネタを検討中です。気が向いたものをやります。

  • Ansible 2.10 関連
  • connection: local ななにか
  • Ansible Toewr / AWX をコマンドがら操作する
  • ansible.cfg
  • Jinja2、フィルター
  • Windows
  • ESXi で VM作成
  • parsee_cli モジュール(Part15 の続き)
  • when や assert