ansible-playbook计时器仅在某些节点上在10秒后过期,但在其他节点上正常运行

时间:2018-09-04 22:44:08

标签: ansible ansible-2.x

我能够ping通所有服务器,但是当我在所有节点上运行剧本时,它只能在某些节点上工作,而在另一些节点上,我会得到

TimeoutError:计时器在10秒后过期

一切正常。这是过去1周以来发生的事情。

剧本或Ansible cfg文件没有任何改变。

    The full traceback is:
Traceback (most recent call last):
  File "/tmp/ansible_Kh_sLm/ansible_modlib.zip/ansible/module_utils/basic.py", line 2853, in run_command
    cmd = subprocess.Popen(args, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
    data = _eintr_retry_call(os.read, errpipe_read, 1048576)
  File "/usr/lib64/python2.7/subprocess.py", line 478, in _eintr_retry_call
    return func(*args)
  File "/tmp/ansible_Kh_sLm/ansible_modlib.zip/ansible/module_utils/facts/timeout.py", line 37, in _handle_timeout
    raise TimeoutError(msg)
TimeoutError: Timer expired after 10 seconds

fatal: [hostname]: FAILED! => {
    "changed": false, 
    "cmd": "/bin/findmnt --list --noheadings --notruncate", 
    "invocation": {
        "module_args": {
            "fact_path": "/etc/ansible/facts.d", 
            "filter": "*", 
            "gather_subset": [
                "all"
            ], 
            "gather_timeout": 10
        }
    }, 
    "msg": "Timer expired after 10 seconds", 
    "rc": 257
}

3 个答案:

答案 0 :(得分:2)

此变通办法对我有所帮助。 在/etc/ansible/ansible.cfg中,我设置了collect_subset =!all,这基本上只收集了最少的事实。我认为,在收集事实时,有些事情弄糟了。因此,根据您的要求设置值,使其仅收集您需要的事实。

答案 1 :(得分:0)

这似乎不是剧本的问题。正如@MatthewLDaniel提到的那样,请尝试通过ssh访问失败的节点。由于各种原因,这些节点/实例在网络上可能无法访问/无响应。首先检查实例指标,即CPU,内存,磁盘和网络连接。

  

PS:如果它是系统级别的,则通过AWS / GCP控制台重新启动实例通常可以解决ssh超时问题。

另一方面,Ansible剧本的默认超时为10秒。您可以通过在运行剧本时传递timeout参数来覆盖此问题。

ansible-playbook playbook.yml -T <TIMEOUT>

OR

ansible-playbook playbook.yml --timeout <TIMEOUT>

答案 2 :(得分:0)

在ansible.cfg中设置collect_timeout = 20应该可以解决。解决方案的来源: https://github.com/ansible/ansible/issues/43884