てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible-core 2.15 で vars 直下にリストで変数定義すると Deprecated(非推奨)で警告が表示される

はじめに

2023年5月にリリース予定の ansible-core 2.15 で、vars ディレクティブ直下にリストで変数を定義する方法が Deprecated(非推奨)として警告が表示されるようになります。ansible-core 2.15 の Porting Guide にも掲載されています。

言葉にするとわかりにくいのですが、以下のような定義方法です。

  vars:
    - myvar1: myvalue1
    - myvar2: myvalue2
    - myvar3: myvalue3

たまにこのような定義を見かけます。

実際どのような警告になるのか確認したかったのでベータ版で試しました。

  • 環境
    • ansible-core 2.15.0b2

Playbook

こんな Playbook で試します。

---
- name: Test play
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
    - myvar1: myvalue1
    - myvar2: myvalue2
    - myvar3: myvalue3

  tasks:
    - name: Test debug
      ansible.builtin.debug:
        msg: "{{ myvar1 }}"

おためし

Playbook の実行結果です。

% ansible-playbook -i localhost, test.yml
[DEPRECATION WARNING]: Specifying a list of dictionaries for vars is deprecated in favor of specifying a dictionary. 
This feature will be removed in version 2.18. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.

PLAY [Test play] ******************************************************************************************************

TASK [Test debug] *****************************************************************************************************
ok: [localhost] => {
    "msg": "aaaaaaa"
}

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

ということで、[DEPRECATION WARNING]: Specifying a list of dictionaries for vars is deprecated in favor of specifying a dictionary. This feature will be removed in version 2.18. という非推奨警告が表示されました。

上記の Playbook は Play変数としての vars でしたが、以下のようなタスク変数の vars でも警告が表示されました。

...(略)...
  tasks:
    - name: Test debug
      ansible.builtin.debug:
        msg: "{{ myvar1 }}"
      vars:
        - myvar1: myvalue1
        - myvar2: myvalue2
        - myvar3: myvalue3

警告が表示されない定義方法

vars を以下のように定義すれば警告は表示されません。

...(略)...
  vars:
    myvar1: myvalue1
    myvar2: myvalue2
    myvar3: myvalue3
...(略)...

この定義の方が馴染みがある方が多いと思います。

補足

もちろん、リストを含む変数の定義はこれからも大丈夫です。

...(略)...
  vars:
    mylist:               # OK
      - myvalue1
      - myvalue2
      - myvalue3
...(略)...

おわりに

今すぐ慌てて修正するほどでもないですが、これから書く Playbook は警告が表示されないかたちで定義するのが良さそうです。