Ansible WinRM 已超过此用户的最大并发操作数

Ansible WinRM The maximum number of concurrent operations for this user has been exceeded

我们正在使用 Ansible 剧本在我们网络中的许多系统上自动执行长 运行 脚本,其中一些系统是 Windows 10,而其他系统是 Windows 7。 运行 操作是使用 async mechanism and the ansible module async_status 启动的,用于每 30 秒轮询一次任务的结果。

- name: Long running operation
    win_command:
      cmd: cmd
      _raw_params: python long_running_script.py
    async: 2140000
    poll: 0
    register: async_sleeper
  - name: Status poll
    async_status: jid="{{ async_sleeper.ansible_job_id }}"
    register: job_result
    until: job_result.finished
    retries: 100001
    delay: 30

windows10 服务器具有以下 WinRM 默认配置:

MaxConcurrentOperations = 4294967295
MaxConcurrentOperationsPerUser = 1500

每隔约 12.5 小时左右,剧本就会出错并显示 "maximum number of concurrent operations for this user has been exceeded",这恰好对应于 1500 / 30(我们的轮询间隔) 但显然 async_status 不是并发操作。它应该是一个短暂的检查进程是否仍然 运行 并且应该在之后退出。因此,在任何给定点,并发进程数不得超过 2。客户端计算机上的任务管理器不会显示任何延迟进程。那么发生了什么? ConcurrentOperation 是指操作计数而不是真正的并发计数吗?我们知道我们可以增加 quota 但我们不想在没有找到问题根源的情况下在生产系统上这样做。

了解以下内容会有所帮助:

  1. 并发操作的真正含义是什么?
  2. 克服这个问题的行业最佳实践是什么?
  3. 在Windows 10中发生了什么变化,在其他版本中没有发现此错误OS?

我们 运行 进行了一些实验,结果表明 MaxConcurrentOperationsPerUser 的值确实是一个计数器,不一定是 "Concurrent" 这种行为在 Windows 7 和 Windows 10 之间是不同的,它的行为就像它的名字所暗示的那样,它是一个计数器。 因此,如果我们将变量设置为 30,并且有一个很长的 运行 操作,我们每 30 秒轮询一次状态 - 那么该操作将在 15 分钟内出错。

此问题可能会在未来得到解决或修复,但留在这里留给可能遇到它的其他人。