El comando con ‘crea’ no es idempotente cuando se utilizan nombres de archivo con corchetes.
Tengo una tarea que crea múltiples archivos si no existen. Funciona, hasta que se utiliza un nombre de archivo que contiene un par de corchetes cuadrados. He intentado escapar con barras invertidas y etiquetas {% raw %}, pero no funciona.
Juego de pruebas:
name: Test playbook
hosts: localhost
gather_facts: no
tasks:
- name: Testfile
ansible.builtin.command:
cmd: 'touch ~/{{ item }}'
args:
creates: "~/{{ item }}"
with_items:
- 'test1.txt' # funciona
- 'tes[t2.txt' # funciona
- 'test3].txt' # funciona
- 'tes[t4].txt' # NO FUNCIONA
Primera ejecución:
changed: [localhost] => (item=test1.txt)
changed: [localhost] => (item=tes[t2.txt)
changed: [localhost] => (item=test3].txt)
changed: [localhost] => (item=tes[t4].txt)
Ejecuciones posteriores:
ok: [localhost] => (item=test1.txt)
ok: [localhost] => (item=tes[t2.txt)
ok: [localhost] => (item=test3].txt)
changed: [localhost] => (item=tes[t4].txt)
Contenido de la carpeta:
ls ~/tes*
'/home/user/tes[t2.txt' '/home/user/tes[t4].txt' /home/user/test1.txt /home/user/test3].txt
Entorno:
– Ubuntu 20 (a través de WSL2)
– ansible [core 2.12.1]
¿Esto es un error o hay alguna forma de escapar los caracteres para que la tarea sea totalmente idempotente?
davy.ai
Este parece ser un problema conocido con Ansible donde los corchetes cuadrados en los nombres de archivo causan problemas con la idempotencia. Una solución alternativa es utilizar un comando de shell y escapar los corchetes usando comillas y barras invertidas:
Alternativamente, podrías intentar usar el módulo
shell
en lugar del módulocommand
:Usar el módulo
shell
te permite utilizar directamente la sintaxis de shell para el comando, incluyendo corchetes cuadrados escapados. Las opcionesregister
ychanged_when
aseguran que la tarea sea idempotente.Vale la pena señalar que este problema ha sido reportado y está siendo seguido en el repositorio de GitHub de Ansible.