首页 » 翻译 » Ansible 入门 » 正文

通过crontab来执行ansible-playbook 自动加载ssh-key的问题

有时候我们的ansible-playbook我们希望定时执行以确保线上环境的状态,例如,每天定时执行一次,保证nginx的配置文件是最新的

这个时候,我们就要面临一个问题,如何让ansible-playbook使用指定 的key来执行,例如

ansible是无法自动加载.ssh/id_rsa来连接目标主机的(crontab状态下),

虽然,我们在命令行下可以不额外添加key,可以直接运行/home/ansible/ansible-playbook test.yml 命令行下是可以自动加载.ssh/id_rsa

这个时候我们需要在执行playbook前加载我们指定的ssh-key,这个时候我们就需要ssh-agent来帮我们实现

基本原理:

情况1:已经存在ssh-agent 那么尝试添加指定key到ssh-agent ,然后执行playbook

情况2:不存在ssh-agent,那么打开一个ssh-agent,然后执行playbook

程序是如何判断是否存在ssh-agent进程的呢?通过环境变量中是否存在SSH_AGENT_PID,存在说明已经有了,不存在说明没有

如果我们执行ansible-playbook 的 crontab 所在的用户在我们设置完crontab后就退出的情况下,环境变量是不可能存在的,所以这种情况下,每次都会临时打开一个ssh-agent ,corntab运行结束后ssh-agent就会被销毁(哪怕存在ssh-agent的进程,环境变量的问题,导致脚本会认为不存在)

具体脚本

来看一下autokeys_loader.sh

这样操作后,crontab就可以完美执行了

附上ansible playbook

 

 

 

 

 

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)