У меня есть рабочая задача по миграции (копированию) определенной части моего домашнего каталога (предпоследняя строка — важная):
- 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, когда запускать или не запускать какую-то задачу, а не для управления самой задачей или ее поведением. Для этого мы используем обработчики, регистры и другие ресурсы.
С наилучшими пожеланиями.