เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม
กับดักของเชลล์ดิบและวิธีหลีกเลี่ยง
เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม เป็นบทเรียน Ansible Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ansible Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ansible Academy มีบทเรียนทั้งหมด 4 บทเรียน
คำสั่งทำงานทุกครั้ง
โมดูลคำสั่งเพียงเรียกใช้สิ่งที่คุณมอบให้บนโฮสต์ โมดูลไม่รู้ว่าสถานะ “เสร็จแล้ว” ควรเป็นอย่างไร จึงทำงานทุกครั้ง
ansible.builtin.command: useradd deployมีการเปลี่ยนแปลงทุกครั้ง
เนื่องจากคำสั่งไม่สามารถตรวจสอบสถานะได้ Ansible จึงรายงานเป็นchangedทุกครั้ง แม้ว่าคำสั่งจะไม่ได้ทำสิ่งใหม่จริง ๆ ก็ตาม
changed: [web1]การเรียกใช้ซ้ำอาจก่อปัญหา
ที่แย่กว่านั้นคือ คำสั่งบางอย่างอาจล้มเหลวหรือทำงานซ้ำในการเรียกใช้ครั้งถัดไป เช่น useradd ที่เกิดข้อผิดพลาดเพราะมีผู้ใช้นั้นอยู่แล้ว
เลือกใช้โมดูลที่อิงสถานะ
สำหรับผู้ใช้ ให้เลือกใช้โมดูลผู้ใช้แทน โมดูลจะตรวจสอบว่ามีบัญชีอยู่หรือไม่ และสร้างบัญชีเฉพาะเมื่อยังไม่มี จึงยังคงมีคุณสมบัติทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์
ansible.builtin.user:
name: deploy
state: presentโดยทั่วไปมักมีโมดูลให้ใช้
งานเชลล์ทั่วไปส่วนใหญ่มีโมดูลเฉพาะให้ใช้ เช่น file, copy, lineinfile และ git โปรดใช้โมดูลเหล่านี้เพื่อให้ Ansible เปรียบเทียบสถานะและข้ามงานเมื่อถูกต้องอยู่แล้ว
ป้องกันคำสั่งด้วย creates
หากจำเป็นต้องใช้คำสั่ง ให้เพิ่มcreates Ansible จะข้ามงานเมื่อเส้นทางดังกล่าวมีอยู่แล้ว ทำให้กลับมามีคุณสมบัติทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์
ansible.builtin.command: ./build.sh
args:
creates: /opt/app/builtหรือป้องกันด้วย removes
สิ่งที่ทำงานตรงข้ามกับ creates คือremoves: คำสั่งจะทำงานก็ต่อเมื่อเส้นทางที่ระบุยังมีอยู่ เหมาะสำหรับขั้นตอนล้างข้อมูล
ansible.builtin.command: rm /tmp/lock
args:
removes: /tmp/lockควบคุมคำสั่งด้วย when
คุณยังสามารถครอบคำสั่งด้วยเงื่อนไขwhenที่ขับเคลื่อนด้วยผลการตรวจสอบที่ลงทะเบียนไว้ เพื่อให้คำสั่งทำงานเฉพาะเมื่อจำเป็นจริง ๆ
บอก Ansible ว่าไม่ได้เปลี่ยนแปลงอะไร
ตั้งค่าchanged_when: falseให้กับคำสั่งแบบอ่านอย่างเดียว เพื่อให้ Ansible หยุดรายงานว่าเป็น changed ในทุกครั้งที่เรียกใช้
ansible.builtin.command: cat /etc/hostname
changed_when: falseshell ก็มีปัญหาเดียวกัน
โมดูลshellมีข้อบกพร่องแบบเดียวกัน โมดูลนี้ทำงานผ่านเชลล์ จึงไม่มีคุณสมบัติทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์เช่นกัน เว้นแต่จะป้องกันด้วยวิธีเดียวกัน
ใช้คำสั่งดิบเป็นทางเลือกสุดท้าย
คำสั่งดิบเป็นช่องทางหลบข้อจำกัด ไม่ใช่ตัวเลือกเริ่มต้น ทุกคำสั่งคือจุดที่คุณสมบัติทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์อาจเสียไปอย่างเงียบ ๆ จึงควรใช้เฉพาะเมื่อไม่มีโมดูลที่เหมาะสม
ตรวจสอบอย่างรวดเร็ว
คุณใช้คำสั่งเพื่อเรียกใช้สคริปต์สร้างโปรแกรม และคำสั่งนั้นแสดง changed ในทุกครั้งที่เรียกใช้
สรุปทบทวน
โมดูลคำสั่งและ shell ทำงานทุกครั้งและรายงาน changed ทุกครั้ง ให้เลือกใช้โมดูลจริง หรือป้องกันด้วย creates, removes หรือ changed_when 🛡️
คำถามที่พบบ่อย
บทเรียน “เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ansible Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ansible Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม”
กับดักของเชลล์ดิบและวิธีหลีกเลี่ยง คุณปฏิบัติ Ansible Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ansible Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ansible Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ansible Academy นี้ได้ไหม
ได้ บทเรียน Ansible Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถานะที่ต้องการ ไม่ใช่สคริปต์ทีละขั้นตอน
- การอ่าน changed เทียบกับ ok ในเอาต์พุต
- เหตุใด command จึงทำลายการทำงานซ้ำได้ผลเหมือนเดิม
- โหมดตรวจสอบ: การทดลองทำงานด้วย --check