注:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的那些值。
自动为 OCI 计算实例部署 OCI 堆栈监视
简介
堆栈监视是用于监视 Oracle Cloud Infrastructure (OCI) 中在 OCI 租户下部署的基础设施的可观察性和管理下的计算实例的服务之一。堆栈监视不仅允许存储每个磁盘,还允许在连接到计算实例的每个卷上创建的文件系统。除了存储之外,堆栈监视还提供计算实例的可用性、CPU、内存和磁盘活动以及分页度量。
在我们之前的教程中:使用堆栈监视管理 VM 磁盘利用率,我们讨论了使用 OCI 堆栈监视服务监视计算实例的存储文件系统。在此服务中,我们手动为每个实例启用监视代理,然后使用 JSON 文件为单个实例运行搜索作业。
但是,在实际生产环境中,有数千台计算机存在,我们可以为 OCI 计算实例自动部署 OCI 堆栈监视。
目标
使用定制脚本自动执行堆栈监视安装和部署的完整过程。
先决条件
- 如果您已经实施了本教程中存在的解决方案,则可以跳过步骤 2 至 5。
- 用户应具有本教程中所述的 IAM 权限。
- 必须按照本教程中所述为具有所需策略的管理代理创建动态组。
- 用户必须在将部署脚本的计算机上安装 OCI CLI 版本 3.16 或更高版本。
- 该解决方案包含 shell 脚本,因此需要托管在 Linux/Unix shell 兼容计算机上。
任务 1:部署解决方案
在基于 Linux 的设备上创建单独的目录以安装解决方案。下面是在 OCI 中部署解决方案的详细步骤:
-
部署用于安装监视代理的脚本。
-
使用以下命令在目录中创建名为
agent-enable.sh
的新文件:vi agent-enable.sh
-
复制以下代码片段并将其粘贴到代理 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
-
使用以下命令授予对文件的执行权限:
chmod +x agent-enable.sh
-
使用以下命令在同一目录中创建另一个名为
agent_enable.json
的文件:vi agent_enable.json
-
从下面复制代码片段并将其粘贴到
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" } ] } }
-
-
部署用于运行 OCI 堆栈监视搜索作业的脚本。
-
使用以下命令在目录中创建名为
discovery-job.sh
的新文件:vi discovery-job.sh
-
复制以下代码片段并将其粘贴到
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
-
使用命令授予文件执行权限。
chmod +x discovery-job.sh
-
使用该命令在同一目录中创建另一个名为
discovery_job_template.json
的文件。vi discovery_job_template.json
-
从下面复制代码片段并将其粘贴到
discovery_job_template.json
文件中。保存文件中所做的更改并退出。{ "discoveryType": "ADD", "discoveryClient": "host-discovery", "compartmentId": "COMPARTMENT_ID", "discoveryDetails": { "agentId": "AGENT_ID", "resourceType": "HOST", "resourceName": "INSTANCE_IP", "properties": { "propertiesMap": {} } } }
-
使用该命令在同一目录中创建另一个名为 discovery_job_template1.json 的文件。
vi discovery_job_template1.json
-
复制以下代码片段并将其粘贴到
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": {} } } }
-
-
部署安装脚本以完成设置。
-
使用该命令在目录中创建名为
installation.sh
的新文件。vi installation.sh
-
复制以下代码片段并将其粘贴到
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
-
使用命令授予文件执行权限。
chmod +x agent-enable.sh
-
-
完成该部署。现在,我们具有所有必需权限的所有必需文件。
-
要完成设置,请在同一目录中运行以下命令。
sh installation.sh
-
这会将 JSON 模板复制到正确的位置,并创建日志文件来存储代理安装和堆栈监视作业运行。
-
上述所有模板和 JSON 文件将分别复制到位置
/tmp/monitoring_agent/monitoring_agent_templates
和/tmp/monitoring_agent/monitoring_agent_logs
位置。
注:可以在当前目录中看到一个名为
Monitoring-Agent-Scripts
的目录。此目录有 2 个脚本用于安装代理并分别运行搜索作业。 -
任务 2:执行解决方案
在设备中部署脚本后,您可以运行脚本来安装代理并运行搜索作业以进行堆栈监视。转到 Monitoring-Agent-Scripts
目录并执行后续步骤。
-
在计算实例中运行监视代理。
-
要为单个计算实例安装监视代理,必须使用 '-i' 选项运行以下脚本。
sh agent-enable.sh -i <oci_compute_instance_ocid>
-
要在区间中的所有计算实例中安装监视代理,必须使用 '-c' 选项运行脚本。
sh agent-enable.sh -c <compartment_ocid>
-
您可以使用 '-h' 选项和脚本来检查语法和选项详细信息,如下所示。
sh agent-enable.sh -h
-
成功为计算实例运行上述脚本 (1) 或 (2) 后,您可以在 Oracle Cloud Agent 选项卡下的计算实例详细信息页面中检查相同状态。
注:管理代理在运行状态下显示后,仅继续执行进一步的步骤,因为如果管理代理未在实例中运行,则在后续步骤中将出现错误。
-
-
运行 OCI 堆栈监视搜索作业。
-
为计算实例运行管理代理后,您可以使用“-i”选项运行以下脚本来运行 OCI 堆栈监视搜索作业。
sh discovery-job.sh -i <oci_compute_instance_ocid>
-
要为给定区间中的所有计算实例运行 OCI 堆栈监视搜索作业,必须使用 '-c' 选项运行脚本。
sh discovery-job.sh -c <compartment_ocid>
-
您可以使用“-h”选项和脚本来检查语法及以上选项的详细信息,如下所示。
sh discovery-job.sh -h
-
以上脚本 (1) 或 (2) 最多可能需要 5-10 分钟才能完成。登录到 OCI 门户,导航到“主页”菜单、可观察性和管理、堆栈监视。您可以在“堆栈监视”页上查看启用的堆栈监视和完整的仪表盘。提升后,计算实例的资源类型为主机。
-
在“资源搜索”下检查促销作业的状态以验证搜索资源的成功。
-
在堆栈监视仪表盘上,选择资源块,将显示您启用了监视的计算实例和主机的列表。
-
从列表中选择所需的主机,将显示为该特定主机显示的度量和表的详细视图。
-
主机信息和度量显示为资源详细信息页上的图表和表。
-
可以选择已用文件系统 (GB) 和文件系统使用率 (%) 来获取有关主机中存在的存储的更具体的信息。表视图以表样式/格式提供所有度量。
-
选择实例的特定信息后,它将显示在百分比和存储中(以 GB 为单位)。主机中提供的每个文件系统都以表格式表示挂载点。
-
-
相关链接
确认
- Authors - Maninder Flora(云架构师),Akarsha I K(云架构师)
更多学习资源
探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Automate OCI Stack Monitoring deployment for OCI Compute Instances
F76829-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.