症状
用Ansible Playbook控制BIG-IP执行一些比较耗时的任务,如备份设置(制作UCS文件)时,经过一分半钟左右Ansible报超时(timeout)错误,任务失败。
原因与解决
如果Playbook中使用的是F5的官方Ansible模块,Ansible会通过BIG-IP的REST API与BIG-IP进行通信。而这个REST API有默认60秒的超时时间,如果不做特别设置,通信超过60秒时BIG-IP会切断连接,导致任务失败。
此外,F5的Ansible模块也有自己的超时时间,默认为120秒。当一个任务执行超过120秒时,Ansible模块也会切断连接。
下面介绍解决办法。
1. 修改BIG-IP REST API超时时间
可通过延长BIG-IP的REST API超时时间解决问题。该超时时间最长可设置为600秒。设置方法如下:CLI登录BIG-IP,执行以下命令将超时修改为600秒:
tmsh
modify sys db icrd.timeout value 600
modify sys db restjavad.timeout value 600
modify sys db restnoded.timeout value 600
然后重启restjavad和restnoded进程使设置生效:
restart sys service restjavad
restart sys service restnoded
2. 修改Ansible F5模块超时时间
在执行playbook的主机上找到F5模块中的icontrol.py文件。该文件一般位于(这里装的是Python3.6):
/lib/python3.6/site-packages/ansible/module_utils/network/f5/icontrol.py
打开文件,找到名为iControlRestSession的类,将构造函数__init__中的timeout=120参数修改为timeout=600:
class iControlRestSession(object):
"""Represents a session that communicates with a BigIP.
This acts as a loose wrapper around Ansible's ``Request`` class. We're doing
this as interim work until we move to the httpapi connector.
"""
def __init__(self, headers=None, use_proxy=True, force=False, timeout=600, # <-改这里,120改为600
validate_certs=True, url_username=None, url_password=None,
http_agent=None, force_basic_auth=False, follow_redirects='urllib2',
client_cert=None, client_key=None, cookies=None):
icontrol.py文件全文可查看官方仓库。
经过上述修改,再用Ansible控制BIG-IP时应该就不会出现超时错误了。
