てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible 2.10.0 が ansible-base 2.10.1 ベースである経緯を探る

はじめに

まもなく ansible 2.10.0 がリリースされる予定です。

2.10 から collection 前提の運用が始まり、ansible を取り巻くパッケージは 2つになりました。

  1. 標準モジュールのみのパッケージを ansible-base
  2. ansible-base に加えて各種コレクションをセットでインストールする ansible(以前は ACD(Ansible Community Distribution)とよばれていたように思いました)

ansible は どのバージョンの ansible-baseベースするかが定義がされています。

例えば ansible 2.10.0 の場合は、ansible-base 2.10.1 です。直感に反して末尾のバージョンが異なります。こうなった経緯を自分なりに調べてみましたのでまとめます。(お手数ですが誤りがありましたら @akira6592までご連絡ください)

ひとことで言いますと、ansible-base 2.10.0 のリリース後に、gluster_* モジュールが所属するコレクションが変更され、リダイレクト先の定義も変更されたからです。

経緯

参考

経緯を追うために確認したページです。

Frequently Asked Questions — Ansible Documentation

[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

[Ansible] role 単位で collections を指定する

はじめに

Playbook 内で利用する collection のモジュールを利用する際、モジュール名を FQCN(例:cisco.ios.ios_config)で指定するほか、collections ディレクティブでまとめて指定することもできます。

現時点(2020/09/20)の最新版のドキュメントには、以下のように Playbook の Play 単位で collections を指定する例が紹介されています。

- hosts: all
  collections:    # Play 単位の場合
   - my_namespace.my_collection
  tasks:
    - import_role:
        name: role1

一方、開発版のドキュメントでは、role 単位で collections を指定する例が紹介されています。role の meta/main.yml に指定します。

# myrole/meta/main.yml
collections:
  - my_namespace.first_collection
  - my_namespace.second_collection
  - other_namespace.other_collection

role としては、利用するコレクションを Playbook 側で指定されるより、role 自身で指定できる方が嬉しいのではないでしょうか。(試す限り、Playbook 側の collections は、ロール内のタスクには反映されないようでした)

この記事では、自分のサンプルでrole 単位での collections の指定を検証します。

  • 動作確認環境
    • ansible-base 2.10.1


■ 各ファイルの内容

ディレクトリ構成

site.yml から、testrole を呼び出します。

.
├── roles
│   └── testrole
│       ├── meta
│       │   └── main.yml  (c)
│       └── tasks
│           └── main.yml  (b)
└── site.yml   (a)

f:id:akira6592:20200920140114p:plain
全体

(a) Playbook (site.yml)

testrole role を呼び出すだけの Playbook です。 ここには collections ディレクティブを指定しません。

---
- hosts: rt01
  gather_facts: false
  
  tasks:
    - name: import testrole
      import_role:
        name: testrole

(b) role のタスク (testrole/tasks/main.yml

処理本体です。

cisco.ios collection 内の ios_config モジュールを利用する意図です。

---
- name: ios test
  ios_config:
    lines:
      - ntp server 10.0.0.123

cisco.ios.ios_config のように FQCN 指定でもよいのですが、この記事の趣旨上、装飾なしの名前にしています。

代わりに、後述の testrole/meta/main.ymlcollections をしています。

(c) role のメタ情報 (testrole/meta/main.yml

ここで collections を指定します。cisco.ios collection のみを指定しています。複数指定もできます。

---
collections:
  - cisco.ios

この指定により、装飾なしのモジュール名の探索に cisco.ios collections が加わります。 (自動で collection がインストールされるわけではありません)


■ Playbook 実行

検証用の準備(リダイレクトの無効化)

少しややこしいですが、検証のためにちょっとした準備をします。

iso_config モジュールは Ansible 2.9 以前は標準で含まれていたため、Ansible 2.10 では 移行容易性のため(おそらく)リダイレクトの仕組みがあります。つまり ios_config と指定すると、cisco_ios.ios_config にリダイレクトします。この機能に頼ると、今回の collections の指定が効いたかどうか区別できません。

そのため、この検証では該当リダイレクトを無効にします。具体的には [python環境]/lib/python3.X/site-packages/ansible/config/ansible_builtin_runtime.ymlcisco.ios.ios_config へのリダイレクト定義を、以下のようにコメントアウトします。

    # ios_config:
    #   redirect: cisco.ios.ios_config

実行

Playbook を実行します。

$ ansible-playbook -i inventory.ini site.yml

PLAY [rt01] **********************************************************************************************************************

TASK [testrole : ios test] *******************************************************************************************************
ok: [rt01]

PLAY RECAP ***********************************************************************************************************************
rt01                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

無事に cisco.ios.ios_config モジュールを実行できました。

もしろん、リダイレクトを無効にしたたまま、 collections の指定をなくすと、ERROR! couldn't resolve module/action 'ios_config'. のようにエラーになります。


おわりに

はじめにも書きましたが、role としては、利用するコレクションを Playbook 側で指定されるより、role 自身で指定できる方が制御が効いてよいでしょう。FQCN 指定やリダイレクトの仕組みに頼らない事業がある場合は、便利な方法だと思います。

[Ansible] モジュールの指定などを FQCN 表記に移行する手順

はじめに

Ansible 2.10 から、多くのモジュールやプラグインなどが Collection へ移行しました。

collection は cisco.ios のようなドット区切りの名前空間が設けられます。その中のモジュールを利用する場合は、cisco.ios.ios_configのように指定します。このような表記を FQCN と呼びます。

少なくとも Ansible 2.9 に標準で同梱されていたモジュールについては、装飾なしの名前(例: ios_config)の指定でも、ansible_builtin_runtime.ymlというファイルの対応付けによって FQCN(例: cisco.ios.ios_config)へリダイレクトされる仕組みになっています。

親切な仕組みではありますが、なんとなく自動的にリダイレクトされることに頼りたくない、という気持ちになることはないでしょうか。

この記事では、リダイレクトに頼った Playbook を FQCN に変更するための手順を記載します。

もっと確実でスマートな手順があるかもしれませんが、自分が分かる範囲で現状はこうするのがいいのではないか、という位置づけです。 Playbook とansible_builtin_runtime.ymlの両方を眺めながら修正するよりはいくらか良いと思います。

動作確認環境: ansible-base 2.10.1



■ 前提環境

ansible-base 2.10.1 に cisco.ioscommunity.general collection をインストールしてある環境です。

  • collection インストール手順
$ ansible-galaxy collection install cisco.ios
$ ansible-galaxy collection install community.general

明示的にインストールした collection 以外にも、依存している別の collection もインストールされています。

$ ansible-galaxy collection list    

# /Users/sakana/.ansible/collections/ansible_collections
Collection           Version
-------------------- -------
ansible.netcommon    1.2.1  
ansible.posix        1.1.1  
cisco.ios            1.0.0  
community.general    1.1.0  
community.kubernetes 1.0.0  
google.cloud         1.0.0 


■ 対象Playbook など

Cisco IOS の機器に簡単な設定変更をする Playbook を前提とします。まだ FQCN はどこにも登場しません。

インベントリファイル(inventory.ini

rt01 というホストを1台定義した ios グループがある状態です。

[ios]
rt01 ansible_host=192.168.1.11

変数定義ファイル(group_vars/ios.yml

利用するコネクションプラグインやOSを指定します。

---
ansible_network_os: ios
ansible_connection: network_cli
ansible_user: ansible
ansible_password: password
ansible_become: true
ansible_become_method: enable
ansible_become_password: secret

モジュールではないから FQCN とは関係ないのではないかと思われるかも知れませんが実は関係あります。あとで修正します。

Playbook(tofqcn.yml

変数 ntp_serverIPv4 アドレスらしいことを ipv4 フィルターと assert モジュールで確認し、ios_config モジュールでコンフィグ投入する Playbook です。

---
- hosts: ios
  gather_facts: false

  vars:
    ntp_server: 10.0.0.123
    
  tasks:
    - name: assert ntp server
      assert:
        that: ntp_server | ipv4

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

(ここでは処理の妥当性はあまり優先していません。たとえば NTP サーバー設定であれば、専用の ios_ntp モジュールが別途あったりします。)

設定ファイル(ansible.cfg

コールバックプラグインyaml を指定します。これも実はあとで修正することになります。

[defaults]
stdout_callback = yaml


■ 1. リダイレクトの様子を確認する

ひとまず、装飾なし表記のままで Playbook を実行します。ansible-playbook-vvv をつけると FQCN へリダイレクトする様子がログに出力されます。(厳密には、-vv での出力するものと、-vvv で出力するものがあるようです)

実行結果(リダイレクト部分を中心に抜粋)

redirecting というログとともに、リダイレクトの様子が表示されます。ios_config モジュールだけでないことも分かります。

$ ansible-playbook -i inventory.ini tofqcn.yml -vvv  
ansible-playbook 2.10.1
...(略)...
redirecting (type: modules) ansible.builtin.ios_config to cisco.ios.ios_config
redirecting (type: callback) ansible.builtin.yaml to community.general.yaml
redirecting (type: callback) ansible.builtin.yaml to community.general.yaml

PLAYBOOK: tofqcn.yml *****************************************************************************************************
1 plays in tofqcn.yml

PLAY [ios] ***************************************************************************************************************
META: ran handlers

TASK [assert ntp server] *************************************************************************************************
task path: /Users/sakana/ansible/tofqcn.yml:9
redirecting (type: connection) ansible.builtin.network_cli to ansible.netcommon.network_cli
redirecting (type: terminal) ansible.builtin.ios to cisco.ios.ios
redirecting (type: cliconf) ansible.builtin.ios to cisco.ios.ios
redirecting (type: become) ansible.builtin.enable to ansible.netcommon.enable
redirecting filter ansible.builtin.ipv4 to ansible.netcommon.ipv4
redirecting filter ansible.builtin.ipv4 to ansible.netcommon.ipv4
redirecting filter ansible.builtin.ipv4 to ansible.netcommon.ipv4
ok: [rt01] => changed=false 
  msg: All assertions passed

TASK [ios test] **********************************************************************************************************
task path: /Users/sakana/ansible/tofqcn.yml:13
redirecting (type: connection) ansible.builtin.network_cli to ansible.netcommon.network_cli
redirecting (type: terminal) ansible.builtin.ios to cisco.ios.ios
redirecting (type: cliconf) ansible.builtin.ios to cisco.ios.ios
redirecting (type: become) ansible.builtin.enable to ansible.netcommon.enable
redirecting (type: action) ansible.builtin.ios to cisco.ios.ios
redirecting (type: action) ansible.builtin.ios to cisco.ios.ios
...(略)...
redirecting (type: modules) ansible.builtin.ios_config to cisco.ios.ios_config
...(略)...
ok: [rt01] => changed=false 
...(略)...
META: ran handlers
META: ran handlers

PLAY RECAP ***************************************************************************************************************
rt01                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

最初見たときは、思いの外たくさんリダイレクトされると感じました。装飾なしの表記は、ansible.builtin.hogehoge として内部で扱われるようです。

今回の場合、リダイレクト先の collection 単位でまとめると以下の通りです。

  • cisco.ios collection

    • redirecting (type: modules) ansible.builtin.ios_config to cisco.ios.ios_config
    • redirecting (type: terminal) ansible.builtin.ios to cisco.ios.ios
    • redirecting (type: cliconf) ansible.builtin.ios to cisco.ios.ios
    • redirecting (type: cliconf) ansible.builtin.ios to cisco.ios.ios
    • redirecting (type: action) ansible.builtin.ios to cisco.ios.ios
  • ansible.netcommon collection

    • redirecting (type: connection) ansible.builtin.network_cli to ansible.netcommon.network_cli
    • redirecting (type: become) ansible.builtin.enable to ansible.netcommon.enable
    • redirecting filter ansible.builtin.ipv4 to ansible.netcommon.ipv4
  • community.general collection
    • redirecting (type: callback) ansible.builtin.yaml to community.general.yaml

なお、Playbook をチェックモードで実行してもリダイレクトの様子は確認できます。

リダイレクトを無効にするとエラーに

前述どおり、リダイレクト先の定義 は ansible_builtin_runtime.yml というファイルにあります。

自分の環境の、[python環境]/lib/python3.X/site-packages/ansible/config/ansible_builtin_runtime.yml をすべてコメントアウトすると、リダイレクト機能を無効できます。(設定で変更できても良さそうですが、それらしい項目はありませんでした)

現状の、装飾なし表記の Playbook で、リダイレクトを無効にして 実行すると以下のようなエラーになります。

$ ansible-playbook -i inventory.ini tofqcn.yml -vvv                                       
...(略)...

The error appears to be in '/Users/sakana/ansible/tofqcn.yml': line 13, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - name: ios test
      ^ here

逆に、リダイレクトを無効にしても正常実行されれば、FQCN 化ができたと言えます(あとで試します)。

いったん、ansible_builtin_runtime.yml はもとに戻してリダイレクトは有効にします。


■ 2. FQCN に修正して再実行

先程、リダイレクトされた様子が確認できましたので、その内容に沿って FQCN に各ファイルを修正しています。

FQCN 版変数定義ファイル(group_vars/ios.yml

変数定義ファイルを修正します、iosnetwork_clienable をそれぞれ以下のように FQCN にします。

---
ansible_network_os: cisco.ios.ios                   # FQCN 化
ansible_connection: ansible.netcommon.network_cli   # FQCN 化
ansible_user: ansible
ansible_password: password
ansible_become: true
ansible_become_method: ansible.netcommon.enable     # FQCN 化
ansible_become_password: secret

FQCN 版 Playbook(tofqcn.yml

Playbook を修正します。ipv4ios_config をそれぞれ以下のように FQCN にします。

---
- hosts: ios
  gather_facts: false

  vars:
    ntp_server: 10.0.0.123
    
  tasks:
    - name: assert ntp server
      assert:
        that: ntp_server | ansible.netcommon.ipv4    # FQCN 化

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

FQCN 版設定ファイル(ansible.cfg

設定ファイルを修正します。 コールバックプラグインyaml は、community.general 配下なので以下のように修正します。

[defaults]
; FQCN 化
stdout_callback=community.general.yaml

他、インベントリファイル はそのままです。

実行結果(リダイレクト部分を中心に抜粋)

再度実行します。

$ ansible-playbook -i inventory.ini tofqcn.yml -vvv
ansible-playbook 2.10.1
...(略)...
redirecting (type: action) cisco.ios.ios_config to cisco.ios.ios

PLAYBOOK: tofqcn.yml *****************************************************************************************************
1 plays in tofqcn.yml

PLAY [ios] ***************************************************************************************************************
META: ran handlers

TASK [assert ntp server] *************************************************************************************************
task path: /Users/sakana/ansible/tofqcn.yml:24
ok: [rt01] => changed=false 
  msg: All assertions passed
redirecting (type: action) cisco.ios.ios_config to cisco.ios.ios

TASK [ios test] **********************************************************************************************************
task path: /Users/sakana/ansible/tofqcn.yml:28
redirecting (type: action) cisco.ios.ios_config to cisco.ios.ios
redirecting (type: action) cisco.ios.ios_config to cisco.ios.ios
<...(略)...
ok: [rt01] => changed=false 
...(略)...
META: ran handlers
META: ran handlers

PLAY RECAP ***************************************************************************************************************
rt01                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

いくつか redirecting というログが表示されましたが、さきほどは ansible.builtin.ios to cisco.ios.ios だったのが、cisco.ios.ios_config to cisco.ios.ios になりました。

リダイレクトを無効にしても正常終了

ansible_builtin_runtime.yml の内容をすべてコメントアウトし、リダイレクトを無効にして実行しても、正常に実行できました。ログは同じでした。

これで FQCN 化ができたようです。

(補足)collection の名前空間をまとめて指定する collections ディレクティブ

cisco.ios.ios_config のように、タスクでモジュール名を指定するたびに FQCN 表記にしてもよいのですが、まとめて指定する[ collections ディレクティブ]](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html#using-collections-in-a-playbook)があります。

具体的には、以下のように指定します。この指定により、装飾なしの ios_configcisco.ios collection として探索する処理が有効になります。リダイレクトも不要です。

- hosts: ios
  gather_facts: false
  collections:      # collection の指定
    - cisco.ios 
    
  vars:
    ntp_server: 10.0.0.123
    
  tasks:
    - name: assert ntp server
      assert:
        that: ntp_server | ansible.netcommon.ipv4

    - name: ios test
      ios_config:   # 装飾なし
        lines:
          - "ntp server {{ ntp_server }}"

ただし、フィルターなど(上記では ipv4)には効かないのでご注意ください。

Using collections — Ansible Documentation

Note that an FQCN is still required for non-action or module plugins (for example, lookups, filters, tests).


おわりに

FQCN 化して、リダイレクトに頼らない Playbook にする手順をご紹介しました。

リダイレクトを使う、使わないに限らず、モジュールがどの collection に所属しているかを今後は意識する機会が増えてくると思いますので、ansible_builtin_runtime.ymlは要チェックです。

[Ansible] デフォルトを gather_facts: false 扱いにする

はじめに

gather_facts のデフォルトは true です。つまり、各種システム情報はデフォルトで収集されます。

実際のところは、お決まりのように gather_facts: false を指定して無効にするケースのほうが多いのではないでしょうか。

デフォルトの挙動は DEFAULT_GATHERING という設定項目で変更できます。

デフォルトを無効にして挙動を試してみます。

パターン1: gathering=explicit、gather_facts 指定なし

ansible.cfg に以下の設定を追加します。

[defaults]
gathering=explicit

gathering が、設定項目 DEFAULT_GATHERINGansible.cfg で指定するときのキー名です。環境変数の場合は ANSIBLE_GATHERING

デフォルトは implicit で、gather_facts: false しない限り暗黙的に収集します。 上記で指定した explicitimplicit の逆です。gather_facts: true しない限り収集しません。

Playbook は以下。gather_facts は指定しませんが、先の設定により収集しない動作を期待します。

---
- hosts: rt01

  tasks:
    - name:
      debug:
        msg: hello

実行。ファクトの収集はされず、GATHERING_FACTS もログに表示されません。ok=1 です。

$ ansible-playbook -i ../inventory.ini collections.yml

PLAY [rt01] *****************************************************************************************

TASK [debug] ****************************************************************************************
ok: [rt01] => {
    "msg": "hello"
}

PLAY RECAP ******************************************************************************************
rt01      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

パターン2: gathering=explicitgather_facts: true

ansible.cfg

[defaults]
gathering=explicit

のままにして、Playbook 側で gather_facts: true を指定します。

---
- hosts: rt01
  gather_facts: true    # 明示的に true 指定

  tasks:
    - name:
      debug:
        msg: hello

実行。ファクト収集がされ、Gathering Facts がログに表示されました。ok=2 です。

$ ansible-playbook -i ../inventory.ini collections.yml

PLAY [rt01] ***************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************

TASK [debug] **************************************************************************************************
ok: [rt01] => {
    "msg": "hello"
}

PLAY RECAP ****************************************************************************************************
rt01          : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

おわりに

都度都度 gather_facts: false を指定するのがつらいときはデフォルトを変更してしまうのも手かもしれません。ただ、初見だと不思議におもられる可能性があるため少し注意です。

docs.ansible.com

[Ansible] collection のアップデートやバージョン指定の再インストール方法

はじめに

Collection は ansible-galaxy collection install コマンドでインストールします。

ただし、現状はアップデートするための専用オプションはありません(issueはopen)。また、すでに同名の collection がインストールされている

この記事では -f オプションを使って強制的にアップデートや、バージョン指定してインストールする方法を紹介します。

  • 動作確認環境
    • ansible-base 2.10.1


■ collection のアップデートの例

現在のバージョン確認

現在は cisco.ios collection の v1.0.0 がインストールされています。ansible-galaxy collection list コマンドで確認します。

$ ansible-galaxy collection list

# /Users/sakana/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 1.2.1  
cisco.ios         1.0.0 

最新安定版へアップデート

本記事を執筆時の最新安定版は 1.0.3 なのでアップデートします。-f オプションを利用します。

$ ansible-galaxy collection install cisco.ios -f
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'cisco.ios:1.0.3' to '/Users/sakana/.ansible/collections/ansible_collections/cisco/ios'
Downloading https://galaxy.ansible.com/download/cisco-ios-1.0.3.tar.gz to /Users/sakana/.ansible/tmp/ansible-local-358124d4ssl1x/tmpy7pt2mfw
cisco.ios (1.0.3) was installed successfully
Skipping 'ansible.netcommon' as it is already installed

1.0.3 がインストールされました。依存している ansible.netcommon collection はそのままです。

なお、-f オプションをつけないと、すでにインストールされている旨のメッセージが表示されるだけです。

$ ansible-galaxy collection install cisco.ios           
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Skipping 'cisco.ios' as it is already installed

事後確認

再度 ansible-galaxy collection list コマンドで確認します。

$ ansible-galaxy collection list                

# /Users/sakana/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 1.2.1  
cisco.ios         1.0.3  


■ バージョンを指定して再インストールする例

pip の場合はバージョン指定するとそのバージョンで再インストールされますが、collection の場合は再インストールできません。

この場合も先程と同様に -f オプション を利用します。

事前確認

cisco.ios の 1.0.3 がインストールされている状態です。

$ ansible-galaxy collection list                

# /Users/sakana/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 1.2.1  
cisco.ios         1.0.3  

バージョン指定再インストール

cisco.ios を 1.0.0 にします。

$ ansible-galaxy collection install cisco.ios:1.0.0 -f
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'cisco.ios:1.0.0' to '/Users/sakana/.ansible/collections/ansible_collections/cisco/ios'
Downloading https://galaxy.ansible.com/download/cisco-ios-1.0.0.tar.gz to /Users/sakana/.ansible/tmp/ansible-local-35887zb347nj6/tmpk_1j7zvp
cisco.ios (1.0.0) was installed successfully
Skipping 'ansible.netcommon' as it is already installed

なお、インストールされていない状態の場合は、-f オプションは不要です。

参考: https://docs.ansible.com/ansible/latest/user_guide/collections_using.html#installing-an-older-version-of-a-collection

事後確認

$ ansible-galaxy collection list                        

# /Users/sakana/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 1.2.1  
cisco.ios         1.0.0  

1.0.0 になりました。


おわりに

今後はもしかしたらアップデート専用オプションができるかもしれません。

[Ansible] FQCN へのリダイレクト定義とansible とセットの collection の定義

はじめに

Ansible 2.10 で Collection 運用が本格的に始まったことにより、本体側にも新しい仕組みができました。

わりと重要そうだけど埋もれそうな情報として以下の2点のリンクを掲載ます。

  1. Ansible2.9までにあったモジュールを装飾なし表記(FQCNでない)した場合の FQCNへのリダイレクト先の定義
  2. ansibleansible-base とどのcollection をセットにしているかの定義

1. FQCN へのリダイレクト定義

Ansible 2.9 から 2.10 への移行容易性(おそらく)のため、これまであったモジュール名などを、装飾なし(FQDNでない)で指定したときに、リダイレクト先FQCNを定義したデータです。

  • ansible_builtin_runtime.yml

github.com

たとえば、

    ios_config:
      redirect: cisco.ios.ios_config

であれば、ios_config と表記したときに FQCN cisco.ios.ios_config にリダイレクトされることが分かります。リダイレクトの様子は ansible-playbook コマンドで -vvv のように v を3つ以上つけたときに redirecting (type: action) ansible.builtin.ios to cisco.ios.ios のようなログとして確認できます。(対象の collection がインストールされていることが前提です)

なお、このデータは間違いがあるときもあるので、うまく呼び出せないときは疑ったほうがいいです。呼び出せない場合は Playbook 実行時に以下のようなエラーになります。

ERROR! couldn't resolve module/action 'ios_config'. This often indicates a misspelling, missing collection, or incorrect module path.


2. ansible とセットの collection の定義

ansible は ansible-base と collection のセットで構成されます。

どのようなセットかを定義するデータはこちらです。

github.com

たとえば、ansible 2.10.0rc1 であれば、2.10/ansible-2.10.0rc1.deps を参照します。

_ansible_base_version: 2.10.1

とあるのでは、 ansible-base は 2.10.1 を利用することが分かります。

ほか、たとえば、

cisco.ios: 1.0.3

であれば、cisco.ios collection の v1.0.3をセットにすることが分かります。