#ansible #ansible-template
#ansible #ansible-template
Вопрос:
tl; dr
Модуль шаблонов Ansible обрабатывает назначение шаблона как каталог, а не как файл. Чего я не понимаю?
Ситуация:
Я использую роль paulfantom’s ansible-restic в другой роли с именем backups-role
. Я тестирую свою роль с помощью фиктивного playbook в локальной среде lxc, которая устанавливает службу базы данных, а затем использует ansible-restic для создания задания cron для его резервного копирования. В целях тестирования местом назначения резервной копии является локальное репозиторий restic: /var/backup/backups-test
. Я использую только один restic_repo с неправильным именем! переменной было присвоено имя backups-test
{{ ansible_hostname }}/{{ ansible_date_time.epoch }}
, вычисленное как нечто эквивалентное myhost.local/1551799877
. Смотрите ответ напрямую.
Проблема
Эта задача ansible со стабильной ролью ansible (ansible-restic):
- name: Deploy cron script
template:
src: 'restic.cron.j2'
dest: '/etc/cron.d/restic-{{ item.name }}'
mode: '0640'
no_log: false
with_items: '{{ restic_repos }}'
register: _cronfiles
… сбой с жалобой на:
Destination directory /etc/cron.d/restic-backups-test does not exist
Обсуждение
Что ansible-restic должен сделать здесь, так это развернуть cron-скрипт на основе шаблона с именем restic-backups-test
внутри каталога /etc/cron.d/
. Однако, похоже, что ansible интерпретирует, что каталог должен быть /etc/cron.d/restic-backups-test
, а имя файла должно соответствовать временной метке эпохи, подобной 1551799877
, вопреки тому, что предлагает сам ansible docs:
# Example from Ansible Playbooks
- template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: 0644
Боюсь, что это связано с моим окружением, но я не знаю, что могло бы заставить ansible изменить это поведение, и мой playbook не использует черную магию.
Еще несколько деталей
Я запускаю ansible версии 2.7.8 с python 3.5.3 с компьютера Debian Stretch на контейнере Linux с гостевой ОС Ubuntu Bionic с python 2.7.15rc1 и python 3.6.7 . символическая ссылка python указывает на python2.7 . Я пробовал также с python3.6 с тем же результатом.
Ходатайство
Можете ли вы помочь мне разобраться в этом? В конце я просто хочу, чтобы он работал без необходимости изменять вышестоящую роль. Имя файла с временной меткой может быть подсказкой, которую вы можете понять.
Ответ №1:
Я отвечаю сам, потому что я решил это с помощью подсказок @TheLastProject из github.com. Смотрите, только что спрошенный:
Каково значение вашей переменной restic_repos?
И оказалось, что информация, которую я предоставил в вопросе, была неверной. Я устанавливал переменную с косой чертой /
в середине имени, до сих пор не знаю почему. Поэтому, когда ansible-restic
пытался убедиться, что он /etc/cron.d/{{ repo_name }}
существует, на самом деле он пытался проверить /etc/cron.d/myhost.local/1551799877
, который явно не существовал, и не создавал его, потому что он создает только файлы, а не промежуточных родителей.
Итак, никакой магии и никаких ошибок в Ansible!
Комментарии:
1. Спасибо за комментарий. Я удалил свой ответ. Здесь нет значения. Возможно, вы захотите сделать то же самое.