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 ..._path
variables siempre terminan con una barra diagonal ( /
).
Explicación:Toma una lista de rutas de archivos migration_paths_my_pc
y las copia desde migration_source_path
a 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 modificadasproject/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_path
y migration_source_path
en tus ejemplos, por lo que elegí arbitrariamente migration_source_path
el 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_path
y 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 with
o with_fileglob
. Si realmente desea tener una lista de archivos que desea copiar de un destino a otro, puede escribir la lista en la with
parte. 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 when
decirle 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.