はじめに
2020/09/20 に、YouTube Live で「つまずき Ansible 【Part16】モジュールの指定をFQCN表記に移行する」という配信をしました。
実際に作業しながらエラーと戦って進めるシリーズです。
今回は、Asnible 2.10 と Collection な Playbook を FQCN 表記に移行する作業をしました。
やったことや、わかったことをふりかえります。
- 環境
- ansible-base 2.10.1
動画
■ やったこと
基本的には、下記のブログの流れに沿いました。
- ポイント
- 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 への対応表を静的なファイルで自分の中でももっていてそれを利用します。#tekunabe
— matsumuratomonori (@ma2muratomonori) 2020年9月20日
FQCN
あまり仕組みが分かってないのだけどインターネットに繋がってないとFQCNを解決出来ないのかな?
それとも内部的に解決してるからネットワークに繋がっているとか関係ないのかな?
コメントアウトじゃなくてビルトイン変換用ファイルのファイルリネームだとどうなるんかな・・試してみるか#tekunabe
— tatematsu_san (@tk4_jj) 2020年9月20日
あ、でもやっぱりエラーでました。
— tatematsu_san (@tk4_jj) 2020年9月20日
#tekunabe pic.twitter.com/o31zDnHGBv
私もやってみましたが、やはりファイルが見つからないというエラーでした。
(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 にむけて
以下のネタを検討中です。気が向いたものをやります。