commandが冪等性を壊す理由
生のshellが招く落とし穴と回避方法を学びます
「commandが冪等性を壊す理由」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
commandは常に実行されます
commandモジュールは、ホスト上で指定された内容をそのまま実行します。「完了」の状態を判断できないため、毎回必ず実行されます。
ansible.builtin.command: useradd deploy常にchangedになります
commandは状態を確認できないため、コマンドが実際には新しい処理を何も行わなかった場合でも、Ansibleは毎回changedと報告します。
changed: [web1]再実行が害になることもあります
さらに悪いことに、再実行すると一部のコマンドは失敗したり、処理を重複して行ったりします。たとえば、ユーザーがすでに存在するためuseraddがエラーになる場合です。
状態ベースのモジュールを優先します
ユーザーを扱う場合は、代わりにuserモジュールを使用してください。アカウントの有無を確認し、存在しない場合だけ作成するため、冪等性を保てます。
ansible.builtin.user:
name: deploy
state: presentたいていの場合、専用モジュールがあります
一般的なシェル操作の多くには専用のモジュールがあります。file、copy、lineinfile、gitなどを使えば、Ansibleが状態を比較し、正しければスキップできます。
createsでcommandを保護します
commandを使わなければならない場合は、createsを追加してください。そのパスがすでに存在すると、Ansibleはタスクをスキップし、冪等性を回復できます。
ansible.builtin.command: ./build.sh
args:
creates: /opt/app/builtremovesで保護する方法もあります
createsと対になるのがremovesです。指定したパスがまだ存在する場合にだけコマンドを実行するため、クリーンアップ処理に役立ちます。
ansible.builtin.command: rm /tmp/lock
args:
removes: /tmp/lockwhenでcommandを条件付けします
登録したチェックの結果に基づくwhen条件でcommandを囲むこともできます。これにより、本当に必要な場合だけ実行されます。
何もしなかったことをAnsibleに伝えます
読み取り専用のコマンドにはchanged_when: falseを設定し、毎回changedと報告されるのを止めます。
ansible.builtin.command: cat /etc/hostname
changed_when: falseshellにも同じ問題があります
shellモジュールにも同じ欠点があります。シェル経由で実行されるため、同じ方法で保護しない限り、こちらも非冪等です。
生のcommandは最後の手段にします
生のcommandはデフォルトではなく、最後の手段です。commandを1つ使うたびに、冪等性がひそかに崩れる可能性があります。適したモジュールがない場合にだけ使用してください。
簡単な確認
commandを使ってビルドスクリプトを実行したところ、毎回changedと表示されます。
まとめ
commandモジュールとshellモジュールは常に実行され、常にchangedを報告します。実際のモジュールを優先するか、creates、removes、changed_whenで保護してください。🛡️
よくある質問
「commandが冪等性を壊す理由」レッスンは無料ですか?
はい。「commandが冪等性を壊す理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「commandが冪等性を壊す理由」で何を学びますか?
生のshellが招く落とし穴と回避方法を学びます ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「commandが冪等性を壊す理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 手順ではなく望ましい状態を記述する
- 出力のchangedとokを読む
- commandが冪等性を壊す理由
- チェックモード:--checkによるドライラン