Шаблон Jinja в Ansible обрабатывает «dest» как каталог, а не как файл

#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. Спасибо за комментарий. Я удалил свой ответ. Здесь нет значения. Возможно, вы захотите сделать то же самое.