Ansible执行在”GATHERING FACTS”阶段停止

Ansible运行停在“GATHERING FACTS”阶段。

有一个名为”abc-group”的类似于下面的Ansible运维清单文件。
一旦对这个”abc-group”执行ansible-playbook,处理将按照从上往下的顺序依次发生在”abc-group”内的子组(例如abc-web、abc-db等)上,直到最后停在”GATHERING FACTS”处。Playbook不会继续执行。
顺带一提,”GATHERING FACTS”是Ansible从目标服务器收集信息的过程。我们可以在Playbook中使用这些从服务器获取的信息,这非常方便。它包括硬件信息在内,与魔术变量不同。
http://yteraoka.github.io/ansible-tutorial/#gather-facts

[abc-group:children]
abc-web
abc-db
abc-ap
abc-util
abc-batch
abc-log
abc-test

真的一直都在流动吗?从哪里开始异常?到哪里算正常?试着将目标群体分割并加以评论来筛选。

首先,只保留最顶层的组并执行,结果是成功的。
然后,采用二分搜索树,从中间位置开始保留上半部分执行,如果成功就保留剩下部分的一半再次执行。

当我在分析时,某个服务器的CPU警报开始响起。
而且同时还收到其他地方的警报,真是有点混乱(-.-)
※最后发现其他的警报其实与之无关。就是所谓的”墨菲定律”。

当我想到「他们可能在开发方面也在忙吧」时,似乎并不是真的在做工作(在心里低声道歉)

如果是那样的话,我登录到服务器上查找洛杉矶的原因,结果发现Ansible的setup.py进程堆积了很多。
哎呀,完全是因为调试工作的原因啊。。;

最初的切分工作是通过Ansible服务器执行的,但由于中途停止,因此使用ctrl+c进行了中断。实际上,目标服务器上通过Ansible执行的处理停止了,而在Ansible服务器上的终止没有反映到目标服务器上,导致了不断积累的未超时的进程(/_;)

打入GATHERING FACTS指令只取得事实信息

ansible -m setup abc-web-hoge

这会在中途停下来

ansible -m shell -a "id" abc-web-hoge

这将会成功

我知道了搜集事实的处理有问题。

ansible -m setup -a 'gather_subset=network,virtual,ohai,factor,hardware'

那么,选择哪一个gather_subset呢?当我进行筛选时,只有选择”hardware”时才能够再现。

[root@abc-web-hoge ansible_kOTTLo]# pwd
/tmp/ansible_kOTTLo
[root@abc-web-hoge ansible_kOTTLo]# ls
ansible_modlib.zip  ansible_module_setup.py

当Ansible在目标服务器上执行时,将在/tmp目录下创建一个临时文件夹。似乎还使用zip压缩了Python模块,并由ansible_module_setup.py进行加载。

[root@abc-web-hoge module_utils]# pwd
/tmp/ansible_kOTTLo/ansible/module_utils
[root@abc-web-hoge module_utils]# ls
basic.py  facts.py  __init__.py

解凍后,查看其中内容。

   def get_mount_facts(self):
        uuids = dict()
        self.facts['mounts'] = []
        bind_mounts = []
        findmntPath = self.module.get_bin_path("findmnt")
        if findmntPath:
            rc, out, err = self.module.run_command("%s -lnur" % ( findmntPath ), use_unsafe_shell=True)
            if rc == 0:
                # find bind mounts, in case /etc/mtab is a symlink to /proc/mounts
                for line in out.split('\n'):
                    fields = line.rstrip('\n').split()
                    if(len(fields) < 2):
                        continue
                    if(re.match(".*\]",fields[1])):
                        bind_mounts.append(fields[0])

        mtab = get_file_content('/etc/mtab', '')
        for line in mtab.split('\n'):
            fields = line.rstrip('\n').split()
            if fields[0].startswith('/') or ':/' in fields[0]:
                if(fields[2] != 'none'):
                    size_total, size_available = self._get_mount_size_facts(fields[1])
                    if fields[0] in uuids:
:
:
:

由于facts.py文件中包含了获取CPU信息和设备信息的函数,因此我逐个从操作系统中获取并进行确认。
然后,在获取上述挂载信息的地方,findmnt命令返回的输出不完整!
突然执行df命令没有返回结果。
突然查看syslog,发现了”nfs: server xxx.xxx.xxx.xxx not responding, timed out”错误。
突然查看dmesg,发现了相同的错误。

Ansible正在等待这个。

当查看/etc/fstab和/etc/mtab时,发现已经卸载了的NFS服务器…
经常会忘记umount的事情发生(-.-)

暂时更改fstab,并从mtab中删除,执行惰性卸载。

在这里,findmnt和df都已经返回了。

好了,开始收集事实并执行!然后顺利地返回了。

如果在fact.py的get_mount_facts函数中存在超时,那么从一开始操作系统就应该改进以解决旧的情况下持续占用NFS的问题,或者真的要正确地卸载吧!

那是一个星期三上午的情景(´。`)

IMG_7215.png
广告
将在 10 秒后关闭
bannerAds