我正在尝试从ansible playbook在多个主机上调用REST API,并且不希望这是阻塞操作,因此使用async
和poll
。
- name: Perform operation on Multiple Nodes
uri:
url: "http://{{item.ipAddress}}:{{item.port}}/api/internal/operations"
method: POST
body: "{{jobData}}"
headers:
Accept: "******/*******.{{resource}}.{{resourceVersion}}+json"
status_code: 200
body_format: json
when: (item.ipAddress is defined) and (item.port is defined)
with_items: '{{nodeData}}'
async: '{{connectionTimeout | int}}'
poll: 1
register: instances
ignore_errors: True
我假设应该在没有任何大量延迟的情况下完成任务的调用。 但是从日志中我看到每次调用之间有~2-3秒的延迟
2018-05-28 *11:26:51* ,530 p=7744 u=ops | TASK [Perform operation on Multiple Nodes] *************************************
2018-05-28 *11:26:53* ,871 p=7744 u=ops | ok: [localhost] => (item={u'a': u'host0', u'ipAddress':', u'port': u''})
2018-05-28 *11:26:56* ,095 p=7744 u=ops | ok: [localhost] => (item={u'a': u'host1', u'ipAddress': u'', u'': u''})
2018-05-28 *11:26:58* ,324 p=7744 u=ops | ok: [localhost] => (item={u'a': u'host2', u'ipAddress': u'', u'port': u''})
如何减少调用的延迟?
答案 0 :(得分:0)
首先,async
用于允许Ansible继续执行其他任务,而无需等待当前任务完成。这并不意味着ansible将同时在所有主机上执行此任务,仅影响以下任务。
为此,您可以在运行Playbook时使用--forks
选项。此选项设置允许设置ansible的并行连接(或进程)的数量。使用--forks=3
,您可以告诉ansible并行执行3个主机进程。
无论如何,forks的默认值是5,所以除非你改变它,否则不应该是问题。
如果您需要更快的速度,请检查是否启用了ssh管道和多路复用。确保ansible配置文件中的这一行:
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = true
有关此选项的文档: