【Ansible】’with_items’ is no longer supportedエラーでハマったあなたへ!原因と最速解決策

Ansibleで自動化を進めている最中に、突然「Ansible: failed: [host] (item=x) => msg: 'with_items' is no longer supported」なんてエラーが出てきて、「え、今まで動いてたのに!?」と焦った経験、ありますよね? 特に、以前書いた古いPlaybookを動かそうとした時や、既存のPlaybookを参考に新しいものを作ろうとした時に、このエラーでハマりがちです。

でも、安心してください!これはあなたが悪いわけでも、設定ミスでもありません。Ansibleの進化に伴う自然な変化なんです。結論から言うと、このエラーはAnsibleのバージョンアップに伴い、古いループ構文with_itemsが非推奨となり、代わりに新しいloopキーワードの使用が求められていることが主な原因です。そして、その解決策はシンプルにwith_itemsloopに書き換えること。さあ、一緒に解決していきましょう!

1. エラーコード Ansible: failed: [host] (item=x) => msg: ‘with_items’ is no longer supported とは?

このエラーメッセージは、その名の通り「with_itemsがもうサポートされていませんよ」とAnsibleが教えてくれているものです。具体的には、Playbook内でリストや辞書をループ処理する際に使っていたwith_itemsという書き方が、現在のAnsibleバージョンでは使えなくなっていることを意味します。

このエラーが出ると、Playbookの実行は停止し、タスクは失敗します。つまり、あなたの自動化プロセスは止まってしまっている状態なので、早急な対処が必要です。特にAnsible 2.5以降のバージョンからこの変更が段階的に導入され、より新しいバージョンでは完全に非推奨、あるいはエラーとなるようになっています。

2. 最速の解決策 3選

では、具体的にどうすればこのエラーを解決できるのか、ベテランエンジニアの私から最も効果的な方法を3つご紹介します。

解決策1: with_itemsloopに書き換える(推奨!)

これが最も推奨される解決策であり、Ansibleの公式ドキュメントでも案内されている現代的な書き方です。ほとんどの場合、with_itemsloopに置き換えるだけで解決します。

例1: シンプルなリストのループ

変更前:

- name: old style loop with items
  debug:
    msg: "Hello {{ item }}"
  with_items:
    - Alice
    - Bob
    - Charlie

変更後:

- name: new style loop
  debug:
    msg: "Hello {{ item }}"
  loop:
    - Alice
    - Bob
    - Charlie

例2: 変数を使ったリストのループ

変更前:

- name: old style loop with variable
  command: echo "Processing {{ item }}"
  vars:
    my_users:
      - user1
      - user2
  with_items: "{{ my_users }}"

変更後:

- name: new style loop with variable
  command: echo "Processing {{ item }}"
  vars:
    my_users:
      - user1
      - user2
  loop: "{{ my_users }}"

例3: 辞書(ハッシュ)のループ

with_dictを使っていた場合も、loopに置き換えられます。この際、ループ内の要素はitem.keyitem.valueでアクセスします。

変更前:

- name: old style loop with dict
  debug:
    msg: "Key: {{ item.key }}, Value: {{ item.value }}"
  with_dict:
    name: John
    age: 30

変更後:

- name: new style loop with dict
  debug:
    msg: "Key: {{ item.key }}, Value: {{ item.value }}"
  loop: "{{ dict | dict2items }}" # dict2items フィルタを使ってキーとバリューのリストに変換
  vars:
    dict:
      name: John
      age: 30
おめでとうございます! ほとんどのケースで、このwith_itemsからloopへの書き換えでエラーは解決するはずです。まずはこの方法を試してみてください!

解決策2: Ansibleのバージョンを下げる(非推奨だが一時的な回避策)

もしどうしてもPlaybookを書き換える時間がない、あるいは広範囲にわたる変更で影響範囲が大きいといった事情がある場合は、一時的にAnsibleのバージョンを下げることで回避できる可能性があります。

【注意!】この方法は非推奨です。

  • 古いバージョンは、セキュリティの脆弱性が修正されていない可能性があります。
  • 新しい機能や改善点が利用できなくなります。
  • 将来的に再度バージョンアップする際に、同じ問題に直面する可能性があります。

あくまで一時的な回避策として検討し、根本解決(loopへの移行)を強く推奨します。

解決策3: with_*プラグインをlooplookupで代替する

with_fileglobwith_sequenceなど、with_items以外のwith_*系のループプラグインを使っていた場合は、loopキーワードとlookupプラグインを組み合わせることで同等の機能を実現できます。

例: with_fileglob の代替

変更前:

- name: old style loop with fileglob
  debug:
    msg: "Found file: {{ item }}"
  with_fileglob:
    - "/etc/*.conf"

変更後:

- name: new style loop with lookup('fileglob')
  debug:
    msg: "Found file: {{ item }}"
  loop: "{{ lookup('fileglob', '/etc/*.conf') }}"

これは少し応用的なテクニックですが、with_*系のループプラグインを使っている場合は参考にしてください。

3. エラーの根本原因と再発防止策

根本原因:Ansibleの進化とループ構文の統一

このエラーの背景には、Ansible開発チームがループ構文をより統一的で柔軟なものにしようとした意図があります。以前はwith_itemswith_dictwith_fileglobなど、用途に応じた様々なwith_*キーワードが存在しました。

しかし、これらのキーワードは機能が重複したり、書き方が少しずつ異なったりして、学習コストやメンテナンスの複雑さの原因にもなっていました。そこで、Ansible 2.5以降、汎用的なloopキーワードと各種フィルタやlookupプラグインを組み合わせることで、あらゆるループ処理に対応できるように設計が変更されたのです。

これにより、Playbookの可読性が向上し、より強力で複雑なループ処理もスマートに記述できるようになりました。つまり、このエラーはAnsibleがより良いツールへと進化している証なんです。

再発防止策:未来を見据えたPlaybook開発

今後、同じようなエラーで時間を無駄にしないために、以下の点を意識しましょう。

  • 新しいPlaybookはloopで書く:これから作成するPlaybookでは、最初からloopキーワードを使用する習慣をつけましょう。古いPlaybookを参考にするときも、ループ部分だけは新しい書き方に変換する意識が大切です。
  • 既存Playbookの計画的移行:大規模な環境で運用しているPlaybookがある場合は、影響範囲を考慮しつつ、徐々にwith_itemsからloopへの移行を進める計画を立てましょう。CI/CDパイプラインに組み込むなどして、自動テストも忘れずに!
  • Ansibleのリリースノートをチェック:Ansibleのバージョンアップは、機能追加だけでなく、非推奨化や仕様変更も伴います。特にメジャーバージョンアップ時には、公式のリリースノートをチェックして、変更点を確認する習慣をつけましょう。deprecation(非推奨)に関する記述は要チェックです。
  • Lintツールの活用:ansible-lintのような静的解析ツールを導入することで、Playbook内の古い記法や潜在的な問題を自動的に検知できるようになります。開発段階で問題を早期発見できるため、非常に効果的です。

4. まとめ

今回は、Ansibleの「with_items is no longer supported」エラーについて、その原因から具体的な解決策、そして再発防止策までを詳しく解説しました。

まとめると、このエラーはAnsibleが進化し、より強力なloop構文へと移行した結果です。with_itemsloopに書き換えることで、ほとんどの問題は解決します。これは面倒な作業に感じるかもしれませんが、未来のAnsible環境であなたのPlaybookが安定して動作するための重要なステップです。

新しい技術や記法に戸惑うのは、エンジニアなら誰でも経験すること。でも、一つ一つ乗り越えていくことで、あなたのスキルは確実に向上します。恐れずにloop構文を使いこなし、さらに効率的な自動化を目指してください!

もし他に困ったことがあれば、いつでも質問してくださいね。私も経験豊富なベテランとして、全力でサポートします!

“`