本文介绍如何解决指示 System Center Operations Manager 2025 不支持 Azure Linux 的错误。
问题:在 System Center Operations Manager 2025 中,尝试发现在 Azure 中运行的 Linux 计算机时可能会遇到错误。
错误消息 - 不支持 Azure Linux 和 Arc Linux 计算机。
注释
此解决方法仅适用于 System Center Operations Manager 2025。 如果在 SCOM 托管实例中遇到此错误,请参阅监视 Linux 计算机 ,因为 SCOM 托管实例不支持监视 Azure Linux VM。
解决方法:
若要解决此错误,请在 Linux 资源池中的所有管理服务器上执行以下作:
复制以下脚本,并将其替换为位于 UnixAgents 目录中 的 GetOSVersion.sh 文件的内容 -
C:\Program Files\Microsoft System Center\Operations Manager\Server\AgentManagement\UnixAgents\
。Hostname=`uname -n` OSName=`uname -s` Version=`uname -r` # Version command for Unix; For Linux we look in /etc/issue Arch=`uname -m` # Overridden as uname -p on some platforms OSAlias="Unknown" # OSAlias is used by discovery wizard IsLinux="false" # Used by the discovery wizard for workflow ReleaseFile=`echo $PLATFORM_RELEASE_FILE_SCX_INSTALLER_INPUT` EtcPath="/etc" ## Function used to get Linux Distro and Version ###################################################################### GetKitType() { # The os-release file doesn't tell us the type of kit, so try to determine if [ `rpm -q rpm 2> /dev/null | /bin/egrep '^rpm-[0-9].*' | wc -l` = 1 ]; then OSAlias="UniversalR" elif [ `dpkg -l dpkg 2> /dev/null | egrep "^ii.*"| wc -l` = 1 ]; then OSAlias="UniversalD" else OSAlias="Universal?" fi } GetLinuxInfo() { IsLinux="true" # Return kernel version as OS version - will be updated for specific cases below Version=`uname -r | cut -d. -f1,2` # Determine release file # Try to find -release file if [ -z ${ReleaseFile} ]; then ReleaseFile=`ls -F ${EtcPath}/*-release 2>/dev/null | grep -v lsb-release |grep -v release@| grep -v scx-release| sed -n '1p'` fi # Fall back to lsb-release (e.g. Ubunutu) if [ -z ${ReleaseFile} ]; then if [ -e "${EtcPath}/lsb-release" ]; then ReleaseFile="${EtcPath}/lsb-release"; fi fi # Debian (no lsb-release, but debian_version exists) if [ -z ${ReleaseFile} ]; then TestFile="${EtcPath}/debian_version" if [ -e $TestFile ]; then ReleaseFile=$TestFile; fi fi # Try RHEL/CentOS TestFile="${EtcPath}/redhat-release" if [ ! -h $TestFile -a -e $TestFile ]; then ReleaseFile=$TestFile; fi # Try OEL TestFile="${EtcPath}/oracle-release" if [ ! -h $TestFile -a -e $TestFile ]; then ReleaseFile=$TestFile; fi # Try NeoKylin TestFile="${EtcPath}/neokylin-release" if [ ! -h $TestFile -a -e $TestFile ]; then ReleaseFile=$TestFile; fi # Try SLES TestFile="${EtcPath}/SuSE-release" if [ ! -h $TestFile -a -e $TestFile ]; then ReleaseFile=$TestFile; fi # Get OS Name if [ ! -z $ReleaseFile ]; then OSName=`/bin/egrep -o 'Red Hat Enterprise Linux|SUSE Linux Enterprise Server|SUSE LINUX Enterprise Server' $ReleaseFile` fi ## Extract Version from file ## Could also use /etc/*release (not Ubuntu) if [ "${OSName}" = "Red Hat Enterprise Linux" ]; then Version=`grep 'Red Hat Enterprise' $ReleaseFile | sed s/.*release\ // | sed s/\ .*//` if [ "${Version}" != "" ]; then OSAlias="RHEL" OSManufacturer="Red Hat, Inc." fi elif [ "${OSName}" = "SUSE Linux Enterprise Server" ]; then # SLES 10 uses "Linux". Need to parse the minor version as SLES 10.0 is not supported, only 10.1 and up # SLES 15 uses /etc/os-release as $ReleaseFile. It contains all information inside "" so Version appears like 15". Need to parse the Version to remove " Version=`grep 'SUSE Linux Enterprise Server' $ReleaseFile | sed 's/.*Server\ \| (.*\|\"//g'` # Discovery Wizard wants "10.X" not "10 SPX" if [ `echo ${Version} | grep 'SP' | wc -l` -eq 1 ]; then Version=`echo ${Version} | awk '{print $1"."$2}'| sed s/SP//` else VersionPL=`grep PATCHLEVEL $ReleaseFile | sed s/.*PATCHLEVEL\ =\ //` if [ "${VersionPL}" != "" ]; then Version=`echo ${Version}.${VersionPL}` fi fi if [ "${Version}" != "" ]; then OSAlias="SLES" OSManufacturer="SUSE GmbH" fi elif [ "${OSName}" = "SUSE LINUX Enterprise Server" ]; then # SLES 9 uses "LINUX". No need to parse minor version as Agent supports 9.0 and up. Version=`grep 'SUSE LINUX Enterprise Server' $ReleaseFile | sed s/.*Server\ // | sed s/\ \(.*//` if [ "${Version}" != "" ]; then OSAlias="SLES" OSManufacturer="SUSE GmbH" fi else OSAlias="Universal" OSName="Linux" Version=`uname -r | cut -d. -f1,2` # Do we have the (newer) os-release standard file? # If so, that trumps everything else if [ -e "${EtcPath}/os-release" ]; then ReleaseFile="${EtcPath}/os-release" GetKitType # The os-release files contain TAG=VALUE pairs; just read it in . $ReleaseFile # Some fields are optional, for details see the WWW site: # http://www.freedesktop.org/software/systemd/man/os-release.html [ ! -z "$NAME" ] && OSName="$NAME" [ ! -z "$VERSION_ID" ] && Version="$VERSION_ID" # Set the manufacturer if we know this ID # (Set OSAlias for unit test purposes; test injection won't inject that) [ -z "$ID" ] && ID="linux" case $ID in debian) OSManufacturer="Softare in the Public Interest, Inc." OSAlias="UniversalD" ;; opensuse) OSManufacturer="SUSE GmbH" OSAlias="UniversalR" ;; esac elif [ ! -z $ReleaseFile ]; then # Set OSName to release file contents for evaluation. If parsing logic is not known, Release File contents will be used as OSName. OSName=`sed '/^$/d' ${ReleaseFile} | head -1` # Try known cases for OSName/Version # ALT Linux if [ `echo $OSName | grep "ALT Linux" | wc -l` -gt 0 ]; then OSName="ALT Linux" OSAlias="UniversalR" OSManufacturer="ALT Linux Ltd" Version=`grep 'ALT Linux' $ReleaseFile | sed s/.*Linux\ // | sed s/\ \.*//` fi # Enterprise Linux Server if [ `echo $OSName | grep "Enterprise Linux Enterprise Linux Server" | wc -l` -gt 0 ]; then OSName="Enterprise Linux Server" OSAlias="UniversalR" OSManufacturer="Oracle Corporation" Version=`grep 'Enterprise Linux Enterprise Linux Server' $ReleaseFile | sed s/.*release\ // | sed s/\ \(.*//` fi # Oracle Enterprise Linux Server if [ `echo $OSName | grep "Oracle Linux Server" | wc -l` -gt 0 ]; then OSName="Oracle Linux Server" OSAlias="UniversalR" OSManufacturer="Oracle Corporation" Version=`grep 'Oracle Linux Server release' $ReleaseFile | sed s/.*release\ // | sed s/\ \(.*//` fi # NeoKylin Linux Advanced Server if [ `echo $OSName | grep "NeoKylin Linux Advanced Server" | wc -l` -gt 0 ]; then OSName="NeoKylin Linux Server" OSAlias="UniversalR" OSManufacturer="China Standard Software Co., Ltd." Version=`grep 'NeoKylin Linux Advanced Server release' $ReleaseFile | sed s/.*release\ // | sed s/\ \(.*//` fi # OpenSUSE if [ `echo $OSName | grep -i "openSUSE" | wc -l` -gt 0 ]; then Version=`echo $OSName | awk '{print $2}'` OSName="openSUSE" OSAlias="UniversalR" OSManufacturer="SUSE GmbH" fi # Debian if [ "$ReleaseFile" = "${EtcPath}/debian_version" ]; then OSName="Debian" OSAlias="UniversalD" OSManufacturer="Softare in the Public Interest, Inc." Version=`cat ${EtcPath}/debian_version` fi # Ubuntu if [ `echo $OSName | grep "Ubuntu" | wc -l` -gt 0 ]; then OSName="Ubuntu" OSAlias="UniversalD" OSManufacturer="Canonical Group Limited " Version=`grep 'DISTRIB_RELEASE' $ReleaseFile | cut -d'=' -f2` fi # Fedora if [ `echo $OSName | grep "Fedora" | wc -l` -gt 0 ]; then OSName="Fedora" OSAlias="UniversalR" OSManufacturer="Red Hat, Inc." Version=`grep 'Fedora' $ReleaseFile | sed s/.*release\ // | sed s/\ .*//` fi # CentOS if [ `echo $OSName | grep "CentOS" | wc -l` -gt 0 ]; then OSName="CentOS" OSAlias="UniversalR" OSManufacturer="Central Logistics GmbH" Version=`grep 'CentOS' $ReleaseFile | sed s/.*release\ // | sed s/\ .*//` fi # If distro is not known, determine whether RPM or DPKG is installed if [ "${OSAlias}" = "Universal" ]; then # Identify package manager GetKitType fi # If Version is null, something went wrong in release file parsing, reset to kernel version if [ "$Version" = "" ]; then Version=`uname -r` fi # If OSName is null, something went wrong in release file parsing, reset to Linux if [ "$OSName" = "" ]; then OSName="Linux" OSManufacturer="Universal" fi else GetKitType Version=`uname -r` OSName="Linux" OSManufacturer="Universal" fi fi if [ -z `echo ${Version} | grep '\.'` ]; then Version="$Version.0" fi # Construct OSFullName string OSFullName="$OSName $Version ($Arch)" } ## End Linux distro function ###################################################################### ## Determine Version of Unix Platforms if [ "${OSName}" = "HP-UX" ] then # Version=`uname -r | awk -FB. '{print $2}'` Version=`uname -r` OSAlias="HPUX" elif [ "${OSName}" = "AIX" ] then Version=`oslevel` OSAlias="AIX" Arch=`uname -p` elif [ "${OSName}" = "SunOS" ] then # Keeping commented code for changing "5.10" to "10" # Version=`uname -r | awk -F. '{print $2}'` Version=`uname -r` OSAlias="Solaris" Arch=`uname -p` echo $OSName ## If the OS is Linux, then we need to call the function to get our data elif [ "${OSName}" = "Linux" ] then GetLinuxInfo else echo "<OSName>Unknown</OSName>" exit 0 fi ## Format in XML ouput readable by OpsMgr echo "<DiscoveredOS><Hostname>${Hostname}</Hostname><OSName>${OSName}</OSName><OSAlias>${OSAlias}</OSAlias><Version>${Version}</Version><Arch>${Arch}</Arch><IsLinux>${IsLinux}</IsLinux></DiscoveredOS>"
重启 Operations Manager 控制台并重新尝试发现在 Azure 中运行的 Linux 计算机。