tl;博士
Ansible的模板模块将模板目标视为目录而不是文件。我想念什么?
情况:
我在另一个名为backups-role
的角色中使用paulfantom的ansible-restic角色。我正在本地lxc环境中使用虚拟剧本测试我的角色,该环境中将安装数据库服务,然后使用ansible-restic创建一个cron作业来备份它。出于测试目的,备份目标是本地Restic存储库:/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在这里应该做的是在目录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获得相同的结果。
请愿书
你能帮我弄清楚吗?最后,我只希望它能够工作而不必修改上游角色。时间戳文件名可能是您可能会理解的提示。
答案 0 :(得分:0)
我用github.com的@ TheLastProject提示解决了这个问题,因此我进行了自我回答。见刚才问到的:
restic_repos变量的值是什么?
事实证明,我在问题中提供的信息有误。我在名称中间用斜杠/
设置了变量,但仍然不知道为什么。因此,当ansible-restic
试图确保存在/etc/cron.d/{{ repo_name }}
时,它实际上是在尝试检查/etc/cron.d/myhost.local/1551799877
(显然不存在),并且没有创建它,因为它只会创建文件,而不是中间父母。
所以Ansible中没有魔术,也没有bug!