我有一个模块可以在 bmi_minion(位于 Kubernetes 中工作的容器内)中工作来获取一些数据。对于这个主模块,我编写了一些自定义库,它们存储在与主模块相同的目录中(/srv/salt/_modules)。
我的自定义库脚本如下所示。
import subprocess
import json
import os
import logging
log = logging.getLogger(__file__)
CACHE_FILE_PATH = '/tmp/cache_hw_type_data.json'
class SystemInfoCollector:
@staticmethod
def execute_shell_cmd(cmd):
...
@staticmethod
def get_ipmi_sdr_list():
...
@staticmethod
def get_dmidecode_list(option='sys'):
...
@staticmethod
def get_ras_data(*args, option=''):
...
@staticmethod
def get_system_info(*args, option='os'):
...
class HWTypeCacheData:
@staticmethod
def load_hw_type_from_cache():
...
@staticmethod
def save_data_to_cache(hw_type):
...
@staticmethod
def get_hw_type():
...
我的问题是,当我将此脚本作为 lib 导入到我的主 salt 模块中,并通过针对 ms_minion 运行相同的脚本时,我遇到了如下所述的问题。
我的主盐模块
import logging
import re
from datetime import datetime, date, timedelta
from iaas_asset_manager.device42.client import Device42Client
from dimm_constants import DIMMConstants, DIMMMapping
from system_info_collector import SystemInfoCollector, HWTypeCacheData
log = logging.getLogger(__file__)
__virtualname__ = "dimm_errors"
CACHE_FILE_PATH = '/tmp/cache_hw_type_data.json'
def __virtual__():
return __virtualname__
def _get_hardware_info():
# Retrieve hardware information like make, model, and serial number
dmidecode_bm_data = SystemInfoCollector.get_dmidecode_list(option='sys')
bm_data = {}
for data in dmidecode_bm_data:
key = data.split(':')[0].strip()
if key == 'Manufacturer':
.......
当我瞄准小兵时遇到错误
arun.srinivasan@dcim-fault-detection-none-20069166:/srv/salt/_modules$ sudo salt 'salt.bmi_minion.20083693' dimm_errors
salt.bmoi_minion.20083693:
'dimm_errors' __virtual__ returned False: cannot import name 'HWTypeCacheData' from 'system_info_collector' (/var/cache/salt/minion/extmods/modules/system_info_collector.py)
注意:如果我将自定义 lib 脚本分成两个分别包含两个类的文件,则导入工作正常。
这些文件的当前结构有什么问题?
我解决了这个问题。有时,自定义库会被导入并缓存在内存中。新编辑后,我们需要执行sync_all、state.apply并重新启动minion。除非重新启动,否则新的更改不会应用于小黄人。