es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    - name: Testfile
      ansible.builtin.command: touch "~/{{ item }}"
      args:
        creates: "~/{{ item }}"
      with_items:
        - 'test1.txt'
        - 'tes\[t2.txt'
        - 'test3\].txt'
        - 'tes\[t4\].txt'
    

    Alternativamente, podrías intentar usar el módulo shell en lugar del módulo command:

    - name: Testfile
      ansible.builtin.shell: touch "~/{{ item }}"
      args:
        creates: "~/{{ item }}"
      with_items:
        - 'test1.txt'
        - 'tes[t2.txt'
        - 'test3].txt'
        - 'tes[t4].txt'
      register: result
      changed_when: result.rc != 0
    

    Usar el módulo shell te permite utilizar directamente la sintaxis de shell para el comando, incluyendo corchetes cuadrados escapados. Las opciones register y changed_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.

Comments are closed.