Ansible中的Jinja模板将“目标”视为目录而不是文件

时间:2019-03-05 16:31:16

标签: ansible ansible-template

tl;博士
Ansible的模板模块将模板目标视为目录而不是文件。我想念什么?

情况:
我在另一个名为backups-role的角色中使用paulfantom的ansible-restic角色。我正在本地lxc环境中使用虚拟剧本测试我的角色,该环境中将安装数据库服务,然后使用ansible-restic创建一个cron作业来备份它。出于测试目的,备份目标是本地Restic存储库:/var/backup/backups-test。我仅使用一个名为 {backups-test 的restic_repo!该变量被命名为{{ 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在这里应该做的是在目录restic-backups-test内基于名称/etc/cron.d/的模板部署cron脚本。但是,似乎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

恐怕它与我的环境有关,但是我不知道是什么可以使这种行为发生明显变化,而且我的剧本没有黑魔法。

更多详细信息
我正在从Debian Stretch机器上使用python 3.5.3运行ansible版本2.7.8,使用来宾os Ubuntu Bionic和python 2.7.15rc1和python 3.6.7在Linux容器上运行Linux容器。 python symlink指向python2.7。我也尝试过使用python3.6获得相同的结果。

请愿书
你能帮我弄清楚吗?最后,我只希望它能够工作而不必修改上游角色。时间戳文件名可能是您可能会理解的提示。

1 个答案:

答案 0 :(得分:0)

我用github.com的@ TheLastProject提示解决了这个问题,因此我进行了自我回答。见刚才问到的:

  

restic_repos变量的值是什么?

事实证明,我在问题中提供的信息有误。我在名称中间用斜杠/设置了变量,但仍然不知道为什么。因此,当ansible-restic试图确保存在/etc/cron.d/{{ repo_name }}时,它实际上是在尝试检查/etc/cron.d/myhost.local/1551799877(显然不存在),并且没有创建它,因为它只会创建文件,而不是中间父母。

所以Ansible中没有魔术,也没有bug!