我尝试使用 Ansible 的剧本运行 crontab 作业时遇到了奇怪的行为。
首先,我有类似的 crontab 行,使用 Ansible 剧本,运行完美,所以问题要么是这个特定的剧本,要么是 crontab 选项中缺少某些东西。
无论如何,剧本做了以下事情:
1.- 运行剧本的 Ubuntu 服务器(本地主机)将“Documents”文件夹压缩为 .zip 文件并将其存储在 /home/user 中。
2.- 与 NAS 服务器(远程主机)建立 ssh 连接,将 .zipped“Documents”文件夹复制到 NAS,然后我使用本地命名约定更改 .zip 文件的名称。
3.- 清理 Ubuntu 中的 .zip 文件。
因此,就像我在标题中所说的那样,当我使用以下命令从终端运行剧本时:
$ sudo ansible-playbook ubuntu2nasBackup.yml
剧本运行完美:创建 zip 文件 -> 通过 ssh 复制到远程主机 -> 清理 .zip 文件。
当我尝试添加到 crontab 作业(我必须添加 root crontab)时,上面的项目符号 #1 被创建,但是 zip 文件没有被复制到远程主机。
$ sudo crontab -e
22 20 * * * /usr/bin/ansible-playbook /home/user/Documents/ansible101/ubuntu2nasBackup.yml
我曾尝试(但没有成功)寻找一种 t-shoot 的方法并对必须发生的错误或超时获得一些反馈,但似乎没有任何效果。
我是否遗漏了什么?是否有任何建议可供参考?
如果需要透露剧本,请告诉我,但就像我说的,如果我从终端运行它,它就会起作用。
答案1
我整理好了!
首先,我必须弄清楚如何将 crontab 作业的一些输出生成到 .log 或 .txt 文件中,以便了解为什么会出现这种奇怪的行为。
为此我使用了这个答案。
所以基本上,我在 crontab 文档中添加了这一行:
* * * * * /usr/bin/ansible-playbook playbook.yml >> /PATH/TO/File.log 2>&1
检查 File.log 中的输出,我发现当我从用户运行剧本时,我也从测试文件夹使用测试文件夹中的 ansible.cfg 执行了该操作,该文件夹在 ssh_connection 部分有几个属性,以实现与远程服务器的正确 ssh 通信。
从 root 的 crontab 运行时,使用的 ansible.cfg 是存储在 /etc/ansible/ 文件夹中的 ansible.cfg。
基本上,ansible.cfg按照此顺序:
可以在配置文件中进行更改并使用配置文件,配置文件将按以下顺序进行搜索:
ANSIBLE_CONFIG(如果设置则为环境变量)
ansible.cfg(在当前目录中)
~/.ansible.cfg(在主目录中)
/etc/ansible/ansible.cfg
无论如何,当我添加 /etc/ansible/ansible.cfg 文件中添加的几行额外代码时,cron 作业就运行得很好。
答案2
我遇到了同样的问题。我的 yml 文件运行正常,但该文件夹中没有 ansible.cfg。我用于运行剧本的命令如下:
ansible-playbook -i hosts.ini -l server_name my_file.yml
我不知道该在 cfg 文件中添加什么,所以我做了一些小技巧。尽管我在 crontab 文件中给出了确切的文件路径,但我还是cd /my_yml_location/
在脚本开头添加了一个。幸运的是,它以这种方式工作。