ansible stuck at setup module

Hi,

Initially my playbook stuck at setup stage for a specific server.

Upon running ansible -vvvv -m setup , the process also stuck.

I have set the environment variable ANSIBLE_KEEP_REMOTE_FILES=1 then trying again, and still stuck.

In the target server, I went to the folder /root/.ansible/tmp/ansible-tmp-1472920749.88-102164203403323 and executed

python -m trace --trace ./setup

it stuck at the last line:

— modulename: subprocess, funcname: close_unregister_and_remove
subprocess.py(1437): poller.unregister(fd)
subprocess.py(1438): fd2file[fd].close()
subprocess.py(1439): fd2file.pop(fd)
subprocess.py(1461): for fd, mode in ready:
subprocess.py(1462): if mode & select.POLLOUT:
subprocess.py(1474): elif mode & select_POLLIN_POLLPRI:
subprocess.py(1475): data = os.read(fd, 4096)
subprocess.py(1476): if not data:
subprocess.py(1478): fd2output[fd].append(data)
subprocess.py(1461): for fd, mode in ready:
subprocess.py(1453): while fd2file:
subprocess.py(1454): try:
subprocess.py(1455): ready = poller.poll()

when pressing ctrl-c, the traceback is:

Traceback (most recent call last):
File “/usr/lib64/python2.7/runpy.py”, line 162, in _run_module_as_main
main”, fname, loader, pkg_name)
File “/usr/lib64/python2.7/runpy.py”, line 72, in _run_code
exec code in run_globals
File “/usr/lib64/python2.7/trace.py”, line 819, in
main()
File “/usr/lib64/python2.7/trace.py”, line 807, in main
t.runctx(code, globs, globs)
File “/usr/lib64/python2.7/trace.py”, line 513, in runctx
exec cmd in globals, locals
File “./setup”, line 237, in
exitcode = invoke_module(module, zipped_mod, ZIPLOADER_PARAMS)
File “./setup”, line 62, in invoke_module
(stdout, stderr) = p.communicate(json_params)
File “/usr/lib64/python2.7/subprocess.py”, line 800, in communicate
return self._communicate(input)
File “/usr/lib64/python2.7/subprocess.py”, line 1401, in _communicate
stdout, stderr = self._communicate_with_poll(input)
File “/usr/lib64/python2.7/subprocess.py”, line 1455, in _communicate_with_poll
ready = poller.poll()
KeyboardInterrupt

For other machine, they did not stuck at the polling process.

Any idea to troubleshoot further?

Thanks

– extended output –

setup(237): exitcode = invoke_module(module, zipped_mod, ZIPLOADER_PARAMS)
— modulename: setup, funcname: invoke_module
setup(55): pythonpath = os.environ.get(‘PYTHONPATH’)
— modulename: UserDict, funcname: get
UserDict.py(59): if key not in self:
— modulename: UserDict, funcname: contains
UserDict.py(71): return key in self.data
UserDict.py(60): return failobj
setup(56): if pythonpath:
setup(59): os.environ[‘PYTHONPATH’] = modlib_path
— modulename: os, funcname: setitem
os.py(471): putenv(key, item)
os.py(472): self.data[key] = item
setup(61): p = subprocess.Popen([‘/usr/bin/python’, module], env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
— modulename: subprocess, funcname: init
subprocess.py(656): _cleanup()
— modulename: subprocess, funcname: _cleanup
subprocess.py(461): for inst in _active[:]:
subprocess.py(658): self._child_created = False
subprocess.py(659): if not isinstance(bufsize, (int, long)):
subprocess.py(662): if mswindows:
subprocess.py(672): if startupinfo is not None:
subprocess.py(675): if creationflags != 0:
subprocess.py(679): self.stdin = None
subprocess.py(680): self.stdout = None
subprocess.py(681): self.stderr = None
subprocess.py(682): self.pid = None
subprocess.py(683): self.returncode = None
subprocess.py(684): self.universal_newlines = universal_newlines
subprocess.py(703): errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
— modulename: subprocess, funcname: _get_handles
subprocess.py(1104): to_close = set()
subprocess.py(1105): p2cread, p2cwrite = None, None
subprocess.py(1106): c2pread, c2pwrite = None, None
subprocess.py(1107): errread, errwrite = None, None
subprocess.py(1109): if stdin is None:
subprocess.py(1111): elif stdin == PIPE:
subprocess.py(1112): p2cread, p2cwrite = self.pipe_cloexec()
— modulename: subprocess, funcname: pipe_cloexec
subprocess.py(1168): r, w = os.pipe()
subprocess.py(1169): self._set_cloexec_flag(r)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1170): self._set_cloexec_flag(w)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1171): return r, w
subprocess.py(1113): to_close.update((p2cread, p2cwrite))
subprocess.py(1120): if stdout is None:
subprocess.py(1122): elif stdout == PIPE:
subprocess.py(1123): c2pread, c2pwrite = self.pipe_cloexec()
— modulename: subprocess, funcname: pipe_cloexec
subprocess.py(1168): r, w = os.pipe()
subprocess.py(1169): self._set_cloexec_flag(r)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1170): self._set_cloexec_flag(w)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1171): return r, w
subprocess.py(1124): to_close.update((c2pread, c2pwrite))
subprocess.py(1131): if stderr is None:
subprocess.py(1133): elif stderr == PIPE:
subprocess.py(1134): errread, errwrite = self.pipe_cloexec()
— modulename: subprocess, funcname: pipe_cloexec
subprocess.py(1168): r, w = os.pipe()
subprocess.py(1169): self._set_cloexec_flag(r)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1170): self._set_cloexec_flag(w)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1171): return r, w
subprocess.py(1135): to_close.update((errread, errwrite))
subprocess.py(1144): return (p2cread, p2cwrite,
subprocess.py(1145): c2pread, c2pwrite,
subprocess.py(1146): errread, errwrite), to_close
subprocess.py(705): try:
subprocess.py(706): self._execute_child(args, executable, preexec_fn, close_fds,
subprocess.py(707): cwd, env, universal_newlines,
subprocess.py(708): startupinfo, creationflags, shell, to_close,
subprocess.py(709): p2cread, p2cwrite,
subprocess.py(710): c2pread, c2pwrite,
subprocess.py(711): errread, errwrite)
— modulename: subprocess, funcname: _execute_child
subprocess.py(1196): if isinstance(args, types.StringTypes):
subprocess.py(1199): args = list(args)
subprocess.py(1201): if shell:
subprocess.py(1206): if executable is None:
subprocess.py(1207): executable = args[0]
subprocess.py(1209): def _close_in_parent(fd):
subprocess.py(1216): errpipe_read, errpipe_write = self.pipe_cloexec()
— modulename: subprocess, funcname: pipe_cloexec
subprocess.py(1168): r, w = os.pipe()
subprocess.py(1169): self._set_cloexec_flag(r)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1170): self._set_cloexec_flag(w)
— modulename: subprocess, funcname: _set_cloexec_flag
subprocess.py(1150): try:
subprocess.py(1151): cloexec_flag = fcntl.FD_CLOEXEC
subprocess.py(1155): old = fcntl.fcntl(fd, fcntl.F_GETFD)
subprocess.py(1156): if cloexec:
subprocess.py(1157): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
subprocess.py(1171): return r, w
subprocess.py(1217): try:
subprocess.py(1218): try:
subprocess.py(1219): gc_was_enabled = gc.isenabled()
subprocess.py(1222): gc.disable()
subprocess.py(1223): try:
subprocess.py(1224): self.pid = os.fork()
subprocess.py(1229): self._child_created = True
subprocess.py(1230): if self.pid == 0:
subprocess.py(1300): if gc_was_enabled:
subprocess.py(1229): self._child_created = True
subprocess.py(1301): gc.enable()
subprocess.py(1230): if self.pid == 0:
subprocess.py(1304): os.close(errpipe_write)
subprocess.py(1232): try:
subprocess.py(1234): if p2cwrite is not None:
subprocess.py(1308): data = _eintr_retry_call(os.read, errpipe_read, 1048576)
subprocess.py(1235): os.close(p2cwrite)
subprocess.py(1236): if c2pread is not None:
subprocess.py(1237): os.close(c2pread)
subprocess.py(1238): if errread is not None:
subprocess.py(1239): os.close(errread)
subprocess.py(1240): os.close(errpipe_read)
— modulename: subprocess, funcname: _eintr_retry_call
subprocess.py(1245): if c2pwrite == 0:
subprocess.py(476): while True:
subprocess.py(1247): if errwrite == 0 or errwrite == 1:
subprocess.py(477): try:
subprocess.py(1251): def _dup2(a, b):
subprocess.py(478): return func(*args)
subprocess.py(1259): _dup2(p2cread, 0)
— modulename: subprocess, funcname: _dup2
subprocess.py(1255): if a == b:
subprocess.py(1257): elif a is not None:
subprocess.py(1258): os.dup2(a, b)
subprocess.py(1260): _dup2(c2pwrite, 1)
— modulename: subprocess, funcname: _dup2
subprocess.py(1255): if a == b:
subprocess.py(1257): elif a is not None:
subprocess.py(1258): os.dup2(a, b)
subprocess.py(1310): if p2cread is not None and p2cwrite is not None:
subprocess.py(1311): _close_in_parent(p2cread)
— modulename: subprocess, funcname: _close_in_parent
subprocess.py(1210): os.close(fd)
subprocess.py(1211): to_close.remove(fd)
subprocess.py(1312): if c2pwrite is not None and c2pread is not None:
subprocess.py(1313): _close_in_parent(c2pwrite)
— modulename: subprocess, funcname: _close_in_parent
subprocess.py(1210): os.close(fd)
subprocess.py(1211): to_close.remove(fd)
subprocess.py(1314): if errwrite is not None and errread is not None:
subprocess.py(1315): _close_in_parent(errwrite)
— modulename: subprocess, funcname: _close_in_parent
subprocess.py(1210): os.close(fd)
subprocess.py(1211): to_close.remove(fd)
subprocess.py(1318): os.close(errpipe_read)
subprocess.py(1320): if data != “”:
subprocess.py(727): if mswindows:
subprocess.py(735): if p2cwrite is not None:
subprocess.py(736): self.stdin = os.fdopen(p2cwrite, ‘wb’, bufsize)
subprocess.py(737): if c2pread is not None:
subprocess.py(738): if universal_newlines:
subprocess.py(741): self.stdout = os.fdopen(c2pread, ‘rb’, bufsize)
subprocess.py(742): if errread is not None:
subprocess.py(743): if universal_newlines:
subprocess.py(746): self.stderr = os.fdopen(errread, ‘rb’, bufsize)
setup(62): (stdout, stderr) = p.communicate(json_params)
— modulename: subprocess, funcname: communicate
subprocess.py(780): if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
subprocess.py(800): return self._communicate(input)
— modulename: subprocess, funcname: _communicate
subprocess.py(1393): if self.stdin:
subprocess.py(1396): self.stdin.flush()
subprocess.py(1397): if not input:
subprocess.py(1400): if _has_poll:
subprocess.py(1401): stdout, stderr = self._communicate_with_poll(input)
— modulename: subprocess, funcname: _communicate_with_poll
subprocess.py(1426): stdout = None # Return
subprocess.py(1427): stderr = None # Return
subprocess.py(1428): fd2file = {}
subprocess.py(1429): fd2output = {}
subprocess.py(1431): poller = select.poll()
subprocess.py(1432): def register_and_append(file_obj, eventmask):
subprocess.py(1436): def close_unregister_and_remove(fd):
subprocess.py(1441): if self.stdin and input:
subprocess.py(1442): register_and_append(self.stdin, select.POLLOUT)
— modulename: subprocess, funcname: register_and_append
subprocess.py(1433): poller.register(file_obj.fileno(), eventmask)
subprocess.py(1434): fd2file[file_obj.fileno()] = file_obj
subprocess.py(1444): select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
subprocess.py(1445): if self.stdout:
subprocess.py(1446): register_and_append(self.stdout, select_POLLIN_POLLPRI)
— modulename: subprocess, funcname: register_and_append
subprocess.py(1433): poller.register(file_obj.fileno(), eventmask)
subprocess.py(1434): fd2file[file_obj.fileno()] = file_obj
subprocess.py(1447): fd2output[self.stdout.fileno()] = stdout =
subprocess.py(1448): if self.stderr:
subprocess.py(1449): register_and_append(self.stderr, select_POLLIN_POLLPRI)
— modulename: subprocess, funcname: register_and_append
subprocess.py(1433): poller.register(file_obj.fileno(), eventmask)
subprocess.py(1434): fd2file[file_obj.fileno()] = file_obj
subprocess.py(1450): fd2output[self.stderr.fileno()] = stderr =
subprocess.py(1452): input_offset = 0
subprocess.py(1453): while fd2file:
subprocess.py(1454): try:
subprocess.py(1455): ready = poller.poll()
subprocess.py(1461): for fd, mode in ready:
subprocess.py(1462): if mode & select.POLLOUT:
subprocess.py(1463): chunk = input[input_offset : input_offset + _PIPE_BUF]
subprocess.py(1464): try:
subprocess.py(1465): input_offset += os.write(fd, chunk)
subprocess.py(1472): if input_offset >= len(input):
subprocess.py(1473): close_unregister_and_remove(fd)
— modulename: subprocess, funcname: close_unregister_and_remove
subprocess.py(1437): poller.unregister(fd)
subprocess.py(1438): fd2file[fd].close()
subprocess.py(1439): fd2file.pop(fd)
subprocess.py(1461): for fd, mode in ready:
subprocess.py(1462): if mode & select.POLLOUT:
subprocess.py(1474): elif mode & select_POLLIN_POLLPRI:
subprocess.py(1475): data = os.read(fd, 4096)
subprocess.py(1476): if not data:
subprocess.py(1478): fd2output[fd].append(data)
subprocess.py(1461): for fd, mode in ready:
subprocess.py(1453): while fd2file:
subprocess.py(1454): try:
subprocess.py(1455): ready = poller.poll()

It might be that the node has some file system issues, setup is gathering information about mount points and can be hanging there.

Do running "mount" and/or "df" manually on the node return successfully?

mount and df return successfully when I’m in the node

this issue was solved by my colleague

it turns out that there is LVM lock that cause vgs command to stall

clearing that lock, also allow vgs to complete, and ansible to work after that

in summary, if you are stuck with setup, check your filesystem.