Ansibleで自動化を進めている最中に、突然「Ansible: failed: [host] (item=x) => msg: 'with_items' is no longer supported」なんてエラーが出てきて、「え、今まで動いてたのに!?」と焦った経験、ありますよね? 特に、以前書いた古いPlaybookを動かそうとした時や、既存のPlaybookを参考に新しいものを作ろうとした時に、このエラーでハマりがちです。
でも、安心してください!これはあなたが悪いわけでも、設定ミスでもありません。Ansibleの進化に伴う自然な変化なんです。結論から言うと、このエラーはAnsibleのバージョンアップに伴い、古いループ構文with_itemsが非推奨となり、代わりに新しいloopキーワードの使用が求められていることが主な原因です。そして、その解決策はシンプルにwith_itemsをloopに書き換えること。さあ、一緒に解決していきましょう!
目次
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_itemsをloopに書き換える(推奨!)
これが最も推奨される解決策であり、Ansibleの公式ドキュメントでも案内されている現代的な書き方です。ほとんどの場合、with_itemsをloopに置き換えるだけで解決します。
例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.keyとitem.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_*プラグインをloopとlookupで代替する
with_fileglobやwith_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_items、with_dict、with_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_itemsをloopに書き換えることで、ほとんどの問題は解決します。これは面倒な作業に感じるかもしれませんが、未来のAnsible環境であなたのPlaybookが安定して動作するための重要なステップです。
新しい技術や記法に戸惑うのは、エンジニアなら誰でも経験すること。でも、一つ一つ乗り越えていくことで、あなたのスキルは確実に向上します。恐れずにloop構文を使いこなし、さらに効率的な自動化を目指してください!
もし他に困ったことがあれば、いつでも質問してくださいね。私も経験豊富なベテランとして、全力でサポートします!
“`