如何在crontab中执行ansible playbook?

10

能否在crontab中执行ansible playbook呢?我们有一个需要每天在特定时间运行的playbook,但我知道cron不喜欢ssh。

Tower有一个内置的调度引擎,但我们不打算使用Tower。其他人是如何安排ansible playbook的?

6个回答

19

您可以使用cron作业来运行playbook。
Ansible使用-tt开关调用ssh以强制TTY,因此它应该工作良好。
只需检查以下内容:

  • 作业用户具有访问ssh私钥的权限
  • 作业环境设置正确(PYTHONPATH等)
  • 主机上没有软件包混合(例如通过pip和apt同时安装ansible)

还请检查关于ansible中quiet选项不存在的实用评论:

对于crontab有一个技巧:按如下方式运行ansible-playbook:

*/15 * * * *    if ! out=`ansible-playbook yourplaybook.yaml`; then echo $out; fi

这种方法可以让你得到完整的输出,但仅当ansible以非零状态退出时。


传递 ansible-vault 密码怎么处理? - A K
1
@AK,这里有一个方便的 --vault-password-file 选项,它允许从文件或甚至其他脚本的标准输出读取密码。 - Konstantin Suvorov
谢谢Konstantin。我能够使用cron来安排不同的playbook,它运行得很好。我遇到问题的playbook包含一个似乎有问题的Python脚本。 - Bobby Kimble

2
我们可以像konstantin-suvorov所说的那样运行,还可以使用"type"。
# whereis ansible-playbook
  /usr/bin/ansible-playbook

并使用输出中显示的路径运行

我们可以在crontab中运行此命令

#crontab -e


*/15 * * * * /usr/bin/ansible-playbook /home/user1/yourplaybook.yml

它像魔法一样运作良好。

2
它也可以起作用,我正在使用它来检查代理状态并在其停止时启动它。
*/5 * * * * ansible-playbook -i /root/playbooks/agent /root/playbooks/agent.yml



1

0
我们可以像下面这样在Bash中创建包装脚本:
ANSIBLE_PLAYBOOK=`which ansible_playbook`
cd main_dir_where_playbook_is_located
$ANSIBLE_PLAYBOOK playbook.yaml > log_file

将上述内容保存为run.sh,并像普通cron一样安排它的计划。


0
你可以这样做,但是首先你必须告诉ansible.cfg的位置,然后启动playbook,而且对于所有的操作,你也必须使用完整路径。像这样: 使用crontab -e来编辑,使用crontab -l来列出。
# Softwareupgrade
1 5 28 6 * ANSIBLE_CONFIG=/home/xxx/ansible/software-upgrade/ansible.cfg /usr/bin/ansible-playbook -i /home/xxx/ansible/software-upgrade/hosts /home/xxx/ansible/software-upgrade/upgrade.yml

如果您还想查看Ansible输出,您也必须将其重定向到文件中,像这样:
# Softwareupgrade
1 5 28 6 * ANSIBLE_CONFIG=/home/xxx/ansible/software-upgrade/ansible.cfg /usr/bin/ansible-playbook -i /home/xxx/ansible/software-upgrade/hosts /home/xxx/ansible/software-upgrade/upgrade.yml >> /home/xxx/ansible/software-upgrade/logfile.log 2>&1

只要ansible不返回"0",那就可以工作。 不幸的是,在crontab中会变成非常长的文本行,但它能正常工作,你可以在早上或定期执行任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接