Eu tenho uma tarefa de trabalho para migrar (copiar) uma parte específica do meu homedir (a penúltima linha é a mais 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 as ..._path
variáveis sempre terminam com uma barra ( /
).
Explicação:Ele pega uma lista de caminhos de arquivo migration_paths_my_pc
e os copia de migration_source_path
para migration_destination_path
). Isso só acontecerá se: o flag desse módulo tiver sido definido ( m_my_pc
); e o caminho existe na origem; e ainda não estou migrando todos os arquivos do homedir ( is_migrating_all
).
Minha solução de trabalho atual (acima) me dá o aviso:
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists
Eu entendo que devoremoveroaparelho encaracolado {{
da when:
seção porque condicionais têmimplícitachaves ao redor deles de qualquer maneira. O problema é que não consigo descobrir como fazê-lo funcionar. Alguns dos muitosmal sucedidoas tentativas são:
- 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
Fundo:
Estou automatizando configurações pessoais de PC por motivos práticos, bem como para aprender mais sobre o Ansible e os manuais do Ansible.
Quaisquer outras recomendações ou conselhos também são bem-vindos (nos comentários, eu acho).
ATUALIZAR:
Meus objetivos de design (aspirações funcionais) para a migração são:
- Quero manter o custo de manutenção baixo, mas gostaria de ter a informação de quais caminhos foram copiados e quais foram ignorados caso eu precise. Então pensei que o script deveria copiar os caminhos que existem na origem sem parar ou gerar um erro no caso de um caminho faltar na origem. Avisos ou outras mensagens simples seriam ótimos. Meu script atual faz isso de forma aceitável.
- Seria bom poder alternar facilmente quais caminhos recebem uma tentativa de cópia e quais não (por exemplo, algo pode mudar em relevância para uma migração). Fazer isso
project/vars/
parecia intuitivo e, portanto, talvez um design melhor do que alterná-los dentro da tarefa. Outras variáveis que têm maior probabilidade de serem comentadas ou alteradasproject/vars/
também estão disponíveis. Comentar ou descomentar algo é uma única tecla de atalho na maioria dos editores de texto e IDE-s. Muito conveniente.
Responder1
Suas tentativas são muito complicadas. Os delimitadores Jinja não devem ser usados em condições porque você já está em algo que é interpretado como uma expressão Jinja, então eles só precisam ser substituídos por algo que forneça o resultado desejado.
Neste caso você está criando uma string que é a concatenação de duas variáveis, então você deve substituí-la por concatenação:
- (migration_source_path ~ item) is exists
Você usou ambos migrate_source_path
e migration_source_path
em seus exemplos, então escolhi arbitrariamente migration_source_path
o correto.
Você era meio próximo de:
- '' + migration_source_path + item is exists
mas você tem uma string vazia inicial desnecessária da qual o analisador YAML não gostará, e depois de corrigi-la citando-a corretamente ou removendo a string desnecessária:
- "'' + migration_source_path + item is exists"
- migration_source_path + item is exists
ele tentaria adicionar migration_source_path
and item is exists
, já que você não forçou a ordem correta entre parênteses.
Responder2
Tente reescrever um pouco diferente. Em vez de percorrer um array com loop
, especifique os diretórios que deseja copiar em with
ou with_fileglob
. Se você realmente deseja ter uma lista de arquivos que deseja copiar de um destino para outro, pode escrever a lista na with
parte. O módulo irá testar se o arquivo fonte existe e exibir um erro, o que nesse caso é algo bom, caso contrário sua migração seria falha.
Lembre-se que usamos when
para dizer ao Ansible quando executar ou não alguma tarefa, e não para controlar a tarefa em si ou seu comportamento. Para fazer isso, usamos manipuladores, registros e outros recursos.
Atenciosamente.