0
点赞
收藏
分享

微信扫一扫

自动化运维工具Ansible(15)异步和轮询

默认情况下,执行 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"

自动化运维工具Ansible(15)异步和轮询_Ansible


获取结果

应该使用 `async_status` 模块来获取结果,需要传递 job id,就是返回信息中字段 `ansible_job_id` 的值

[root@localhost home]# ansible dbservers -i hosts -m async_status -a "jid=301245182308.6277"

自动化运维工具Ansible(15)异步和轮询_Ansible_02


假如 -P 的值大于 0 就会起到同步执行的效果,整个Ansible 命令还是阻塞状态的。并且此时 -B 等待结果集的超时时间必须大于,命令实际执行消耗的时间。否则报错。

[root@localhost ~]# ansible dbservers -B 3 -P 1 -i hosts -a "sleep 5"

自动化运维工具Ansible(15)异步和轮询_Ansible_03


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

自动化运维工具Ansible(15)异步和轮询_centos7_04


注意事项

不应通过将轮询值指定为0来进行需要排他锁的操作(例如yum事务)来尝试异步运行任务。

安装多个包 YUM 模块本身就支持

===yum_tasks.yml===

- name: install tree vim
yum:
name: [tree, vim]
state: present


举报

相关推荐

0 条评论