Шаблон Jinja в Ansible рассматривает «dest» как каталог, а не как файл - PullRequest
0 голосов
/ 05 марта 2019

ТЛ; др
Модуль шаблона Ansible рассматривает назначение шаблона как каталог, а не как файл. Чего мне не хватает?

Положение:
Я использую роль anulf-restic paulfantom в другой роли, названной backups-role. Я тестирую свою роль с помощью фиктивной playbook в локальной среде lxc, которая устанавливает службу базы данных, а затем использует ansible-restic для создания задания cron для ее резервного копирования. В целях тестирования местом назначения резервной копии является локальный репо-репозиторий: /var/backup/backups-test. Я использую только один restic_repo с именем backups-test Неверно! переменная называлась {{ ansible_hostname }}/{{ ansible_date_time.epoch }}, что эквивалентно myhost.local/1551799877. Смотрите ответ напрямую.

Задача
Это задание с заданной стабильной ролью ( 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

Боюсь, это вместо этого связано с моим окружением, но я не знаю, что может сделать ответное изменение этого поведения, и моя книга игр не выполняет черную магию.

Некоторые подробности
Я использую ANSIB версии 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 Ответ

0 голосов
/ 06 марта 2019

Я отвечаю сам, потому что решил это с подсказками @ TheLastProject от github.com.Смотри только что спросил:

Каково значение вашей переменной restic_repos?

И оказалось, что информация, которую я предоставил в вопросе, была неверной.Я устанавливал переменную с косой чертой / в середине имени, до сих пор не знаю почему.Поэтому, когда ansible-restic пытался убедиться в существовании /etc/cron.d/{{ repo_name }}, он фактически пытался проверить /etc/cron.d/myhost.local/1551799877, который явно не существовал, и не создавал его, потому что он создает только файлы, а не промежуточных родителей.

Так что никакой магии и никаких ошибок в Ansible!

...