注:

自动为 OCI 计算实例部署 OCI 堆栈监视

简介

堆栈监视是用于监视 Oracle Cloud Infrastructure (OCI) 中在 OCI 租户下部署的基础设施的可观察性和管理下的计算实例的服务之一。堆栈监视不仅允许存储每个磁盘,还允许在连接到计算实例的每个卷上创建的文件系统。除了存储之外,堆栈监视还提供计算实例的可用性、CPU、内存和磁盘活动以及分页度量。

在我们之前的教程中:使用堆栈监视管理 VM 磁盘利用率,我们讨论了使用 OCI 堆栈监视服务监视计算实例的存储文件系统。在此服务中,我们手动为每个实例启用监视代理,然后使用 JSON 文件为单个实例运行搜索作业。

但是,在实际生产环境中,有数千台计算机存在,我们可以为 OCI 计算实例自动部署 OCI 堆栈监视。

目标

使用定制脚本自动执行堆栈监视安装和部署的完整过程。

先决条件

  1. 如果您已经实施了本教程中存在的解决方案,则可以跳过步骤 2 至 5。
  2. 用户应具有本教程中所述的 IAM 权限。
  3. 必须按照本教程中所述为具有所需策略的管理代理创建动态组。
  4. 用户必须在将部署脚本的计算机上安装 OCI CLI 版本 3.16 或更高版本。
  5. 该解决方案包含 shell 脚本,因此需要托管在 Linux/Unix shell 兼容计算机上。

任务 1:部署解决方案

