Por qué command rompe la idempotencia
La trampa del shell sin procesar y cómo evitarla.
Por qué command rompe la idempotencia es una lección gratuita de DevOps Bootcamp en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de DevOps Bootcamp, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de DevOps Bootcamp incluye 4 lecciones en total.
command siempre se ejecuta
El módulo command simplemente ejecuta en el host lo que se le indique. No sabe cómo se ve un estado «completado», así que se ejecuta cada vez.
ansible.builtin.command: useradd deploySiempre changed
Como command no puede inspeccionar el estado, Ansible informa de changed en cada ejecución, incluso cuando el comando no hizo nada nuevo.
changed: [web1]Volver a ejecutar puede causar daños
Peor aún, algunos comandos fallan o duplican el trabajo al volver a ejecutarse, como useradd, que produce un error porque el usuario ya existe.
Prefiera un módulo basado en el estado
Para los usuarios, utilice en su lugar el módulo user. Comprueba si la cuenta existe y solo la crea cuando falta, manteniendo la idempotencia.
ansible.builtin.user:
name: deploy
state: presentNormalmente existe un módulo
La mayoría de las tareas de shell habituales tienen un módulo específico: file, copy, lineinfile y git. Úselos para que Ansible pueda comparar y omitir la tarea cuando todo sea correcto.
Proteja command con creates
Si debe utilizar command, añada creates. Ansible omite la tarea cuando esa ruta ya existe, restaurando la idempotencia.
ansible.builtin.command: ./build.sh
args:
creates: /opt/app/builtO protéjalo con removes
El equivalente de creates es removes: el comando solo se ejecuta si la ruta indicada todavía existe, lo que resulta útil para tareas de limpieza.
ansible.builtin.command: rm /tmp/lock
args:
removes: /tmp/lockCondicione command con when
También puede envolver un comando en una condición when basada en una comprobación registrada, para que se ejecute solo cuando sea realmente necesario.
Indique a Ansible que no hizo nada
Establezca changed_when: false en un comando de solo lectura para que Ansible deje de informarlo como changed en cada ejecución.
ansible.builtin.command: cat /etc/hostname
changed_when: falseshell tiene el mismo problema
El módulo shell comparte este defecto. Se ejecuta mediante un shell, por lo que tampoco es idempotente a menos que lo proteja de la misma manera.
Trate los comandos sin procesar como último recurso
command sin procesar es una vía de escape, no la opción predeterminada. Cada uso es un punto en el que la idempotencia puede fallar silenciosamente, así que recurra a él solo cuando no haya un módulo adecuado.
Comprobación rápida
Ha utilizado command para ejecutar un script de compilación y muestra changed en cada ejecución.
Resumen
Los módulos command y shell siempre se ejecutan y siempre informan de changed. Prefiera módulos adecuados o protéjalos con creates, removes o changed_when. 🛡️
Preguntas frecuentes
¿La lección «Por qué command rompe la idempotencia» es gratis?
Sí — el texto completo de «Por qué command rompe la idempotencia» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de DevOps Bootcamp, actualiza a CoddyKit PRO. El curso de DevOps Bootcamp incluye 4 lecciones en total.
¿Qué aprenderé en «Por qué command rompe la idempotencia»?
La trampa del shell sin procesar y cómo evitarla. Practicas DevOps Bootcamp con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar DevOps Bootcamp?
No se requiere experiencia previa. DevOps Bootcamp en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Por qué command rompe la idempotencia»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de DevOps Bootcamp?
Sí. Cada lección de DevOps Bootcamp incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Estado deseado, no scripts paso a paso
- Leer changed frente a ok en la salida
- Por qué command rompe la idempotencia
- Modo de comprobación: ejecución en seco con --check