默认情况下,执行 ansible 的时候,这个命令会一直处于阻塞状态,直到在每个节点上完成任务为止。这可能并不总是合乎需要的,或者您运行的操作所花费的时间超过了SSH超时。
可以在后台运行长时间运行的操作,以后再查看它们的状态。
执行临时命令是使用异步
比如如下示例是 执行一个任务持续运行 5 秒钟,超时 10 秒(-B 10),并且不等待任务返回结果(-P 0)
[root@localhost ~]# ansible dbservers -B 10 -P 0 -i hosts -a "sleep 5"
192.168.19.104 | CHANGED => {
"ansible_job_id": "301245182308.6277",
"changed": true,
"finished": 0,
"results_file": "/root/.ansible_async/301245182308.6277",
"started": 1
}
查看保存结果集的文件
[root@localhost home]# ansible dbservers -i hosts -m shell -a "cat [root@localhost home]# ansible dbservers -i hosts -m shell -a "cat /root/.ansible_async/191465439990.2210"
获取结果
应该使用 `async_status` 模块来获取结果,需要传递 job id,就是返回信息中字段 `ansible_job_id` 的值
[root@localhost home]# ansible dbservers -i hosts -m async_status -a "jid=301245182308.6277"
假如 -P 的值大于 0 就会起到同步执行的效果,整个Ansible 命令还是阻塞状态的。并且此时 -B 等待结果集的超时时间必须大于,命令实际执行消耗的时间。否则报错。
[root@localhost ~]# ansible dbservers -B 3 -P 1 -i hosts -a "sleep 5"
Playbook 中使用异步
演示一个异步任务,这个异步任务执行时长 5 秒左右,等待超时时间是 10 秒钟, 之后需把返回结果注册到变量 `job` 中,这样才能获取到每个备课主机的 job id。最后使用 `debug` 模块打印出来。
[root@localhost home]# vim async.yml
- hosts: dbservers
remote_user: root
tasks:
- name: simulate long running op (5 sec), wait for up to 6 sec, poll every 0 sec
shell: /bin/sleep 5;hostname -i
async: 6
poll: 0
register: job
- name: show job id
debug:
msg: "Job id is {{ job }}"
执行playbook
[root@localhost home]# ansible-playbook -i hosts async.yml
注意事项
不应通过将轮询值指定为0来进行需要排他锁的操作(例如yum事务)来尝试异步运行任务。
安装多个包 YUM 模块本身就支持
===yum_tasks.yml===
- name: install tree vim
yum:
name: [tree, vim]
state: present