在基于 Linux 的设备上创建单独的目录以安装解决方案。下面是在 OCI 中部署解决方案的详细步骤:

  1. 部署用于安装监视代理的脚本。

    1. 使用以下命令在目录中创建名为 agent-enable.sh 的新文件:

      vi agent-enable.sh
      
    2. 复制以下代码片段并将其粘贴到代理 enable.sh 文件中。保存文件中所做的更改并退出。

      #************************************************************************
      #
      #   Licensed under the Apache License, Version 2.0 (the “License”);
      #   you may not use this file except in compliance with the License.
      #   You may obtain a copy of the License at
      #
      #       http://www.apache.org/licenses/LICENSE-2.0
      #
      #   Unless required by applicable law or agreed to in writing, software
      #   distributed under the License is distributed on an “AS IS” BASIS,
      #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      #   See the License for the specific language governing permissions and
      #   limitations under the License.
      #
      #************************************************************************
      # Available at: https://github.com/dbarj/oci-scripts
      # Created on: Oct/2022 by Maninder Singh Flora and Akarsha Itigi
      # Version 2.0
      #************************************************************************
      
      #!/bin/bash
      DATE=$(date +'%m-%d-%Y-%T')
      
      Help()
      {
         # Display Help
         echo "This script will enable the Monitoring agent on the OCI Compute Instances by taking input of a Compartment-id or an Instance-id."
         echo
         echo "Syntax: sh <script-name> [-h|i|c]"
         echo "options:"
         echo "h     Print this Help."
         echo "i     Takes Instance-id as input and enables agent for that particular compute instance only."
         echo "c     Takes Compartment-id as input and enables agent for all the compute instances in that compartment."
         echo
      }
      
      Allinstance()
      {
      	LOG_FILE=$INPUT_ID-$DATE
      	STR=$INPUT_ID
      	MATCH1=$(echo $INPUT_ID | awk -F"." {'print $2'} | tr -d " ")
      	MATCH2="compartment"
              INPUT_LENGTH=${#STR}
              LENGTH=83
      	if [ $MATCH1 = $MATCH2 ] && [ $INPUT_LENGTH = $LENGTH ]
              then
      	  touch /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
      	  for INSTANCE_ID in $(oci compute instance list --compartment-id $INPUT_ID | grep ocid1.instance | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ");
                      do
                      echo " "
                      INSTANCE_NAME=$(oci compute instance get --instance-id "$INSTANCE_ID" | grep -i display-name | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
                      echo "$DATE Enabling Monitoring Agent for $INSTANCE_NAME ..."
                      echo "$DATE Enabling Monitoring Agent for $INSTANCE_NAME ..." >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
                      oci compute instance update --instance-id "$INSTANCE_ID" --from-json file:///tmp/monitoring_agent/monitoring_agent_templates/agent_enable.json --force >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
                      echo "$DATE Enabled Monitoring Agent for $INSTANCE_NAME" >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
                      echo "$DATE Enabled Monitoring Agent for $INSTANCE_NAME"        
                done
      
        	else
      	     echo "[ERORR] : Invalid Compartment-id"
      	fi
      
      }
      
      Instance()
      {
      	LOG_FILE=$INPUT_ID-$DATE
      	STR=$INPUT_ID
      	MATCH1=$(echo $INPUT_ID | awk -F"." {'print $2'} | tr -d " ")
              MATCH2="instance"
              INPUT_LENGTH=${#STR}
              LENGTH=83
      	if [ $MATCH1 = $MATCH2 ] && [ $INPUT_LENGTH = $LENGTH ]
      	then
      		touch /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
              	echo " "
      		INSTANCE_NAME=$(oci compute instance get --instance-id "$INPUT_ID" | grep -i display-name | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
              	echo "$DATE Enabling Monitoring Agent for $INSTANCE_NAME ..."
              	echo "$DATE Enabling Monitoring Agent for $INSTANCE_NAME ..." >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
              	oci compute instance update --instance-id "$INPUT_ID" --from-json file:///tmp/monitoring_agent/monitoring_agent_templates/agent_enable.json --force >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
              	echo "$DATE Enabled Monitoring Agent for $INSTANCE_NAME" >> /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/$LOG_FILE.log
              	echo "$DATE Enabled Monitoring Agent for $INSTANCE_NAME"
      	else
                  echo "[ERORR] : Invalid Instance-id"
              fi
      }
      
      # Get the options
      while getopts " hi:c: " option; do
         case $option in
            h) # display Help
               Help
               exit;;
            i) # Enter Instance-id
               INPUT_ID=$OPTARG
               Instance
               exit;;
            c) # Enter Compartment-id
               INPUT_ID=$OPTARG
               Allinstance
               exit;;
           \?) # Invalid option
               echo "[Error] : Invalid option"
               echo "Please check the valid options using ./<script-name> -h"
               exit;;
         esac
      done
      
    3. 使用以下命令授予对文件的执行权限:

      chmod +x agent-enable.sh
      
    4. 使用以下命令在同一目录中创建另一个名为 agent_enable.json 的文件:

      vi agent_enable.json
      
    5. 从下面复制代码片段并将其粘贴到 agent_enable.json 文件中。保存文件中所做的更改并退出。

      {
          "agent-config": {
            "are-all-plugins-disabled": false,
            "is-management-disabled": false,
            "is-monitoring-disabled": false,
            "plugins-config": [
              {
                "desired-state": "ENABLED",
                "name": "Management Agent"
              }        
            ]
          }
      }
      
  2. 部署用于运行 OCI 堆栈监视搜索作业的脚本。

    1. 使用以下命令在目录中创建名为 discovery-job.sh 的新文件:

      vi discovery-job.sh
      
    2. 复制以下代码片段并将其粘贴到 discovery-job.sh 文件中。保存文件中所做的更改并退出。

      #************************************************************************
      #
      #   Licensed under the Apache License, Version 2.0 (the “License”);
      #   you may not use this file except in compliance with the License.
      #   You may obtain a copy of the License at
      #
      #       http://www.apache.org/licenses/LICENSE-2.0
      #
      #   Unless required by applicable law or agreed to in writing, software
      #   distributed under the License is distributed on an “AS IS” BASIS,
      #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      #   See the License for the specific language governing permissions and
      #   limitations under the License.
      #
      #************************************************************************
      # Available at: https://github.com/dbarj/oci-scripts
      # Created on: Oct/2022 by Maninder Singh Flora and Akarsha Itigi
      # Version 1
      #************************************************************************
      
      #!/bin/bash
      DATE=$(date +'%m-%d-%Y-%T')
      
      Help()
      {
         # Display Help
         echo "This script will run Stack-Monitoring Discovery-job on the OCI Compute Instances by taking input of a Compartment-id or an Instance-id."
         echo
         echo "Syntax: sh <script-name> [-h|i|c]"
         echo "options:"
         echo "h     Print this Help."
         echo "i     Takes Instance-id as input and enables agent for that particular compute instance only."
         echo "c     Takes Compartment-id as input and enables agent for all the compute instances in that compartment."
         echo
      }
      
      Allinstance()
      {
              LOG_FILE=$INPUT_ID-$DATE
              STR=$INPUT_ID
              MATCH1=$(echo $INPUT_ID | awk -F"." {'print $2'} | tr -d " ")
              MATCH2="compartment"
              INPUT_LENGTH=${#STR}
              LENGTH=83
              if [ $MATCH1 = $MATCH2 ] && [ $INPUT_LENGTH = $LENGTH ]
      	then
      	    touch /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
      	    for AGENT_ID in $(oci management-agent agent list --compartment-id $INPUT_ID | grep "CreatedBy" | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ");
                  do
                      echo " "
                      INSTANCE_ID=$(oci management-agent agent get --agent-id $AGENT_ID | grep -i ocid1.instance | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
                      INSTANCE_IP=$(oci compute instance list-vnics --instance-id $INSTANCE_ID | grep -i private-ip | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " " | head -n 1)
                      INSTANCE_NAME=$(oci compute instance get --instance-id "$INSTANCE_ID" | grep -i display-name | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
                      cp /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template.json /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
                      sed -i s/COMPARTMENT_ID/$INPUT_ID/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
                      sed -i s/AGENT_ID/$AGENT_ID/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
                      sed -i s/INSTANCE_IP/$INSTANCE_IP/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
                      echo "$DATE Running Stack-Monitoring Discovery-job for $INSTANCE_NAME ($INSTANCE_IP)..."
                      echo "$DATE Running Stack-Monitoring Discovery-job for $INSTANCE_NAME ($INSTANCE_IP)..." >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
                      oci stack-monitoring discovery-job create --compartment-id "$INPUT_ID" --from-json file:///tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
                      echo "$DATE Stack-Monitoring Discovery-job created for $INSTANCE_NAME ($INSTANCE_IP)" >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
                      echo "$DATE Stack-Monitoring Discovery-job created for $INSTANCE_NAME ($INSTANCE_IP)"
                  done
      	else
                   echo "[ERORR] : Invalid Compartment-id"
              fi
      }
      
      Instance()
      {
              LOG_FILE=$INPUT_ID-$DATE
              STR=$INPUT_ID
              MATCH1=$(echo $INPUT_ID | awk -F"." {'print $2'} | tr -d " ")
              MATCH2="instance"
              INPUT_LENGTH=${#STR}
              LENGTH=83
              if [ $MATCH1 = $MATCH2 ] && [ $INPUT_LENGTH = $LENGTH ]
              then
      		touch /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
      		echo " "
              	INSTANCE_NAME=$(oci compute instance get --instance-id "$INPUT_ID" | grep -i display-name | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
              	INSTANCE_IP=$(oci compute instance list-vnics --instance-id $INPUT_ID | grep -i private-ip | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " " | head -n 1)
              	COMPARTMENT_ID=$(oci compute instance get --instance-id "$INPUT_ID" | grep -i compartment | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
              	AGENT_ID=$(oci management-agent agent list --compartment-id $COMPARTMENT_ID --host-id $INPUT_ID | grep "CreatedBy" | awk -F":" {print'$2'} | awk -F"," {print'$1'} | tr -d "\"" | tr -d " ")
              	cp /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template.json /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
              	sed -i s/COMPARTMENT_ID/$COMPARTMENT_ID/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
              	sed -i s/AGENT_ID/$AGENT_ID/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
              	sed -i s/INSTANCE_IP/$INSTANCE_IP/ /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
              	echo "$DATE Running Stack-Monitoring Discovery-job for $INSTANCE_NAME ($INSTANCE_IP)..."
              	echo "$DATE Running Stack-Monitoring Discovery-job for $INSTANCE_NAME ($INSTANCE_IP)..." >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
              	oci stack-monitoring discovery-job create --compartment-id "$COMPARTMENT_ID" --from-json file:///tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
              	echo "$DATE Stack-Monitoring Discovery-job created for $INSTANCE_NAME ($INSTANCE_IP)" >> /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs/$LOG_FILE.log
              	echo "$DATE Stack-Monitoring Discovery-job created for $INSTANCE_NAME ($INSTANCE_IP)"
      
      	else
                  echo "[ERORR] : Invalid Instance-id"
              fi
      }
      
      # Get the options
      while getopts " hi:c: " option; do
         case $option in
            h) # display Help
               Help
               exit;;
            i) # Enter Instance-id
               INPUT_ID=$OPTARG
               Instance
               exit;;
            c) # Enter Compartment-id
               INPUT_ID=$OPTARG
               Allinstance
               exit;;
           \?) # Invalid option
               echo "[Error] : Invalid option"
      	 echo "Please check the valid options using ./<script-name> -h"
               exit;;
         esac
      done
      
    3. 使用命令授予文件执行权限。

      chmod +x discovery-job.sh
      
    4. 使用该命令在同一目录中创建另一个名为 discovery_job_template.json 的文件。

      vi discovery_job_template.json
      
    5. 从下面复制代码片段并将其粘贴到 discovery_job_template.json 文件中。保存文件中所做的更改并退出。

      {
          "discoveryType": "ADD",
          "discoveryClient": "host-discovery",
          "compartmentId": "COMPARTMENT_ID",
          "discoveryDetails": {
            "agentId": "AGENT_ID",
            "resourceType": "HOST",
            "resourceName": "INSTANCE_IP",
            "properties": {
              "propertiesMap": {}
            }
          }
      }
      
    6. 使用该命令在同一目录中创建另一个名为 discovery_job_template1.json 的文件。

      vi discovery_job_template1.json
      
    7. 复制以下代码片段并将其粘贴到 discovery_job_template1.json 文件中。保存文件中所做的更改并退出。

      {
          "discoveryType": "ADD",
          "discoveryClient": "host-discovery",
          "compartmentId": "ocid1.compartment.oc1..aaaaaaaapi7c22bjp3zcuiywo2nabufke2lktkfhbf2ehqfclomnjc3vqh3q",
          "discoveryDetails": {
            "agentId": "ocid1.managementagent.oc1.iad.amaaaaaawe6j4fqa4f5q5pj3izevwffdpe63dvykmqzub2xakevch3a7xgtq",
            "resourceType": "HOST",
            "resourceName": "10.0.0.53",
            "properties": {
              "propertiesMap": {}
            }
          }
      }
      
  3. 部署安装脚本以完成设置。

    1. 使用该命令在目录中创建名为 installation.sh 的新文件。

      vi installation.sh
      
    2. 复制以下代码片段并将其粘贴到 installation.sh 文件中。保存文件中所做的更改并退出。

      #!/bin/bash
      
      mkdir Monitoring-Agent-Scripts
      mkdir /tmp/monitoring_agent
      mkdir /tmp/monitoring_agent/monitoring_agent_logs
      mkdir /tmp/monitoring_agent/monitoring_agent_templates
      mkdir /tmp/monitoring_agent/monitoring_agent_logs/agent_enable_logs/
      mkdir /tmp/monitoring_agent/monitoring_agent_logs/stack_monitoring_discovery_job_logs
      
      cp agent_enable.json /tmp/monitoring_agent/monitoring_agent_templates/agent_enable.json
      cp discovery_job_template.json /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template.json
      cp discovery_job_template1.json /tmp/monitoring_agent/monitoring_agent_templates/discovery_job_template1.json
      
      cp discovery-job.sh Monitoring-Agent-Scripts/discovery-job.sh
      cp agent-enable.sh Monitoring-Agent-Scripts/agent-enable.sh
      
      chmod +x Monitoring-Agent-Scripts/discovery-job.sh
      chmod +x Monitoring-Agent-Scripts/agent-enable.sh
      
      rm -f agent_enable.json
      rm -f discovery_job_template.json
      rm -f discovery_job_template1.json
      
      rm -f discovery-job.sh
      rm -f agent-enable.sh
      rm -f installation.sh
      
    3. 使用命令授予文件执行权限。

      chmod +x agent-enable.sh
      
  4. 完成该部署。现在,我们具有所有必需权限的所有必需文件。

    1. 要完成设置,请在同一目录中运行以下命令。

      sh installation.sh
      
    2. 这会将 JSON 模板复制到正确的位置,并创建日志文件来存储代理安装和堆栈监视作业运行。

    3. 上述所有模板和 JSON 文件将分别复制到位置 /tmp/monitoring_agent/monitoring_agent_templates/tmp/monitoring_agent/monitoring_agent_logs 位置。

    :可以在当前目录中看到一个名为 Monitoring-Agent-Scripts 的目录。此目录有 2 个脚本用于安装代理并分别运行搜索作业。

任务 2:执行解决方案

在设备中部署脚本后,您可以运行脚本来安装代理并运行搜索作业以进行堆栈监视。转到 Monitoring-Agent-Scripts 目录并执行后续步骤。

  1. 在计算实例中运行监视代理。

    1. 要为单个计算实例安装监视代理,必须使用 '-i' 选项运行以下脚本。

      sh agent-enable.sh -i <oci_compute_instance_ocid>
      
    2. 要在区间中的所有计算实例中安装监视代理,必须使用 '-c' 选项运行脚本。

      sh agent-enable.sh -c <compartment_ocid>
      
    3. 您可以使用 '-h' 选项和脚本来检查语法和选项详细信息,如下所示。

      sh agent-enable.sh -h
      
    4. 成功为计算实例运行上述脚本 (1) 或 (2) 后,您可以在 Oracle Cloud Agent 选项卡下的计算实例详细信息页面中检查相同状态。 SM 列表

    注:管理代理在运行状态下显示后,仅继续执行进一步的步骤,因为如果管理代理未在实例中运行,则在后续步骤中将出现错误。

  2. 运行 OCI 堆栈监视搜索作业。

    1. 为计算实例运行管理代理后,您可以使用“-i”选项运行以下脚本来运行 OCI 堆栈监视搜索作业。

      sh discovery-job.sh -i <oci_compute_instance_ocid>
      
    2. 要为给定区间中的所有计算实例运行 OCI 堆栈监视搜索作业,必须使用 '-c' 选项运行脚本。

      sh discovery-job.sh -c <compartment_ocid>
      
    3. 您可以使用“-h”选项和脚本来检查语法及以上选项的详细信息,如下所示。

      sh discovery-job.sh -h
      
    4. 以上脚本 (1) 或 (2) 最多可能需要 5-10 分钟才能完成。登录到 OCI 门户,导航到“主页”菜单、可观察性和管理堆栈监视。您可以在“堆栈监视”页上查看启用的堆栈监视和完整的仪表盘。提升后,计算实例的资源类型为主机。 SMDashboard

    5. 在“资源搜索”下检查促销作业的状态以验证搜索资源的成功。 SMAgentList1

    6. 在堆栈监视仪表盘上,选择资源块,将显示您启用了监视的计算实例和主机的列表。

      SM 列表 2

    7. 从列表中选择所需的主机,将显示为该特定主机显示的度量和表的详细视图。

      SM Agent 概述

      • 主机信息和度量显示为资源详细信息页上的图表和表。

        主页图表 1

        主页图表 2

        主页图表 3

      • 可以选择已用文件系统 (GB) 和文件系统使用率 (%) 来获取有关主机中存在的存储的更具体的信息。表视图以表样式/格式提供所有度量。

        主页表

      • 选择实例的特定信息后,它将显示在百分比和存储中(以 GB 为单位)。主机中提供的每个文件系统都以表格式表示挂载点。

        磁盘表信息

确认

更多学习资源

探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心