Ansible playbook - переменная concat в условном операторе

Ansible playbook - переменная concat в условном операторе

У меня есть рабочая задача по миграции (копированию) определенной части моего домашнего каталога (предпоследняя строка — важная):

- 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

Обе ..._pathпеременные всегда заканчиваются косой чертой ( /).

Объяснение:Он берет список путей к файлам из migration_paths_my_pcи копирует их из migration_source_pathв migration_destination_path). Это произойдет только в том случае, если: флаг для этого модуля установлен ( m_my_pc); и путь существует в источнике; и я в любом случае еще не переношу все файлы из домашнего каталога ( is_migrating_all).

Мое текущее рабочее решение (выше) выдает предупреждение:

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

Я понимаю, что я долженудалять the Фигурные скобки {{из when:раздела, потому что условные операторы имеютподразумеваемыйфигурные скобки вокруг них в любом случае. Проблема в том, что я не могу понять, как заставить это работать. Некоторые из многихнеудачныйпопытки:

    - 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

Фон:

Я автоматизирую настройки персональных ПК из практических соображений, а также для того, чтобы узнать больше об Ansible и Ansible-playbooks.

Любые другие рекомендации или советы также приветствуются (в комментариях, я полагаю).

ОБНОВЛЯТЬ:

Мои цели дизайна (функциональные стремления) для миграции:

  • Я хочу сохранить низкую стоимость обслуживания, но я хотел бы иметь информацию о том, какие пути были скопированы, а какие пропущены, если она мне понадобится. Поэтому я подумал, что скрипт должен копировать пути, которые существуют в источнике, не останавливаясь и не выдавая ошибку в случае, если путь отсутствует в источнике. Предупреждения или другие простые сообщения были бы замечательными. Мой текущий скрипт делает это приемлемо.
  • Было бы неплохо иметь возможность легко переключать, какие пути получают попытку копирования, а какие нет (например, что-то может измениться в связи с миграцией). Выполнение этого project/vars/кажется интуитивно понятным и, следовательно, может быть лучшим решением, чем переключение их внутри задачи. Другие переменные, которые с большей вероятностью будут закомментированы или изменены, project/vars/также находятся в . Комментирование чего-либо или раскомментирование чего-либо — это одна горячая клавиша в большинстве текстовых редакторов и IDE. Так что довольно удобно.

решение1

Ваши попытки слишком сложны. Разделители Jinja не следует использовать в условиях, поскольку вы уже находитесь в чем-то, что интерпретируется как выражение Jinja, поэтому их просто нужно заменить на что-то, что обеспечивает желаемый результат.

В этом случае вы создаете строку, которая является конкатенацией двух переменных, поэтому вам следует заменить ее на конкатенацию:

    - (migration_source_path ~ item) is exists

Вы использовали оба варианта migrate_source_pathв migration_source_pathсвоих примерах, поэтому я произвольно выбрал migration_source_pathправильный вариант.

Вы были довольно близки с:

    - '' + migration_source_path + item is exists

но у вас есть ненужная начальная пустая строка, которая не понравится парсеру YAML, и как только вы исправите это, правильно заключив ее в кавычки или удалив ненужную строку:

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

он попытается добавить migration_source_pathи item is exists, поскольку вы не установили правильный порядок с помощью скобок.

решение2

Попробуйте переписать его немного по-другому. Вместо того, чтобы проходить по массиву с помощью loop, укажите каталоги, которые вы хотите скопировать, в withили with_fileglob. Если вы действительно хотите иметь список файлов, которые вы хотите скопировать из одного места назначения в другое, вы можете написать список в withчасти. Модуль проверит, существует ли исходный файл, и выведет ошибку, что в этом случае хорошо, поскольку в противном случае ваша миграция будет ошибочной.

Помните, что мы используем, whenчтобы сказать Ansible, когда запускать или не запускать какую-то задачу, а не для управления самой задачей или ее поведением. Для этого мы используем обработчики, регистры и другие ресурсы.

С наилучшими пожеланиями.

Связанный контент