Libro de jugadas de Ansible: concat variable en condicional

Libro de jugadas de Ansible: concat variable en condicional

Tengo una tarea de trabajo para migrar (copiar) una parte específica de mi directorio de inicio (la penúltima línea es la importante):

- name: "Migrate my-pc module home files"
  copy:
    src: "{{ migration_source_path }}{{ item }}"
    dest: "{{ migration_destination_path }}{{ item }}"
  loop: "{{ migration_paths_my_pc }}"
  when:
    - not is_migrating_all
    - "'{{ migration_source_path }}{{ item }}' is exists"
    - m_my_pc | bool

Ambas ..._pathvariables siempre terminan con una barra diagonal ( /).

Explicación:Toma una lista de rutas de archivos migration_paths_my_pcy las copia desde migration_source_patha migration_destination_path). Esto sólo sucederá si: se ha establecido la bandera para ese módulo ( m_my_pc); y el camino existe en la fuente; y de todos modos no estoy migrando todos los archivos desde homedir ( is_migrating_all).

Mi solución de trabajo actual (arriba) me da la advertencia:

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists

Entiendo que se supone que deboeliminarelllaves {{dewhen: la sección porque los condicionales tienenimplícitollaves alrededor de ellos de todos modos. El problema es que no puedo encontrar la manera de hacerlo funcionar. Algunos de los muchosfracasadointentos son:

    - vars["" + migrate_source_path + item] is exists
    - vars[migrate_source_path + item] is exists
    - vars[migrate_source_path ~ item] is exists
    - vars[migrate_source_path]vars[item] is exists
    - '' + migrate_source_path + item is exists
    - lookup('/home/k/test/test2/' + item) is exists
    - "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
    - "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
    - lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists

Fondo:

Estoy automatizando configuraciones de PC personales por razones prácticas, así como para aprender más sobre Ansible y Ansible-playbooks.

Cualquier otra recomendación o consejo también será bienvenido (en los comentarios, supongo).

ACTUALIZAR:

Mis objetivos de diseño (aspiraciones funcionales) para la migración son:

  • Quiero mantener bajo el costo de mantenimiento, pero me gustaría tener información sobre qué rutas se copiaron y cuáles se omitieron si la necesito. Entonces pensé que el script debería copiar las rutas que existen en la fuente sin detenerse o generar un error en caso de que a una ruta le falte una fuente. Las advertencias u otros mensajes sencillos serían geniales. Mi script actual hace esto de manera aceptable.
  • Sería bueno poder alternar fácilmente qué rutas obtienen un intento de copia y cuáles no (por ejemplo, algo podría cambiar en relevancia para una migración). Hacer esto project/vars/parecía intuitivo y, por lo tanto, tal vez fuera un mejor diseño que alternarlos dentro de la tarea. Otras variables que tienen más probabilidades de ser comentadas o modificadas project/vars/también se encuentran en. Comentar o descomentar algo es una única tecla de acceso rápido en la mayoría de los editores de texto e IDE. Muy conveniente.

Respuesta1

Tus intentos son demasiado complicados. Los delimitadores de Jinja no deben usarse en condiciones porque ya estás en algo que se interpreta como una expresión de Jinja, por lo que simplemente deben reemplazarse con algo que proporcione el resultado deseado.

En este caso estás creando una cadena que es la concatenación de dos variables, por lo que debes reemplazarla con concatenación:

    - (migration_source_path ~ item) is exists

Usaste ambos migrate_source_pathy migration_source_pathen tus ejemplos, por lo que elegí arbitrariamente migration_source_pathel correcto.

Eras bastante cercano a:

    - '' + migration_source_path + item is exists

pero tiene una cadena vacía inicial innecesaria que no le gustará al analizador YAML, y una vez que la corrigió citándola correctamente o eliminando la cadena innecesaria:

    - "'' + migration_source_path + item is exists"
    - migration_source_path + item is exists

Intentaría agregar migration_source_pathy item is exists, ya que no forzó el orden correcto con paréntesis.

Respuesta2

Intenta reescribirlo un poco diferente. En lugar de recorrer una matriz con loop, especifique los directorios que desea copiar en witho with_fileglob. Si realmente desea tener una lista de archivos que desea copiar de un destino a otro, puede escribir la lista en la withparte. El módulo probará si el archivo fuente existe y mostrará un error, lo cual en ese caso es algo bueno, ya que de lo contrario su migración sería defectuosa.

Recuerde que solemos whendecirle a Ansible cuándo ejecutar o no una tarea, no para controlar la tarea en sí o su comportamiento. Para lograrlo, utilizamos controladores, registros y otros recursos.

Atentamente.

información relacionada