Manual do Ansible - concat variável em condicional

Manual do Ansible - concat variável em condicional

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 ..._pathvariáveis ​​sempre terminam com uma barra ( /).

Explicação:Ele pega uma lista de caminhos de arquivo migration_paths_my_pce os copia de migration_source_pathpara 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 alteradas project/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_pathe migration_source_pathem seus exemplos, então escolhi arbitrariamente migration_source_patho 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_pathand 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 withou with_fileglob. Se você realmente deseja ter uma lista de arquivos que deseja copiar de um destino para outro, pode escrever a lista na withparte. 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 whenpara 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.

informação relacionada