虽然使用了“async”,但是在多个主机上调用ansible任务的延迟

时间:2018-05-29 06:52:51

标签: ansible

我正在尝试从ansible playbook在多个主机上调用REST API,并且不希望这是阻塞操作,因此使用asyncpoll

  - 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''})

如何减少调用的延迟?

1 个答案:

答案 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

有关此选项的文档: