Repository: jumpserver/jumpserver

Issue:
[v3.0 beta] ansible引起的推送，命令执行，获取资产信息卡顿bug
bug现象：如题执行以上操作，有一台机器有故障，如资产不在线，会引起卡顿
bug分析：可能是由于没连接上，在等待timeout时间
bug测试：添加一台不存在的服务器，或写错端口



Discussion:
@yumaojun03 看看设置timeout时间是否可以解决该问题

ubuntu的install.py兼容做完后，会处理这个问题


Resolving patch:
diff --git a/jasset/asset_api.py b/jasset/asset_api.py
--- a/jasset/asset_api.py
+++ b/jasset/asset_api.py
@@ -9,6 +9,8 @@
 from jperm.perm_api import gen_resource
 from jumpserver.templatetags.mytags import get_disk_info
 
+import traceback
+
 
 def group_add_asset(group, asset_id=None, asset_ip=None):
     """
@@ -332,9 +334,11 @@ def get_ansible_asset_info(asset_ip, setup_info):
     # ip = setup_info.get("ansible_default_ipv4").get("address")
     mac = setup_info.get("ansible_default_ipv4").get("macaddress")
     brand = setup_info.get("ansible_product_name")
-    cpu_type = setup_info.get("ansible_processor")[1]
-    cpu_cores = setup_info.get("ansible_processor_vcpus")
-    cpu = cpu_type + ' * ' + unicode(cpu_cores)
+    try:
+        cpu_type = setup_info.get("ansible_processor")[1]
+    except IndexError:
+        cpu_type = ' '.join(setup_info.get("ansible_processor")[0].split(' ')[:6])
+
     memory = setup_info.get("ansible_memtotal_mb")
     try:
         memory_format = int(round((int(memory) / 1000), 0))
@@ -342,7 +346,13 @@ def get_ansible_asset_info(asset_ip, setup_info):
         memory_format = memory
     disk = disk_need
     system_type = setup_info.get("ansible_distribution")
-    system_version = setup_info.get("ansible_distribution_version")
+    if system_type.lower() == "freebsd":
+        system_version = setup_info.get("ansible_distribution_release")
+        cpu_cores = setup_info.get("ansible_processor_count")
+    else:
+        system_version = setup_info.get("ansible_distribution_version")
+        cpu_cores = setup_info.get("ansible_processor_vcpus")
+    cpu = cpu_type + ' * ' + unicode(cpu_cores)
     system_arch = setup_info.get("ansible_architecture")
     # asset_type = setup_info.get("ansible_system")
     sn = setup_info.get("ansible_product_serial")
@@ -358,24 +368,31 @@ def asset_ansible_update(obj_list, name=''):
     for asset in obj_list:
         try:
             setup_info = ansible_asset_info['contacted'][asset.hostname]['ansible_facts']
-        except KeyError:
+            logger.debug("setup_info: %s" % setup_info)
+        except KeyError, e:
+            logger.error("获取setup_info失败: %s" % e)
             continue
         else:
-            asset_info = get_ansible_asset_info(asset.ip, setup_info)
-            other_ip, mac, cpu, memory, disk, sn, system_type, system_version, brand, system_arch = asset_info
-            asset_dic = {"other_ip": other_ip,
-                         "mac": mac,
-                         "cpu": cpu,
-                         "memory": memory,
-                         "disk": disk,
-                         "sn": sn,
-                         "system_type": system_type,
-                         "system_version": system_version,
-                         "system_arch": system_arch,
-                         "brand": brand
-                         }
-
-            ansible_record(asset, asset_dic, name)
+            try:
+                asset_info = get_ansible_asset_info(asset.ip, setup_info)
+                print asset_info
+                other_ip, mac, cpu, memory, disk, sn, system_type, system_version, brand, system_arch = asset_info
+                asset_dic = {"other_ip": other_ip,
+                             "mac": mac,
+                             "cpu": cpu,
+                             "memory": memory,
+                             "disk": disk,
+                             "sn": sn,
+                             "system_type": system_type,
+                             "system_version": system_version,
+                             "system_arch": system_arch,
+                             "brand": brand
+                             }
+
+                ansible_record(asset, asset_dic, name)
+            except Exception as e:
+                logger.error("save setup info failed! %s" % e)
+                traceback.print_exc()
 
 
 def asset_ansible_update_all():


Test patch: