-
Roxaew勒索病毒篡改重要文件1. 篡改重要文件2. SQLSERVER数据库被锁定3. SQLSERVER备份文件被修改请帮忙,感谢各位
-
优化点:ECS列表搜索框筛选条件增加子网ID/镜像ID/资源标签/IPV6地址等,名称/规格名称/私有IP地址搜索支持模糊搜索 加速体验优化【操作步骤】一、ECS列表搜索框支持子网ID/镜像ID/资源标签/IPV6地址等筛选条件搜索1 进入云服务器控制台2 单击弹性云服务器控制台列表上方搜索输入框,选择子网ID/镜像ID/资源标签/IPV6地址等筛选条件,输入搜索内容 【其他】发布地域:均已上线帮助文档:cid:link_1 二、ECS列表搜索框支持名称/规格名称/私有IP地址模糊搜索【操作步骤】1 进入云服务器控制台2 单击弹性云服务器控制台列表上方搜索输入框,选择名称/规格名称/私有IP地址,输入模糊描述内容【其他】发布地域:均已上线帮助文档:cid:link_1 收集使用反馈如果您在使用过程中有具体的意见或建议,可以通过华为云控制台ECS调研问卷反馈给我们,产品小哥会第一时间进行优化分析!
-
优化点:ECS删除时可以同步删除关联的EIP和数据盘,简化删除步骤,避免未删除的EIP和数据盘持续计费;编辑/添加/删除ECS标签时支持选择同步编辑关联的云硬盘和EIP资源标签,优化标签管理 加速体验优化 【操作步骤】一、支持关联删除ECS绑定的弹性公网IP地址和挂载的数据盘单操作入口 1:进入云服务器控制台,选择单台需要删除的弹性云服务器ECS,在更多列选择“删除”,在弹窗中是否同步删除关联资源下,勾选需要同步删除的关联资源,点击“下一步”即可入口 2:进入云服务器控制台,单击弹性云服务器名称进入云服务器详情页面,点击上方更多按钮,在下拉列表中选择“删除”, 在弹窗中是否同步删除关联资源下,勾选需要同步删除的关联资源,点击“下一步”即可批量操作1 进入云服务器控制台,选择多台需要删除的弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“删除”,在弹窗中是否同步删除关联资源下,勾选需要同步删除的关联资源,点击“下一步”即可【其他】发布地域:均已上线 二、支持编辑ECS标签时同步编辑关联的云硬盘和弹性公网IP资源标签【操作步骤】单操作入口 1:进入云服务器控制台,选择单台需要编辑标签的弹性云服务器ECS,点击”标签”的“编辑标签”,在弹窗中选择添加/编辑/删除标签,勾选需要同步编辑关联资源标签,点击“确定”即可入口 2:进入云服务器控制台,单击弹性云服务器名称进入云服务器详情页面,点击“标签”进入标签详情页面,点击添加/编辑/删除标签,在弹窗中勾选需要同步添加/编辑/删除关联资源标签,点击“确定”即可批量操作1 进入云服务器控制台,选择多台需要编辑标签的弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“编辑标签”,在弹窗中选择添加/编辑/删除标签,勾选需要同步编辑关联资源标签,点击“确定”即可【其他】发布地域:均已上线 收集使用反馈 如果您在使用过程中有具体的意见或建议,可以通过华为云控制台ECS调研问卷反馈给我们,产品小哥会第一时间进行优化分析!
-
倾听客户声音客户A:有一批ECS虚拟机需要重装系统,控制台只能一台一台去操作,目前无法批量去重装系统,建议可以做个批量按钮客户B:是否有批量切换操作系统的选项,如果没有的话,可否添加这样的需求,我们后端机器都是同一个镜像,有时会根据需要更新程序,批量更换镜像客户C:目前需要大批量切换VPC,但是控制台只能一台一台切换,需要批量切换VPC功能客户D:客户要修改ECS资源的关联标签,只能一个一个去修改,需要按钮能批量的修改关联资源标签 加速体验优化【操作步骤】一、ECS支持批量重装操作系统1 进入云服务器控制台2 选择多台弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“重装操作系统”3 设置批量重装操作系统策略,点击“确定”即可【其他】发布地域:均已上线 二、ECS支持批量切换操作系统1 进入云服务器控制台2 选择多台弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“切换操作系统”,选择云服务器相匹配的计费模式3 设置批量切换操作系统策略,点击“确定”即可【其他】发布地域:均已上线 三、ECS支持批量切换VPC【操作步骤】1 进入云服务器控制台2 选择多台弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“切换VPC”【其他】发布地域:均已上线帮助文档:cid:link_1 四、ECS支持批量编辑/添加/解绑标签【操作步骤】1 进入云服务器控制台2 选择多台弹性云服务器ECS,点击列表上方“更多”按钮,在下拉列表中选择“编辑标签”3 对所选弹性云服务器ECS编辑/添加/删除标签,点击“确定”即可【其他】发布地域:均已上线 收集使用反馈如果您在使用过程中有具体的意见或建议,可以通过华为云控制台ECS调研问卷反馈给我们,产品小哥会第一时间进行优化分析!
-
案例介绍本案例基于免费的华为云开发者空间、华为云MaaS提供的DeepSeek-R1大模型,使用R语言工具构建AI Agent,该AI Agent可以在R语言环境下独立部署使用。也可以用R语言开发MCP server,和AI助手平台Cherry Studio配合使用。案例内容本案例由开发者:yd_259866430提供案例内容1 概述1.1 案例介绍R是一种自由、免费、源代码开放的计算机语言。它具有语法极其简单、代码量极少、没有复杂概念的显著优势,降低了人们了解更复杂技术的计算机语言门槛。本案例将介绍如何在华为云主机安装R,并用它开发AI Agent和MCP server。本案例用到的R语言工具包括ellmer和mcptools,是posit公司开发的智能体开发工具。如需在R中开发部署AI Agent,则用ellmer。如果R仅作为MCP server的运行环境,则使用mcptools。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 案例流程① 用户打开华为开发者空间云主机,下载安装R、ellmer、mcptools、Cherry Studio;② 使用ellmer包,配置华为云MaaS提供的DeepSeek-R1模型,运行测试AI Agent;③ 使用mcptools开发MCP server服务,并将MCP server部署在Chery Studios上,配置华为云MaaS提供的DeepSeek-R1模型,运行测试AI Agent;1.5 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)鲲鹏4vCPUs |8GB ARM|Ubuntu 24.04 Server定制版0602 环境配置2.1 开发者空间配置详细步骤请参考案例中步骤2.12.2 免费领取DeepSeek-R1详细步骤请参考案例中步骤2.22.3 安装R语言2.3.1 进入开发者云主机桌面后,打开一个终端2.3.2 在终端输入以下代码,安装R语言sudo apt update sudo apt install --no-install-recommends software-properties-common dirmngr wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" sudo apt install --no-install-recommends r-base具体参考R官网安装指引。https://mirrors.sustech.edu.cn/CRAN/在终端中输入R,进入R console中,输入print("hello world!"),如正常输出,则R语言安装成功。2.4 安装ellmer和mcptools在R console中输入install.packages("ellmer")过程中报错,查看报错信息按照报错信息,先退出R console,在终端中安装libcurl4-openssl-dev。再进入R console,安装ellmer在R console中,安装usethis(用于配置R环境变量),install.packages("usethis")安装过程会报错,需要退出R console安装libgit2-dev,sudo apt install libgit2-dev,然后再进入R console安装usethis。然后,安装install.packages("mcptools"),过程中一样会报错,需要耐心debug。2.5 安装Cherry Studiosudo apt install gdebi-core sudo gdebi Cherry-Studio-1.5.3-arm64.deb3 构建AI Agent3.1 使用ellmer创建AI Agent在R console输入以下代码,编辑R环境变量library(ellmer) usethis::edit_r_environ() 将参考案例中步骤2.2中的url和api_key复制到R环境变量中,复制后,按:wq退出,和vim语法类似。在 R console输入如下命令library(ellmer) # 导入ellmer chat <- chat_openai( # 构建AI Agent system_prompt = NULL, base_url = Sys.getenv("base_url"), api_key = Sys.getenv("api_key"), model = "DeepSeek-R1", seed = NULL, api_args = list(), echo = "all" ) 3.2 测试AI Agent在R console里,输入chat$chat("讲三个关于统计学家的笑话") ,就可以看到这个AI Agent确实通过API连接上了华为云上Deepseek模型,并返回了结果。在R console里运行AI Agent,看起来很丑,其实posit公司开发了更好看的shinychat,如下图所示。但是安装部署shinychat,又是一个不小的工程,所以案例接下来转向R+Cherry Studio 配合使用。不过聊天仅仅是这个AI Agent一个很小的功能。作为这个AI Agent的使用者,我们更希望它能够利用由我们定义的外部工具。这不仅仅是希望,如果AI Agent不调用外部工具,它的回答可能是错误的。如下图所示,当我们问AI Agent今天是几号,在不调用外部工具的情况下,它给出的是2023年10月12日,这明显不对。3.3 使用mcptools开发MCP server,并配合Cherry Studio使用解决“今天几号”的问题,需要用mcptools开发一个MCP server,写一个mcptoolsExample.R脚本,代码如下。get_current_time <- function(tz = "CST") { format(Sys.time(), tz = tz, usetz = TRUE) } if (is_new_ellmer()) { res <- list( get_current_time = ellmer::tool( get_current_time, name = "get_current_time", description = "返回当前时间", arguments = list( tz = ellmer::type_string( "当前时区默认为 `\"CST\"`.", required = FALSE ) ) ) ) } else { res <- list( get_current_time = ellmer::tool( get_current_time, name = "get_current_time", description = "Returns the current time.", arguments = list( tz = ellmer::type_string( "当前时区默认为 `\"CST\"`.", required = FALSE ) ) ) ) } res然后,我们按照参考案例,在Cherry Studio上配置DeepSeek-R1模型。如下图所示。然后,在不配置MCP server的情况,我们再问下“今天是几号”。AI Agent无法回答这个问题。接下来,我们给这个AI Agent配上一个外部工具,如下图所示,点击添加服务器。在json中输入{ "mcpServers": { "r-mcptools": { "command": "Rscript", "args": ["-e", "mcptools::mcp_server("/path/mcptoolsExample.R")"] } } } 接下来,再次问“今天是几号”,AI Agent已经知道调用MCP server获取日期了。至此,基于华为开发者空间云主机、R语言搭建AI Agent和MCP Server到此结束。本案例使用华为开发者空间提供的免费主机作为开发环境,操作系统为华为云为新注册用户提供180小时免费主机,大家可以开心使用。本案例使用华为云MaaS提供的免费DeepSeek-R1模型。我正在参加【案例共创】第5期 开发者空间 AI Agent 开发 https://developer.huaweicloud.com/signup/0e966198e87a4210b5f88c0d759d4f3b”
-
各位大佬。公司有一套公有云ecs,内部还有一套云stack,现在想一个平台可以完成ecs的统一管理。我看公有云有sdk。配置了sk ak我试了一下,对接很方便。云stack看到了https://bbs.huaweicloud.com/forum/thread-0295102083773168122-1-1.html 【ManageOne二次开发】 【华为云Stack ManageOne运营面北向对接】云资源管理对接指导感觉有点深度啊,而且看来必须通过api的方式对接manageone来对接。所以两个问题请教一下:1. sdk是否可以完成公有云和云stack的同时对接?2. 如果必须通过api的方式,那两种构型接口是否有差距,是否我只要配置不同的地址和授权就可以了(因为时间有限,原谅我没有仔细研究文档)
-
资源购买资源名称规格操作系统存储ECS鲲鹏通用计算增强型 km1.xlarge.4 4vCPUs 16GiBHuawei Cloud EulerOS 2.0 标准版 64位 ARM版系统盘:通用型SSD,40GiB安装必要的软件1.安装condamkdir -p ~/miniconda3wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.shbash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3rm -f ~/miniconda3/miniconda.shsource ~/miniconda3/bin/activateconda init --all创建虚拟环境conda create -n tigerbot python=3.9源码下载1.下载TigerBot的源码下载源码 git clone https://github.com/TigerResearch/TigerBotcd TigerBot中将requirments.txt的flash-attn==2.1.1注释掉,因为这个是使用GPU时才需要安装的依赖。pip install -r requirements.txt 2.下载模型pip install modelscope modelscope download --model TigerResearch/tigerbot-7b-chat-v3 --local_dir model/tigerbot-7bmodelscope download --model TigerResearch/tigerbot-7b-base-v3 --local_dir model/tigerbot-7b-base-v3这个模型下载在TigerBot路径下输入命令,然后就会将模型下载到TigerBot/model下。模型下载如下图所示。 启动项目1.修改代码修改基础推理代码vim infer.py将device的GPU启动修改为CPU启动方式。 修改web_demo.py代码,这里是新建一个web.py用来区分原来的基础代码基础的web_demo代码实现的UI界面比较单一,启动方式必须是选择一个模型来启动。我对代码进行了一些优化:1.将原来的GPU推理方式修改为CPU推理。2.启动路径设置为文件夹,文件夹下面包含的模型在web界面都能够切换使用。3.增加了新建对话和历史对话查看,优化了输入框和回答框。其新建的web.py内容如下:(vim web.py)import streamlit as stimport osimport torchfrom datetime import datetime# 自定义模块(确保该模块路径正确)from utils.modeling_hack import get_model# 设置页面标题st.set_page_config(page_title="TigerBot - 基础问答", layout="wide")st.title("TigerBot - 基础问答 (CPU Mode)")# 模型根目录MODEL_PATH = "/home/TigerBot/model"# 获取所有子文件夹作为模型选项try: models = [name for name in os.listdir(MODEL_PATH) if os.path.isdir(os.path.join(MODEL_PATH, name))]except FileNotFoundError: st.error(f"Model path '{MODEL_PATH}' not found.") st.stop()# 用户选择模型selected_model = st.selectbox("Choose a model", models)# 如果选择了模型,则加载模型if selected_model: model_dir = os.path.join(MODEL_PATH, selected_model) @st.cache_resource def load_model(model_path): print(f'Loading model from: {model_path}') return get_model(model_path=model_path) try: model, tokenizer, generation_config = load_model(model_dir) model.to('cpu') # 确保在 CPU 上运行 except Exception as e: st.error(f"Failed to load model: {e}") st.stop() # 初始化会话状态 if "messages" not in st.session_state: st.session_state.messages = [] if "history_sessions" not in st.session_state: st.session_state.history_sessions = [] # 侧边栏:新建对话 & 历史记录 with st.sidebar: st.header("对话管理") if st.button(" 新建对话"): st.session_state.messages = [] st.subheader("历史对话") for idx, session in enumerate(st.session_state.history_sessions): timestamp = session["timestamp"] title = f"{idx + 1}. {timestamp}" if st.button(title, key=f"session_{idx}"): st.session_state.messages = session["messages"] # 显示聊天记录(兼容旧版 Streamlit) chat_container = st.container() with chat_container: content_html = "" for message in st.session_state.messages: role = message["role"] content = message["content"].replace("\n", "<br>") color = "blue" if role == "user" else "green" content_html += f'<div style="margin:10px;padding:10px;border-left:3px solid {color};"><b>{role}:</b> {content}</div>' st.markdown(f""" <div style="max-height:500px;overflow-y:auto;border:1px solid #ccc;padding:10px;margin-bottom:10px;"> {content_html} </div> """, unsafe_allow_html=True) # 输入区域 user_input = st.text_area("请输入您的问题...", key="main_input") send_button = st.button("发送") # 处理用户输入 if send_button and user_input: st.session_state.messages.append({"role": "user", "content": user_input}) # 构造输入并推理 inputs = tokenizer(user_input, return_tensors='pt', truncation=True, max_length=512).to('cpu') outputs = model.generate( input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'], generation_config=generation_config ) full_response = tokenizer.decode(outputs[0], skip_special_tokens=True) st.session_state.messages.append({"role": "assistant", "content": full_response}) # 清空输入框并刷新 st.experimental_rerun() # 保存当前对话为历史记录 if send_button and user_input: current_session = { "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "messages": st.session_state.messages.copy() } st.session_state.history_sessions.append(current_session)2.推理基础推理运行代码为:python infer.py --model-path /home/TigerBot/model/tigerbot-7b运行之后的结果是这样的,在终端进行提问,会获得对应的回答,然后exit能够退出运行。原来web_demo.py的运行代码为:export PYTHONPATH='./' streamlit run apps/web_demo.py -- --model_path /home/TigerBot/model/tigerbot-7bWeb.py运行代码如下:export PYTHONPATH='./' #确保能够找到模块和包streamlit run apps/web.py -- --model_path /home/TigerBot/model运行之后的结果是这个就说明成功启动了,这里需要注意,需要将8501端口添加到安全组。然后打开http://123.249.104.17:8501网页在TigerBot大模型问答网页,能够选择tigerbot权重模型,选择的数量是自己从modelscope下载的。进行问答时在下面的问题输入框,点击发送就能够获得回答了,上面的白框能够看到问答记录。
-
自己搞了5年的网站,最开始在阿里云上搭建的,1核心2G内存,40G的硬盘,那时候刚知道LNMP,然后知道了Wordpress,连tmux都不知道。当知道Redhat 8暂停支持,Centos8也要很快不更新后,域名、资源迁移到了,华为云的HECS,加入了Openeuler的大家庭,云耀云服务器|x.medium.2|1vCPUs|2GB|linux *1高IO|40.0GB *1公网IP *1动态BGP|固定带宽|1.0Mbps *1这是当时最便宜的配置,蹭了B站官网的直播,还有优惠券可以用。Openeuler使用起来和Centos无异,网站更新到22年,之后因为工作调整,没有再继续更新,期间访问了自己的网站,没有卡顿、没有崩溃。作为一个搞机电工程项目的人,在日日夜夜的繁忙、加班中,资源到期了好几次。直到今天,突然想起来自己有日子没续资源了当再次打开控制台时,没有HECS,没有弹性公网IP,等待的是30条未读信息。全是包年/包月资源即将释放提醒。然而这些提醒,已经是半个月前了。五年了,当时单纯是为了满足自己的好奇,做了个方便自己查询的规范网站,没打算让这个网站为我挣钱。对要不要年年续费的抉择还是有的,现在资源释放了,竟然感到了一丝轻松,还好自己学到了东西,没有浪费时间和经历。同时感到一丝感激,感谢那些曾经点进那个网站的朋友们,让我度过了曾经最迷茫的那段日子。感谢!
-
请问决赛的奖金现在有没有发放呢?队友急着还网贷/doge
-
“【摘要】 本实验将指导开发者如何在鲲鹏服务器搭建一个Termgraph工具,并根据源码提供的测试文件绘制统计图形。”一、案例介绍鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。Termgraph是一个Python的命令行工具,用于在终端中绘制基本图形。通过灵活地运用Termgraph工具,能够在无需复杂图形界面的情况下,高效地将数据转化为可视化的终端图形,为数据处理与分析工作带来极大的便利与趣味。本实验将指导开发者如何在鲲鹏服务器搭建一个Termgraph工具,并根据源码提供的测试文件绘制统计图形。二、免费领取云主机如您还没有云主机,可点击链接 ,根据领取指南进行操作。如您已领取云主机,可直接开始实验。三、实验流程说明:下载工具;自动部署并连接鲲鹏服务器;安装python3.7;安装绘图工具;使用工具绘图。四、实验资源本次实验预计花费总计0元。资源名称规格单价(元)时长云主机2vCPUs | 4GB RAM免费30分钟五、实验步骤5.1 准备鲲鹏服务器本实验中,使用云主机提供的鲲鹏沙箱资源,只需要执行简单的自动部署命令即可拉起一台免费的鲲鹏服务器。1. 在云主机桌面右键选择“Open Terminal Here”,打开终端命令窗口。2. 输入自动部署命令,命令如下:hcd deploy --password abcd1234! --time 1800命令的参数说明:• password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234!,开发者可以替换成自定义密码(至少8个字符)。• time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前实验预估需要20分钟,为了保证时间充足,在命令中申请的时间为30分钟,即1800秒。3. 记录下自动部署后生成的弹性公网IP地址。5.2 下载源码1. 使用命令登录到鲲鹏服务器,命令如下:ssh root@鲲鹏服务器公网IP输入密码,密码为步骤5.1中自动部署命令行中“--password”后面的参数,命令中给出的默认为abcd1234!,如果没有修改,就使用abcd1234!进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。2. 从GitHub上拉取工具源码,命令如下:git clone https://github.com/mkaz/termgraph5.3 安装Python软件包因为兼容性问题,所以需要下载Python3.7以上版本,本次实验选择使用Python3.7.17版本。1. 下载并解压Python3.7.17源代码,命令如下:wget https://mirrors.huaweicloud.com/python/3.7.17/Python-3.7.17.tgztar xzf Python-3.7.17.tgzcd Python-3.7.172. 编译和安装,配置编译选项并开始编译,命令如下:./configure --prefix=/usr/local/makesudo make altinstall3. 验证python3.7.17和pip安装是否成功,命令如下:python3.7 --versionpip3.7 --version4. 安装termgraph工具pip3.7 install termgraph5.4 绘制图形根据项目中提供的测试数据文件生成统计图形,命令如下:cd /root/termgraphtermgraph data/ex1.dat该工具还提供了其他的命令参数适应的文件,如果感兴趣可以尝试一下。termgraph data/ex4.dat --color {blue,red}termgraph data/ex7.dat --color {yellow,magenta} --stacked --title "Stacked Data"termgraph --calendar --start-dt 2017-07-01 data/cal.dat至此,本次实验全部完成。
-
1、Mariadbvi /etc/my.conflower_case_table_names=1 #设置数据库支持大小写Innodb_buffer_pool_size=4G #设置数据库缓冲大小为4GInnodb_log_buffer_size=64M #设置数据库的log buffer 为64MInnodb_log_file_size=256M #设置数据库的redo log 文件大小为256MInnodb_log_files_in_group=2 #设置数据库的redo log 文件组为2 vi /etc/sysconfig/memcachedMAXCONN="2048" #最大连接数改为2048CACHESIZE="512" #缓存大小改为512hash_algorithm=md5 #数据库hash算法改为md5 Mysql使用mysql -uroot -p000000 #登录数据库create database test; #创建库use test; #使用库create table company( #创建表id int not null primary key,name varchar(50),addr varchar(255));测试company表的使用insert into company value(1,”huawei”,”china”); #向company插入数据Select * from company; #查看company中的数据exitrabbitmqctl add_user chinaskill chinapd #使用rabbit创建用户rabbitmqctl set_user_tags chinaskill administrator #设置用户chinaskill为管理员rabbitmqctl list_users #查看所有用户 2、NovaVi /etc/nova/nova.confcpu_allocation_ratio=4.0# cpu超售ram_allocation_ratio=1.5# 内存超售reserved_host_memory_mb=2048# 预留内存reserved_host_disk_mb=10240# 预留磁盘rervice_down_time=120# 设置nova服务心跳检查时间为120秒 remove_unused_base_images=true#长时间不用的镜像缓存在过一定的时间后会被自动删除 3、Glance①glance镜像给项目共享使用openstack image create --disk-format qcow2 --progress --file chTab 自定义镜像名Openstack project listOpenstack image list Openstack image add project 镜像id 项目idopenstack image member list 镜像名/镜像id ②Glance镜像共享状态设为acceptedOpenstack image set shared 镜像id ③glance镜像压缩qemu-img -c -O qcow2 /镜像路径 /压缩后存放的路径和名称.qcow2 4、KeystoneOpenstack domain create 210Demo #创建域Openstack group create devps --domain 210Demo #在域中创建组Openstack project create Production --domain 210Demo #在域中创建项目Openstack user create --domain 210Demo --project Production xiaoming --email com #在对应的项目中创建用户Openstack role add --user xiaoming --project Production member #写入用户为某个项目的用户Openstack role add --user xiaoming --project Production admin #写入用户为某个项目的管理员 Keystone权限控制(修改普通用户权限,使普通用户不能对镜像进行创建和删除操作)Vi /etc/keystone/policy.json将 "add_image": "","delete_image": ""修改为"add_image": "role:admin","delete_image": "role:admin" 5、Redis一主二从三哨兵# 修改redis1节点配置文件[root@redis1 ~]# vi /etc/redis.conf bind 127.0.0.1 改为bind 0.0.0.0 # 开放所有端口protected-mode no # 修改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"[root@redis1 ~]# systemctl restart redis # 修改redis2、redis3节点[root@redis2 ~]# vi /etc/redis.confbind 127.0.0.1 改为bind 0.0.0.0 # 开放所有端口protected-mode no # 改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"# slaveof <masterip> <masterport> 下方添加:slaveof 192.168.100.115 6379[root@redis2 ~]# systemctl restart redisredis3 同理 [root@redis1 ~]# systemctl restart redis [root@redis1 ~]# redis-cli -a 123456 info replicationconnected_slaves:2 [root@redis1 ~]# vi /etc/sentinel.confport 26379protected-mode no # 保护模式daemonize yessentinel monitor redis1 ip 6379 2sentinel auth-pass redis1 123456 [root@redis2 ~]# vi /etc/sentinel.confport 26380protected-mode nodaemonize yessentinel monitor redis1 ip 2sentinel auth-pass redis1 123456 [root@redis3 ~]# vi /etc/sentinel.confport 26381protected-mode nodaemonize yes sentinel monitor redis1 ip 2sentinel auth-pass redis1 123456 # 启动哨兵模式[root@redis1 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis2 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis3 ~]# redis-server /etc/sentinel.conf --sentinel 6、LinuxLinux系统调优-脏数据回写sysctl -a |grep 3000 vi /etc/sysctl.confvm.dirty_expire_centisecs = 6000[root@controller ~]# sysctl -pnet.ipv4.icmp_echo_ignore_all = 0vm.dirty_expire_centisecs = 6000如果/etc/sysctl.conf里面没有,就用echo写进去echo "vm.dirty_expire_centisecs=6000" >> /etc/sysctl.conf Linux系统调优-swap限制Sysctl -a |grep swappinessecho "vm.swappiness = 20" >> /etc/sysctl.confSysctl -p Linux系统调优-防止SYN攻击Sysctl -a |grep synnet.ipv4.tcp_syncookies = 1echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.confSysctl -p Linux网络命名空间运维首先创建test1和test2Ip netns add test1Ip netns add test2启动test1和test2IP netns exec test1 ip link set dev lo upIp netns exec test2 ip link set dev lo up创建veth并联通Ip link add veth-test1 type veth peer name veth-test2将veth分配给test1和test2Ip link set veth-test1 netns test1Ip link set veth-test2 netns test2给veth分配IP地址Ip netns exec test1 ip addr add ip1/24 dev veth-test1Ip netns exec test2 ip addr add ip2/24 dev veth-test2启动vethIP netns exec test1 ip link set dev veth-test1 upIp netns exec test2 ip link set dev veth-test2 up互相ping通IP netns exec test1 ping ip.2Ip netns exec test2 ping ip.1
-
## 四、OpenStack运维开发任务### 1、OpenStack Python运维脚本开发:使用Restful API方式创建用户(3分) HYPERLINK "undefined" 在提供的OpenStack私有云平台上,使用T版本的“openstack-python-dev”镜像创建1台云主机,云主机类型使用4vCPU/12G内存/100G硬盘。该主机中已经默认安装了所需的开发环境,登录默认账号密码为“root/Abc\@1234”。使用python request库和OpenStack Restful APIs,在/root目录下,创建api\_manager\_identity.py文件,编写python代码,代码实现以下任务:(1)首先实现查询用户,如果用户名称“user\_demo”已经存在,先删除。(2)如果不存在“user\_demo”,创建该用户,密码设置为“1DY\@2022”。(3)创建完成后,查询该用户信息,查询的body部分内容控制台输出,同时json格式的输出到文件当前目录下的user\_demo.json文件中,json格式要求indent=4。编写完成后,提交allinone节点的用户名、密码和IP地址到答题框。```python[root@python ~]# source /etc/keystone/admin-openrc.sh [root@python ~]# openstack token issueimport requests, jsonurl = ':5000/v3/auth/tokens'headers = {'Content-Type': 'application/json', 'X-Auth-token': ''}rsp = requests.get('http://controller:5000/v3/users', headers=headers)for i in rsp.json()['users']: if 'user_demo' == i['name']: requests.delete('http://controller:5000/v3/users/{}'.format(i['id']), headers=headers)data = {'user': {'name': 'user_demo', 'password': '1DY@2022'}}rsp = requests.post('http://controller:5000/v3/users', headers=headers, data=json.dumps(data))print(rsp.json())with open('user_demo.json', 'w') as outfile: json.dump(rsp.json(), outfile, indent=4) [root@python ~]# python api_manager_identity.py```### 2、使用python调用api实现创建flavor(2分)在自行搭建的OpenStack私有云平台或提供的all-in-one平台上。在controller节点的/root目录下创建create\_flavor.py文件,在该文件中编写python代码对接openstack api,要求在openstack私有云平台上创建一个云主机类型,名字为pvm\_flavor、vcpu为1个、内存为1024m、硬盘为20G、ID为9999。(如果存在同名云主机类型,代码中需先进行删除操作)执行完代码要求输出“云主机类型创建成功”。根据上述要求编写python代码,完成后,将controller节点的IP地址,用户名和密码提交。(考试系统会连接到你的controller节点,去执行python脚本,请准备好运行的环境,以便考试系统访问)```python[root@python ~]# openstack token issue[root@python ~]# vi create_flavor.pyimport requests, jsonurl = ':5000/v3/auth/tokens'headers = {'Content-Type': 'application/json', 'X-Auth-Token': 'gAAAAABj2jXucfyBBIRkXQsQHuU1KDbS1bIQaugdyJy3liE87SvU8uVudo0Qc_99zprcXBKBnAtHTdRa20mQDkVsjaCee3O_o6yWcTbOdYRE7lg8P1kKxW6hhqTWW8XA5Pe3Vd5_jJ5SuubLRSnFewSTs_Tdt1St9wMxiLn0Lmf1ZkLB2GRJFVo'}rsp = requests.get('http://controller:8774/v2.1/flavors', headers=headers)for i in rsp.json()['flavors']: if 'pvm_flavor' == i['name']: requests.delete('http://controller:8774/v2.1/flavors/{}'.format(i['id']), headers=headers)data = {'flavor': {'name': 'pvm_flavor', 'vcpus': '1', 'ram': '1024', 'disk': '20', 'id': '9999'}}rsp = requests.post('http://controller:8774/v2.1/flavors', headers=headers, data=json.dumps(data))print(rsp.json())with open('flavor.json', 'w') as outfile: json.dump(rsp.json(), outfile, indent=4)print('云主机类型创建成功')[root@python ~]# python3 create_flavor.py 云主机类型创建成功```### 3、使用python调用api实现创建镜像(2分)在自行搭建的OpenStack私有云平台或提供的all-in-one平台上。在controller节点的/root目录下创建create\_image.py文件,编写python代码对接OpenStack API,完成镜像的上传。要求在OpenStack私有云平台中上传镜像cirros-0.3.4-x86\_64-disk.img,名字为pvm\_image,disk\_format为qcow2,container\_format为bare。执行完代码要求输出“镜像创建成功,id为:xxxxxx”。(如果存在同名镜像,代码中需先进行删除操作)根据上述要求编写python代码,完成后,将controller节点的IP地址,用户名和密码提交。(考试系统会连接到你的controller节点,去执行python脚本,请准备好运行的环境,以便考试系统访问)```python[root@python ~]# vi create_image.pyimport requests, jsonurl = ':5000/v3/auth/tokens'headers = {'Content-Type': 'application/json', 'X-Auth-Token': 'gAAAAABj2joGX3RTX6Rl0_NALfR2DpIELdR7Ic7JYS_DA9FZ23HZqpy6Hewo9nBGTJxNQnt5a_wnUKMVCYUrpZcQIQ3-RHlYAL8H6fkK0iSwCRkLLcgCLq923XOyn_8QJBVTeY-fVLZXPupWzvM2IQfaNHm0x-MfIO3QWzFeArj6-guaK3Id_eo'}rsp = requests.get('http://controller:9292/v2/images', headers=headers)for i in rsp.json()['images']: if 'pvm_image' == i['name']: requests.delete('http://controller:9292/v2/images/{}'.format(i['id']), headers=headers)data = {'name': 'pvm_image', 'disk_format': 'qcow2', 'container_format': 'bare'}rsp = requests.post('http://controller:9292/v2/images', headers=headers, data=json.dumps(data))image_id = rsp.json()['id']headers['Content-Type'] = 'application/octet-stream'print(rsp.json())with open('image.json', 'w') as outfile: json.dump(rsp.json(), outfile, indent=4)data = open('/root/cirros-0.3.4-x86_64-disk.img', 'rb')rsp = requests.put('http://controller:9292/v2/images/{}/file'.format(image_id), headers=headers, data=data)print('镜像创建成功,id为:{}'.format(image_id))```### 4、使用python调用 api 实现创建网络(2分)在自行搭建的OpenStack 私有云平台或提供的all-in-one 平台上。在controller 节点的/root 目录下创建 create\_network.py 文件,编写 python 代码对接 OpenStack API,完成网络的创建。要求:(1)为平台创建内部网络 pvm\_int,子网名称为 pvm\_intsubnet;(2)设置云主机网络子网 IP 网段为 192.168.x.0/24(其中 x 是考位号),网关为 192.168.x.1(如果存在同名内网,代码中需先进行删除操作)。执行完代码要求输出“网络创建成功”。根据上述要求编写python代码,完成后,将controller节点的IP地址,用户名和密码提交。(考试系统会连接到你的controller节点,去执行python脚本,请准备好运行的环境,以便考试系统访问)```python[root@python ~]# vi create_network.py#!/usr/bin/python3.6import requests,jsonurl = 'http://192.168.100.225:5000/v3/auth/tokens'headers = {'Content-Type':'application/json','X-Auth-Token':''}rsp = requests.get('http://192.168.100.225:9696/v2.0/networks', headers=headers)for i in rsp.json()['networks']: if 'pvm_int' == i['name']: rsp = requests.delete('http://192.168.100.225:9696/v2.0/networks/{}'.format(i['id'], headers=headers))data = {'network':{'name':'pvm_int'}}rsp = requests.post('http://192.168.100.225:9696/v2.0/networks', headers=headers, data=json.dumps(data))network_id = rsp.json()['network']['id']data = {'subnet':{'name':'pvm_intsubnet','network_id':network_id,'cidr':'192.168.20.0/24','ip_version':'4'}}rsp = requests.post('http://192.168.100.225:9696/v2.0/subnets', headers=headers, data=json.dumps(data))print('网络创建成功') ```### 5、使用python调用api实现创建云主机(2分)在自行搭建的OpenStack 私有云平台或提供的all-in-one 平台上。在controller 节点的/root 目录下创建 create\_vm.py 文件,编写 python 代码对接 OpenStack API,完成云主机的创建。要求使用 pvm\_image、pvm\_flavor、pvm\_int 创建 1 台云主机 pvm1(如果存在同名虚拟主机,代码中需先进行删除操作)。执行完代码要求输出“创建云主机成功”。根据上述要求编写python代码,完成后,将controller节点的IP地址,用户名和密码提交。(考试系统会连接到你的controller节点,去执行python脚本,请准备好运行的环境,以便考试系统访问)```python[root@controller ~]# vi create_vm.pyimport requests, json# /auth/tokensheaders = {'Content-Type': 'application/json', 'X-Auth-Token': ''}rsp = requests.get('http://controller:8774/v2.1/servers', headers=headers)for i in rsp.json()['servers']: if 'pvm1' == i['name']: requests.delete('http://controller:8774/v2.1/servers/{}'.format(i['id']), headers=headers)rsp = requests.get('http://controller:9292/v2/images', headers=headers)for i in rsp.json()['images']: if 'pvm_image' == i['name']: image = i['id']rsp = requests.get('http://controller:8774/v2.1/flavors', headers=headers)for i in rsp.json()['flavors']: if 'pvm_flavor' == i['name']: flavor = i['id']rsp = requests.get('http://controller:9696/v2.0/networks', headers=headers)for i in rsp.json()['networks']: if 'pvm_int' == i['name']: network = i['id']data = {'server': {'name': 'pvm1', 'imageRef': image, 'networks': [{'uuid':network}], 'flavorRef': flavor}}rsp = requests.post('http://controller:8774/v2/servers', headers=headers, data=json.dumps(data))print(rsp.json())with open('vm.json', 'w') as outfile: json.dump(rsp.json(), outfile, indent=4)```### 6、Python 运维开发:云主机类型管理的命令行工具开发(2 分)使用已建好的 OpenStack Python 运维开发环境,在/root 目录下创建 flavor\_manager.py 脚本,完成云主机类型的管 程序支持命令行参数执行。 提示说明:Python 标准库 argparse 模块,可以提供命令行参数的解析。 要求如下:(1)程序支持根据命令行参数,创建 1 个多云主机类型。返回 response。位置参数“create”,表示创建;参数“-n”支持指定 flavor 名称,数据类型为字符串类型;参数“-m”支持指定内存大小,数据类型为 int,单位 M;参数“-v”支持指定虚拟 cpu 个数,数据类型为 int;参数“-d”支持磁盘大小,内存大小类型为 int,单位 G;参数“-id”支持指定 ID,类型为字符串。参考运行实例: python3 flavor\_manager.py create -n flavor\_small -m 1024 -v 1 -d 10 -id 100000(2)程序支持查询目前 admin 账号下所有的云主机类型。位置参数“getall”,表示查询所有云主机类型;查询结果,以 json 格式输出到控制台。参考执行实例如下: python3 flavor\_manager.py getall(3)支持查询给定具体名称的云主机类型查询。位置参数“get”,表示查询1个云主机类型;参数“-id”支持指定 ID 查询,类型为 string。控制台以 json 格式输出创建结果。参考执行实例如下: python3 flavor\_manager.py get -id 100000(4)支持删除指定的 ID 云主机类型。 位置参数“delete”,表示删除一个云主机类型;参数“-id”支持指定 ID 查询,返回 response,控制台输出 response。参考执行实例如下: python3 flavor\_manager.py delete -id 100000```python#!/usr/bin/python3.6import argparse,requests,jsonheaders = {'Content-Type':'application/json','X-Auth-Token':''}parser = argparse.ArgumentParser()parser.add_argument('command',help='Resource command name',type=str)parser.add_argument('-n', '--name',help='指定 flavor 名称',type=str)parser.add_argument('-m', '--memory',help='指定内存大小,单位 M',type=int)parser.add_argument('-v', '--vcpu',help='指定虚拟 cpu 个数',type=int)parser.add_argument('-d', '--disk',help='指定磁盘大小,单位 G',type=int)parser.add_argument('-id', '--id',help='指定 ID',type=str)args = parser.parse_args()if args.command: if args.command == "create": data = {'flavor': {'name': args.name, 'vcpus': args.vcpu, 'ram': args.memory, 'disk': args.disk, 'id': args.id}} rsp = requests.post('http://192.168.100.34:8774/v2.1/flavors', headers=headers, data=json.dumps(data)) print(rsp.json()) elif args.command == "getall": rsp = requests.get('http://192.168.100.34:8774/v2.1/flavors', headers=headers) print(rsp.json()) elif args.command == "get": rsp = requests.get('http://192.168.100.34:8774/v2.1/flavors/{}'.format(args.id), headers=headers) print(rsp.json()) elif args.command == "delete": rsp = requests.delete('http://192.168.100.34:8774/v2.1/flavors/{}'.format(args.id), headers=headers) if rsp.status_code == 202: print(rsp.status_code)```### 7、Python 运维开发:用户管理的命令行工具开发(2分)使用已建好的 OpenStack Python 运维开发环境,在/root 目录下创建 user\_manager.py 脚 本,完成用户管理功能开发,user\_manager.py 程序支持命令行带参数执行。提示说明:Python 标准库 argparse 模块,可以提供命令行参数的解析。(1)程序支持根据命令行参数,创建 1 个用户。 位置参数“create”,表示创建;参数“-i 或--input”,格式为 json 格式文本用户数据。查询结果,以 json 格式输出到控制台。参考执行实例如下: python3 user\_manager.py create --input '{ "name": "user01", "password": "000000", "description": "description" } '(2)支持查询给定具体名称的用户查询。 位置参数“get”,表示查询 1 个用户;参数“-n 或 --name”支持指定名称查询,类型为 string。参数“-o 或 output”支持查询该用户信息输出到文件,格式为 json 格式。参考执行实例如下:python3 user\_manager.py get --name user01 -o user.json(3)程序支持查询目前 admin 账号下所有的用户。位置参数“getall”,表示查询所有用户;参数“-o 或--output”支持输出到文件,格式为 yaml 格式。参考执行实例如下:python3 user\_manager.py getall -o openstack\_all\_user.yaml(4)支持删除指定的名称的用户。位置参数“delete”,表示删除一个用户;返回 response,通过控制台输出。参数“-n 或--name”支持指定名称查询,类型为 string。参考执行实例如下: python3 user\_manager.py delete --name user01```python#!/usr/bin/python3.6import argparse,requests,json,yamlheaders = {'Content-Type':'application/json','X-Auth-Token':''}parser = argparse.ArgumentParser()parser.add_argument('command',help='Resource command name',type=str)parser.add_argument('-n', '--name',help='指定名称查询',type=str)parser.add_argument('-i', '--input',help='格式为 json 格式文本用户数据',type=str)parser.add_argument('-o', '--output',help='查询该用户信息输出到文件,格式为 json 格式',type=str)args = parser.parse_args()rsp = requests.get('http://192.168.100.34:5000/v3/users', headers=headers)for i in rsp.json()['users']: if args.name == i['name']: user_id = i['id']if args.command: if args.command == "create": data = {'user':json.loads(args.input)} rsp = requests.post('http://192.168.100.34:5000/v3/users', headers=headers, data=json.dumps(data)) print(rsp.json()) elif args.command == "getall": with open(args.output, 'w') as yamlfile: yaml.dump(rsp.json(), yamlfile) elif args.command == "get": rsp = requests.get('http://192.168.100.34:5000/v3/users/{}'.format(user_id), headers=headers) with open(args.output, 'w') as jsonfile: json.dump(rsp.json(), jsonfile, indent=4) elif args.command == "delete": rsp = requests.delete('http://192.168.100.34:5000/v3/users/{}'.format(user_id), headers=headers) if rsp.status_code == 204: print(rsp.status_code)```### 8、OpenStack Python运维脚本开发:使用SDK方式创建镜像(3分)在提供的OpenStack私有云平台上,使用T版本的openstack-python-dev镜像创建1台云主机,云主机类型使用4vCPU/12G内存/100G硬盘。该主机中已经默认安装了所需的开发环境,登录默认账号密码为“root/Abc\@1234”。使用“openstacksdk”python库,在/root目录下创建sdk\_manager\_image.py文件,编写python代码,代码实现以下任务:(1)先检查OpenStack镜像“cirros-image”名称是否存在?如果存在,先完成删除该镜像;(2)如果不存在“cirros-image”名称,使用文件服务器上“cirros-0.3.4-x86\_64-disk.img”文件创建镜像;(3)创建完成后,查询该镜像信息,查询的body部分内容控制台输出,同时json格式的输出到文件当前目录下的image\_demo.json文件中,json格式要求indent=4。编写完成后,提交allinone节点的用户名、密码和IP地址到答题框。```python[root@controller ~]# vi #!/usr/bin/python3.6import openstack,jsonconn = openstack.connect( auth_url = 'http://192.168.100.37:5000/v3', user_domain_name = 'demo', username = 'admin', password = '000000')image = conn.image.find_image('cirros-image')if image: conn.image.delete_image('cirros-image')uri = '/root/cirros-0.3.4-x86_64-disk.img'data = {'name':'cirros-image','disk_format':'qcow2','container_format':'bare'}create = conn.image.create_image(**data)image = conn.image.import_image(create, method='web-download', uri=uri)get_image = image = conn.image.find_image('cirros-image')print(get_image) with open('image_demo.json', 'w') as outfile: json.dump(get_image, outfile, indent=4)```### 9、OpenStack Python运维脚本开发:使用SDK方式创建云主机类型(3分)在提供的OpenStack私有云平台上,使用T版本的openstack-python-dev镜像创建1台云主机,云主机类型使用4vCPU/12G内存/100G硬盘。该主机中已经默认安装了所需的开发环境,登录默认账号密码为“root/Abc\@1234”。使用“openstacksdk”python库,在/root目录下创建sdk\_manager\_flavor.py文件,编写python代码,代码实现以下任务:(1)先检查OpenStack云主机类型“flavor\_demo”名称是否存在?如果存在,先完成删除该云主机类型;(2)如果不存在“flavor\_demo”名称,创建该云主机类型,名字为flavor\_demo、vcpu为1个、内存为1024m、硬盘为20G、ID为9999。(3)创建完成后,查询该云主机类型信息,查询的body部分内容控制台输出,同时json格式的输出到文件当前目录下的flavor\_demo.json文件中,json格式要求indent=4。编写完成后,提交allinone节点的用户名、密码和IP地址到答题框。```python#!/usr/bin/python3.6import openstack,jsonconn = openstack.connect( auth_url = 'http://192.168.100.37:5000/v3', user_domain_name = 'demo', username = 'admin', password = '000000')nova = conn.compute.find_flavor('flavor_demo')if nova: conn.compute.delete_flavor(nova.id)data = {'name':'flavor_demo','vcpus':'1','ram':'1024','disk':'20','id':'9999'}flavor = conn.compute.create_flavor(**data)print(flavor)with open('flavor_demo.json','w') as outfile: json.dump(flavor,outfile,indent=4)```### 10、OpenStack Python运维脚本开发:使用SDK方式创建网络(3分)在提供的OpenStack私有云平台上,使用T版本的openstack-python-dev镜像创建1台云主机,云主机类型使用4vCPU/12G内存/100G硬盘。该主机中已经默认安装了所需的开发环境,登录默认账号密码为“root/Abc\@1234”。使用“openstacksdk”python库,在/root目录下创建sdk\_manager\_net.py文件,编写python代码,代码实现以下任务:先检查OpenStack网络“net\_demo”名称是否存在?如果存在,先完成删除该网络;(2)如果不存在“net\_demo”名称,创建该网络,内部网络名称为net\_demo,子网名称为 subnet\_demo;设置云主机网络子网 IP 网段为 192.168.x.0/24(其中 x 是考位号),网关为 192.168.x.1;(3)创建完成后,查询该网络信息,查询的body部分内容控制台输出,同时json格式的输出到文件当前目录下的net\_demo.json文件中,json格式要求indent=4。编写完成后,提交allinone节点的用户名、密码和IP地址到答题框。```python#!/usr/bin/python3.6import openstack,jsonconn = openstack.connect( auth_url = 'http://192.168.100.37:5000/v3/', user_domain_name = 'demo', username = 'admin', password = '000000')net = conn.network.find_network('net_demo')if net: conn.network.delete_network(net.id)network = conn.network.create_network(name='net_demo')data = {'name':'subnet_demo','cidr':'192.168.3.0/24','gateway_ip':'192.168.3.1','network_id':network.id,'ip_version':'4'}subnet = conn.network.create_subnet(**data)get_network = conn.network.find_network('net_demo')get_subnet = conn.network.find_subnet('subnet_demo')print(get_network,get_subnet)with open('net_demo.json','w') as outfile: json.dump(get_network,outfile,indent=4)```### 11、OpenStack Python运维脚本开发:使用SDK方式创建云主机(3分)实操题】Python运维开发:基于Openstack Python SDK实现云主机创建(1分)使用已建好的OpenStack Python运维开发环境,在/root目录下创建sdk_server_manager.py脚本,使用python-openstacksdk Python模块,完成云主机的创建和查询。创建之前查询是否存在“同名云主机”,如果存在先删除该镜像。(1)创建1台云主机:云主机信息如下:云主机名称如下:server001镜像文件:cirros-0.3.4-x86_64-disk.img云主机类型:m1.tiny网络等必要信息自己补充。(2)查询云主机:查询云主机server001的详细信息,并以json格式文本输出到控制台。完成后提交OpenStack Python运维开发环境 Controller节点的IP地址,用户名和密码提交。```python#!/usr/bin/python3.6import openstack,jsonconn = openstack.connect( auth_url = 'http://192.168.100.37:5000/v3', user_domain_name = 'demo', username = 'admin', password = '000000')server = conn.compute.find_server('vm_demo')if server: conn.compute.delete_server(server.id)image = conn.image.find_image('cirros-image')flavor = conn.compute.find_flavor('flavor_demo')network = conn.network.find_network('net_demo')data = {'name':'vm_demo','image_id':image.id,'flavor_id':flavor.id,'networks':[{'uuid':network.id}]}vm = conn.compute.create_server(**data)print(vm)with open('vm_demo.json', 'w') as outfile: json.dump(vm,outfile,indent=4) ---------------------------------import openstack, jsonconn = openstack.connect( auth_url='http://controller:5000/v3', user_domain_name='demo', username='admin', password='000000')server = conn.compute.find_server('server002')if server: conn.compute.delete_server(server.id)image = conn.image.find_image('cirros-1')flavor = conn.compute.find_flavor('m1.tiny')network = conn.network.find_network('nettt')data = {'name': 'server002', 'image_id': image.id, 'flavor_id': flavor.id, 'networks': [{'uuid': network.id}], 'description': 'server001}vm = conn.compute.creata_server(**data)print(vm)#conn.network.delete_network#conn.network.create_subnet#conn.neconn.image.create_image#conn.image.import_image```## 五、Ansible脚本开发### 1、Ansible部署MariaDB集群(2分)使用OpenStack私有云平台,创建4台系统为centos7.9的云主机,其中一台作为Ansible的母机并命名为ansible,另外三台云主机命名为node1、node2、node3;使用这一台母机,编写Ansible脚本(在/root目录下创建example目录作为Ansible工作目录,部署的入口文件命名为cscc\_install.yaml),对其他三台云主机进行安装高可用数据库集群(MariaDB\_Galera\_cluster,数据库密码设置为123456)的操作(所需的安装包在HTTP服务中)。完成后提交Ansible节点的用户名、密码和IP地址到答题框。(考试系统会连接到你的Ansible节点,去执行Ansible脚本,请准备好Ansible运行环境,以便考试系统访问)```yaml[root@ansible ~]# mkdir example[root@ansible ~]# vi /etc/hosts192.168.100.180 ansible192.168.100.118 node1192.168.100.49 node2192.168.100.144 node3[root@ansible ~]# tar -zxvf ansible.tar.gz -C /opt/[root@ansible ~]# tar -zxvf gpmall-single.tar.gz -C /opt/[root@ansible ~]# rm -rf /etc/yum.repos.d/*[root@ansible ~]# vi /etc/yum.repos.d/local.repo[centos]name=centosbaseurl=http://192.168.100.10/image/iaas/centos7.9/gpgcheck=0enabled=1[ansible]name=ansiblebaseurl=file:///opt/ansiblegpgcheck=0enabled=1[gpmall]name=gpmallbaseurl=file:///opt/gpmall-single/gpmall-repogpgcheck=0enabled=1[root@ansible ~]# yum install ansible mariadb mariadb-server vim -y[root@ansible ~]# vim /etc/ansible/hosts[hosts]node1 ssh_pass=000000node2 ssh_pass=000000node3 ssh_pass=000000[root@ansible ~]# vi /etc/ansible/ansible.cfghost_key_checking = Falsecommand_warnings = False[root@ansible ~]# ansible all -m pingnode1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"}node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"}node3 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"}[root@ansible ~]# mkdir example[root@ansible ~]# cd example/[root@ansible example]# mkdir roles/mariadb/tasks -p[root@ansible example]# touch cscc_install.yaml[root@ansible example]# vim cscc_install.yaml---- hosts: hosts remote_user: root roles: - mariadb[root@ansible example]# vim roles/mariadb/tasks/main.yaml- name: cp hosts copy: src=/root/hosts dest=/etc- name: cp synchronize: src=/root/gpmall-repo dest=/root- name: rm repo shell: rm -rf /etc/yum.repos.d/*- name: cp repo shell: src=/root/local.repo dest=/etc/yum.repos.d/- name: install mariadb shell: yum install mariadb mariadb-server -y- name: start mariadb shell: systemctl restart mariadb- name: password shell: mysqladmin password 123456| cat- name: grant all shell: mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"- name: stop mariadb shell: systemctl stop mariadb- name: cp config copy: src=/root/server.cng dest=/etc/my.cnf.d/- name: start mariadb shell: galera_new_cluster when: ansible_hostname=='node1'- name: start mariadb shell: systemctl restart mariadb when: ansible_hostname=='node2'- name: start mariadb shell: systemctl restart mariadb when: ansible_hostname=='node3'[root@ansible ~]# cp /etc/my.cnf.d/server.cnf .[root@ansible ~]# vim server.cnf[galera] # 取消注释# Mandatory settingswsrep_on=ONwsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address=gcomm://node1,node2,node3binlog_format=rowdefault_storage_engine=InnoDBinnodb_autoinc_lock_mode=2## Allow server to accept connections on all interfaces.#bind-address=0.0.0.0[root@ansible ~]# cd example/[root@ansible example]# ansible-playbook cscc_install.yaml```### 2、【实操题】Ansible服务部署:部署FTP服务(1分)使用赛项提供的 OpenStack 私有云平台,创建 2 台系统为 centos7.5 的云主机,其中一台作为 ansible 的母机并命名为 ansible,另外一台云主机命名为 node1,通过 http 服务中的ansible.tar.gz 软件包在 ansible 节点安装 ansible 服务;并用这台母机,编写 ansible 脚本(在/root 目录下创建 ansible\_ftp 目录作为 ansible 工作目录, 部署的入口文件命名为install\_ftp.yaml)。install\_ftp.yaml 文件中需要完成的内容为(1) yaml 中被执行节点为 node1,执行者为 root;(2) 使用 copy 模块将 ansible 节点的 local.repo 传到 node 节点;(local.repo 用于配置node 节点的 yum 源,可自行创建)(3) 使用 yum 模块安装 ftp 服务;(4) 使用 service 模块启动 ftp 服务。完成后提交ansible节点的用户名、密码和IP地址到答题框。(考试系统会连接到ansible节点,执行ansible脚本,准备好环境,以便考试系统访问)```yaml[root@ansible ~]# vi /etc/hosts192.168.100.37 ansible192.168.100.33 node1[root@ansible ~]# tar -zxvf ansible.tar.gz -C /opt/[root@ansible ~]# rm -rf /etc/yum.repos.d/*[root@ansible ~]# vi /etc/yum.repos.d/local.repo[centos]name=centosbaseurl=http://192.168.100.10/image/iaas/centos7.9/gpgcheck=0enabled=1[ansible]name=ansiblebaseurl=file:///opt/ansiblegpgcheck=0enabled=1[root@ansible ~]# cp /etc/yum.repos.d/local.repo .[root@ansible ~]# yum install ansible vim -y[root@ansible ~]# vi /etc/ansible/hosts[hosts]node1 ssh_pass=000000[root@ansible ~]# vim /etc/ansible/ansible.cfghost_key_checking = False # 取消注释command_warnings = False # 取消注释[root@ansible ~]# ssh-keygen[root@ansible ~]# ssh-copy-id root@node1[root@ansible ~]# mkdir /root/ansible_ftp[root@ansible ~]# cd ansible_ftp/[root@ansible ansible_ftp]# vim install_ftp.yaml---- hosts: node1 remote_user: root tasks: - name: rm repo shell: rm -rf /etc/yum.repos.d/* - name: cp repo copy: src=/root/local.repo dest=/etc/yum.repos.d/ - name: install yum: name=vsftpd state=present - name: start ftp service: name=vsftpd state=started[root@ansible ansible_ftp]# ansible-playbook install_ftp.yaml```### 4、Ansible服务部署:部署zabbix服务(2分)使用赛项提供的 OpenStack 私有云平台,创建 2 台系统为 centos7.5 的云主机,其中一台作为 Ansible 的母机并命名为 ansible,另一台云主机命名为 node,通过 http 服务中的 ansible.tar.gz 软件包在 ansible 节点安装 Ansible 服务;并用这台母机,补全 Ansible 脚本(在 HTTP 中下载 install\_zabbix.tar.gz 并解压到/root 目录下),补全 Ansible 脚本使得执行 install\_zabbix.yaml 可以在 node 节点上完成 zabbix 服务的安装。完成后提交ansible节点的用户名、密码和IP地址到答题框。(考试系统会连接到ansible节点,执行ansible脚本,准备好环境,以便考试系统访问)```yaml[root@ansible ~]# tar -zxvf ansible.tar.gz -C /opt/[root@ansible ~]# vim /etc/hosts192.1678.100.36 ansible192.168.100.17 node[root@ansible ~]# tar -zxvf install_zabbix.tar.gz[root@ansible ~]# rm -rf /etc/yum.repos.d/*[root@ansible ~]# vim /etc/yum.repos.d/local.repo[ansible]name=ansiblebaseurl=file:///opt/ansiblegpgcheck=0enabled=1[root@ansible ~]# yum install ansible -y[root@ansible ~]# vim /etc/ansible/hosts[hosts]node ssh_pass=000000[root@ansible ~]# vim /etc/ansible/ansible.cfghost_key_checking = False #取消注释command_warnings = False[root@ansible ~]# cd install_zabbix[root@ansible install_zabbix]# cd group_vars/[root@ansible group_vars]# vim allDB_PASS: '000000'DB_HOST:[root@ansible group_vars]# cd ..[root@ansible install_zabbix]# vim install_zabbix.yaml---- hosts: node remote_user: root roles: - zabbix[root@ansible install_zabbix]# cd roles/zabbix/files/[root@ansible files]# vim yum.repo[zabbix]name=zabbixbaseurl=file:///opt/zabbixgpgcheck=0enabled=1[root@ansible install_zabbix]# vim tasks/main.yaml - name: mv yum config shell: mv /etc/yum.repos.d/* /root/ - name: copy repo copy: src=yum.repo dest=/etc/yum.repos.d/yum.repo - name: Copy Repo Tar copy: src=zabbix.tar.gz dest=/opt - name: Decompression Package shell: tar -zxvf /opt/zabbix.tar.gz -C /opt - name: Mariadb Create zabbix shell: mysql -uroot -p{{ DB_PASS }} -e "create database zabbix character set utf8 collate utf8_bin;" ignore_errors: yes - name: privileages mariadb shell: "{{ item }}" with_items: - mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';" - mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@localhost identified by zabbix';" - name: Install zabbix yum: name: - zabbix-server-mysql - zabbix-web-mysql - zabbix-agent - trousers - name: Config zabbix_server.conf template: src=zabbix_server.conf.j2 dest=/etc/zabbix/zabbix_server.conf ```### 5、Ansible服务部署:部署ELK集群服务(2分)使用赛项提供的OpenStack私有云平台,创建三台CentOS7.9系统的云主机分别命名为elk-1、elk-2和elk-3,Ansible主机可以使用上一题的环境。要求Ansible节点编写剧本,执行Ansible剧本可以在这三个节点部署ELK集群服务(在/root目录下创建install\_elk目录作为ansible工作目录,部署的入口文件命名为install_elk.yaml)。具体要求为三个节点均安装Elasticserach服务并配置为Elasticserach集群;kibana安装在第一个节点;Logstash安装在第二个节点。(需要用到的软件包在HTTP服务下)完成后提交ansible节点的用户名、密码和IP地址到答题框。(考试系统会连接到ansible节点,执行ansible脚本,准备好环境,以便考试系统访问)```plain 评分:ansible elk-1 -a "netstat -ntlp"5601||9300||9200cd /root/install_elk && ansible-playbook install_elk.yammlfailed=0||failed=0||failed=0```
-
任务 2 私有云服务运维(15 分)1.2.1 Glance 开放镜像权限将指定镜像在指定项目进行共享使用。[root@controller ~]# glance image-create --name glance-cirros --disk-format qcow2 --container-format bare <cirros-0.3.4-x86_64-disk.img +------------------+----------------------------------------------------------------------------------+| Property | Value |+------------------+----------------------------------------------------------------------------------+| checksum | ee1eca47dc88f4879d8a229cc70a07c6 || container_format | bare || created_at | 2024-02-22T14:09:49Z || disk_format | qcow2 || id | 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 || min_disk | 0 || min_ram | 0 || name | glance-cirros || os_hash_algo | sha512 || os_hash_value | 1b03ca1bc3fafe448b90583c12f367949f8b0e665685979d95b004e48574b953316799e23240f4f7 || | 39d1b5eb4c4ca24d38fdc6f4f9d8247a2bc64db25d6bbdb2 || os_hidden | False || owner | 7744815b067c43db86fa13120c043b92 || protected | False || size | 13287936 || status | active || tags | [] || updated_at | 2024-02-22T14:09:50Z || virtual_size | Not available || visibility | shared |+------------------+----------------------------------------------------------------------------------+[root@controller ~]# openstack project list+----------------------------------+---------+| ID | Name |+----------------------------------+---------+| 7744815b067c43db86fa13120c043b92 | admin || 8358c987bb8f4d9fa09485f94705f522 | demo || f71b1bfdbf3f4a639257a3948bec2cf8 | service |+----------------------------------+---------+[root@controller ~]# openstack image list+--------------------------------------+---------------+--------+| ID | Name | Status |+--------------------------------------+---------------+--------+| 2e2515ad-046f-4494-8d47-f9c943febc63 | cirros | active || 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | glance-cirros | active |+--------------------------------------+---------------+--------+# 镜像id在前(此处通过命令将glance-cirros镜像指定demo项目可以进行共享使用)[root@controller ~]# glance member-create 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 8358c987bb8f4d9fa09485f94705f522 +--------------------------------------+----------------------------------+---------+| Image ID | Member ID | Status |+--------------------------------------+----------------------------------+---------+| 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | 8358c987bb8f4d9fa09485f94705f522 | pending |+--------------------------------------+----------------------------------+---------+[root@controller ~]# glance member-update 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 8358c987bb8f4d9fa09485f94705f522 accepted+--------------------------------------+----------------------------------+----------+| Image ID | Member ID | Status |+--------------------------------------+----------------------------------+----------+| 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | 8358c987bb8f4d9fa09485f94705f522 | accepted |+--------------------------------------+----------------------------------+----------+1.2.2 Glance 镜像转换使用 CentOS 的镜像,将该镜像转换为 RAW 格式。[root@controller ~]# qemu-img convert -f qcow2 -O raw CentOS7.5-compress.qcow2 CentOS7.5-compress.raw1.2.3 Glance 镜像存储限制使用自行搭建的 OpenStack 平台。请修改 Glance 后端配置文件,修改用户的镜像存储配额限制。[root@controller ~]# vim /etc/glance/glance-api.conf #user_storgage_quota = 0修改为user_storgage_quota = 200G[root@controller ~]# systemctl restart openstack-glance*1.2.4 Nova 清除缓存在 OpenStack 平台上,修改相关配置,让长时间不用的镜像缓存在过一定的时间后会被自动删除。[root@controller ~]# vim /etc/nova/nova.confremove_unused_base_images=true # 取消注释1.2.5 使用 Heat 模板创建网络在自行搭建的 OpenStack 私有云平台上,编写 Heat 模板文件,完成网络的创建。[root@controller ~]# vim create_net.yamlheat_template_version: 2015-10-15resources: network: type: OS::Neutron::Net properties: name: Heat-Network admin_state_up: true # 管理员状态 shared: false subnet: type: OS::Neutron::Subnet properties: name: Heat-Subnet network_id: get_resource: network cidr: 10.20.2.0/24 # 子网网段 allocation_pools: # 分配池 - start: 10.20.2.20 # 开始 end: 10.20.2.100 # 结束 enable_dhcp: true # 启用dhcp [root@controller ~]# openstack stack create -t create_net.yaml test [root@controller ~]# openstack stack delete test -y1.2.6 部署 NFS 应用服务使用 OpenStack 私有云平台,创建一台云主机,安装 NFS 服务,然后对接 Glance后端存储。 [root@compute ~]# systemctl start rpcbind[root@compute ~]# systemctl start nfs[root@compute ~]# vi /etc/exports/mnt/test *(rw,sync,no_root_squash) [root@compute ~]# mkdir /mnt/test[root@compute ~]# exportfs -r[root@compute ~]# showmount -e localhostExport list for localhost:/mnt/test */var/lib/manila/mnt/share-b7f82a14-9804-46c3-bcfa-6accbe65ae20 127.0.0.0/24,192.168.100.142[root@controller ~]# showmount -e 192.168.100.226Export list for 192.168.100.226:/mnt/test */var/lib/manila/mnt/share-b7f82a14-9804-46c3-bcfa-6accbe65ae20 127.0.0.0/24,192.168.100.142[root@controller ~]# mount -t nfs 192.168.100.226:/mnt/test /var/lib/glance/images/[root@controller ~]# df -h192.168.100.226:/mnt/test 100G 2.0G 99G 2% /var/lib/glance/images[root@controller ~]# chown glance:glance /var/lib/glance/images/[root@controller ~]# ls -l /var/lib/glance/total 0drwxr-xr-x. 2 glance glance 6 Sep 23 08:40 images1.2.7 部署 Redis 集群部署 Redis 集群, Redis 的一主二从三哨兵架构。# 修改redis1节点配置文件[root@redis1 ~]# vi /etc/redis.conf# bind 127.0.0.1 # 加上注释protected-mode no # 修改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"[root@redis1 ~]# systemctl restart redis# 修改redis2、redis3节点[root@redis2 ~]# vi /etc/redis.conf# bind 127.0.0.1 # 加注释protected-mode no # 改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"# slaveof <masterip> <masterport> 下方添加:slaveof 192.168.100.115 6379[root@redis2 ~]# systemctl restart redisredis3 同理[root@redis1 ~]# systemctl restart redis [root@redis1 ~]# redis-cli -a 123456 info replicationconnected_slaves:2[root@redis1 ~]# vi /etc/sentinel.confport 26379protected-mode no # 保护模式daemonize yessentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456[root@redis2 ~]# vi /etc/sentinel.confport 26380protected-mode nodaemonize yessentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456[root@redis3 ~]# vi /etc/sentinel.confport 26381protected-mode nodaemonize yes sentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456# 启动哨兵模式[root@redis1 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis2 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis3 ~]# redis-server /etc/sentinel.conf --sentinel1.2.8 Redis AOF 调优修改在 Redis 相关配置,避免 AOF 文件过大, Redis 会进行 AOF 重写。[root@redis1 ~] vi /etc/redisappendonly no 改为appendonly yes #启动AOFno-appendfsync_on-rewirte = no #关闭重写auto-aof-rewrite-min-size 100 文件达到100%重写(2倍)auto-aof-rewrite-min-size 64mb 最小文件64m 开始重写
-
任务 2 私有云服务运维(15 分)1.2.1 Raid 磁盘阵列管理在云主机上对云硬盘进行操作, 先进行分区, 然后创建名为/dev/md5、raid 级别为 5 的磁盘阵列加一个热备盘。[root@raid ~]# yum install mdadm[root@raid ~]# fdisk /dev/sdb[root@raid ~]mdadm -Cv /dev/md5 -l5 -n3 /dev/sdb[1-3] --spare-devices=1 /dev/sdb4[root@raid ~]# mdadm -D /dev/md51.2.2 消息队列调优在 OpenStack 私有云平台, 分别通过用户级别、系统级别、配置文件来设置RabbitMQ 服务的最大连接数。[root@controller ~]# vim /etc/security/limits.conf添加:openstack soft nofile 10240openstack hard nofile 10240[root@controller ~]# vim /etc/sysctl.conf添加:fs.file-max = 10240[root@controller ~]# vim /usr/lib/systemd/system/rabbitmq-server.service[Service]添加:LimitNOFILE=10240[root@controller ~]# systemctl daemon-reload[root@controller ~]# systemctl restart rabbitmq-server[root@controller ~]# [rabbitmqctl status[{total_limit,10140},1.2.3 Keystone 优化请修改相关配置, 增加 Keystone 的失效列表缓存时间。[root@controller ~]# vim /etc/keystone/keystone.conf[token]provider = keystone.token.providers.uuid.Providerdriver = keystone.token.persistence.backends.memcache.Token[memcache]servers = localhost:112111.2.4 Glance 镜像压缩在 HTTP 文件服务器中存在一个镜像为 CentOS 的镜像, 请对该镜像进行压缩操作。 [root@controller ~]# qemu-img convert -c -O qcow2 http://192.168.100.91/image/iaas/CentOS7.5-compress.qcow2 /root/chinaskill-js-compress.qcow21.2.5 虚拟机调整 Flavor使用 OpenStack 私有云平台, 请修改相应配置, 实现云主机调整实例大小可以使用。[root@controller ~]# vim /etc/nova/nova.confallow_resize_to_same_host=false改为allow_resize_to_same_host=true1.2.6 Nova 数据库连接调优修改 nova 相关配置文件,修改连接池大小和最大允许超出的连接数。【nova 调优】[root@controller ~]# vi /etc/nova/nova.conf#超售比ram_allocation_ratio = 1.0#默认是1.5,内存分配超售比 disk_allocation_ratio = 1.2#磁盘超售比例,默认是1:1倍 cpu_allocation_ratio = 4.0#cpu超售比,建议超售4倍,vcpu可以比宿主机内核多4倍####################################预留量vcpu_pin_set = 4-%#%是物理机的cpu内核总数来决定的,比如上面这个#预留4个cup防止虚拟机跟组主机抢cpu资源 reserved_host_memory_mb = 4096#预留的内存量,这部分内存不能被虚拟机所使用,单位是m reserved_host_disk_mb = 10240#磁盘预留量,这部分空间不能被虚拟机所使用,单位是m####################################服务下线时间service_down_time=120服务下线时间阈值,单位是秒,如果一个节点上的nova服务超过这个时间没有上报数据库【数据库调优】[root@controller ~]# vi /etc/my.cnfmax_connections=1500#最大连接(用户)数。每个连接 MySQL 的用户均算作一个连接max_connect_errors=30#最大失败连接限制.1.2.7 使用 Heat 模板创建网络在自行搭建的 OpenStack 私有云平台上,编写 Heat 模板文件,完成网络的创建。[root@controller ~]# vim create_net.yamlheat_template_version: 2015-10-15resources: network: type: OS::Neutron::Net properties: name: Heat-Network admin_state_up: true # 管理员状态 shared: false subnet: type: OS::Neutron::Subnet properties: name: Heat-Subnet network_id: get_resource: network cidr: 10.20.2.0/24 # 子网网段 allocation_pools: # 分配池 - start: 10.20.2.20 # 开始 end: 10.20.2.100 # 结束 enable_dhcp: true # 启用dhcp [root@controller ~]# openstack stack create -t create_net.yaml test [root@controller ~]# openstack stack delete test -y1.2.8 Redis 应用部署使用赛项提供的 OpenStack 私有云平台,创建两台云主机,配置为 redis 的主从架构。申请两台 CentOS7.9 系统的云主机,使用提供的 http 源,在两个节点安装 redis 服务并启动,配置 redis 的访问需要密码,密码设置为 123456。然后将这两个 redis 节点配置为 redis 的主从架构#主节点[root@master ~]# yum install -y redis[root@master ~]# cat /etc/redis.confbind 0.0.0.0protected-mode nomasterauth 123456requirepass 123456appendonly yesdaemonize yes[root@master ~]# systemctl restart redis#从节点[root@node ~]# yum install -y redis[root@node ~]# cat /etc/redis.confbind 0.0.0.0protected-mode no#主节点ipslaveof 192.168.10.10 6379masterauth 123456requirepass 123456appendonly yesdaemonize yes[root@node ~]# systemctl restart redis#验证[root@master ~]# redis-cli -a 123456 127.0.0.1:6379> info Replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.10.11,port=6379,state=online,offset=29,lag=0master_repl_offset:29repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:28
-
任务 2 私有云服务运维(15 分)1.2.1 Linux 网络命名空间运维创建网络空间,实现网络空间的虚拟网络设备的通信。# 创建test1,test2[root@controller ~]# ip netns add test1[root@controller ~]# ip netns add test2# 开启test1,test2[root@controller ~]# ip netns exec test1 ip link set dev lo up[root@controller ~]# ip netns exec test2 ip link set dev lo up# 创建一对veth[root@controller ~]# ip link add veth-test1 type veth peer name veth-test2# 分配给test1,test2[root@controller ~]# ip link set veth-test1 netns test1[root@controller ~]# ip link set veth-test2 netns test2# 给veth分配ip地址[root@controller ~]# ip netns exec test1 ip addr add 192.168.100.1/24 dev veth-test1[root@controller ~]# ip netns exec test2 ip addr add 192.168.100.2/24 dev veth-test2# 启动veth[root@controller ~]# ip netns exec test1 ip link set dev veth-test1 up[root@controller ~]# ip netns exec test2 ip link set dev veth-test2 up# 在test1命名空间中可以ping通 192.168.1.2# 在test2命名空间中可以ping通 192.168.1.1[root@controller ~]# ip netns exec test1 ping 192.168.100.1[root@controller ~]# ip netns exec test2 ping 192.168.100.21.2.2 Glance 开放镜像权限将镜像指定项目进行共享使用。[root@controller ~]# glance image-create --name glance-cirros --disk-format qcow2 --container-format bare <cirros-0.3.4-x86_64-disk.img [root@controller ~]# openstack project list+----------------------------------+---------+| ID | Name |+----------------------------------+---------+| 7744815b067c43db86fa13120c043b92 | admin || 8358c987bb8f4d9fa09485f94705f522 | demo || f71b1bfdbf3f4a639257a3948bec2cf8 | service |+----------------------------------+---------+[root@controller ~]# openstack image list+--------------------------------------+---------------+--------+| ID | Name | Status |+--------------------------------------+---------------+--------+| 2e2515ad-046f-4494-8d47-f9c943febc63 | cirros | active || 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | glance-cirros | active |+--------------------------------------+---------------+--------+# 镜像id在前(此处通过命令将glance-cirros镜像指定demo项目可以进行共享使用)[root@controller ~]# glance member-create 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 8358c987bb8f4d9fa09485f94705f522 +--------------------------------------+----------------------------------+---------+| Image ID | Member ID | Status |+--------------------------------------+----------------------------------+---------+| 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | 8358c987bb8f4d9fa09485f94705f522 | pending |+--------------------------------------+----------------------------------+---------+[root@controller ~]# glance member-update 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 8358c987bb8f4d9fa09485f94705f522 accepted+--------------------------------------+----------------------------------+----------+| Image ID | Member ID | Status |+--------------------------------------+----------------------------------+----------+| 5c2a66a5-dcbb-4d2d-b35d-1264d9bfea69 | 8358c987bb8f4d9fa09485f94705f522 | accepted |+--------------------------------------+----------------------------------+----------+1.2.3 Glance 镜像压缩在 HTTP 文件服务器中存在一个镜像为 CentOS 的镜像, 请对该镜像进行压缩操作。[root@controller ~]# qemu-img convert -c -O qcow2 http://192.168.100.91/image/iaas/CentOS7.5-compress.qcow2 /root/chinaskill-js-compress.qcow21.2.4 Nova 清除缓存在 OpenStack 平台上, 修改相关配置, 让长时间不用的镜像缓存在过一定的时间后会被自动删除。[root@controller ~]# vim /etc/nova/nova.confremove_unused_base_images=true # 取消注释 1.2.5 Glance 对接 Cinder 存储在自行搭建的 OpenStack 平台中修改相关参数,使 Glance 可以使用 Cinder作为后端存储。[root@controller ~]# vi /etc/glance/glance-api.confshow_multiple_locations = true[glance_store]stores = file,http,cinderdefault_store = cinderfilesystem_store_datadir = /var/lib/glance/images/cinder_store_address=http://controller : 5000/v3cinder_store_user_name=glancecinder_store_project_name=cirros-cinder[root@controller ~]# vim /etc/cinder/cinder.confallowed_direct_url_schemes = cinderimage_upload_use_internal_tenant = true[root@controller ~]# systemctl restart openstack-*[root@controller ~]# glance image-create --name cirros-image --disk-format qcow2 --container-format bare < cirros-0.3.4-x86_64-disk.img1.2.6 使用 Heat 模板创建存储容器在自行搭建的 OpenStack 私有云平台上,在/root 目录下编写 Heat 模板文件,要求执行 yaml 文件可以创建名为 heat-swift 的容器。[root@controller ~]# vim create_container.yamlheat_template_version: 2015-10-15resources: container: type: OS::Swift::Container properties: name: heat-swift[root@controller ~]# openstack stack create -t create_container.yaml test[root@controller ~]# openstack stack delete test -y 1.2.7 SkyWalking 应用部署申请一台云主机,使用提供的软件包安装 Elasticsearch 服务和 SkyWalking 服 务。再申请一台云主机,用于搭建 gpmall 商城应用,并配置 SkyWalking 监控gpmall 主机。1.2.8 Redis 集群部署部署 Redis 集群, Redis 的一主二从三哨兵架构。# 修改redis1节点配置文件[root@redis1 ~]# vi /etc/redis.conf# bind 127.0.0.1 # 加上注释protected-mode no # 修改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"[root@redis1 ~]# systemctl restart redis# 修改redis2、redis3节点[root@redis2 ~]# vi /etc/redis.conf# bind 127.0.0.1 # 加注释protected-mode no # 改为nodaemonize yes # 改为yes# requirepass foobared 下方添加:requirepass "123456"# masterauth <master-password> 下方添加:masterauth "123456"# slaveof <masterip> <masterport> 下方添加:slaveof 192.168.100.115 6379[root@redis2 ~]# systemctl restart redisredis3 同理[root@redis1 ~]# systemctl restart redis [root@redis1 ~]# redis-cli -a 123456 info replicationconnected_slaves:2[root@redis1 ~]# vi /etc/sentinel.confport 26379protected-mode no # 保护模式daemonize yessentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456[root@redis2 ~]# vi /etc/sentinel.confport 26380protected-mode nodaemonize yessentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456[root@redis3 ~]# vi /etc/sentinel.confport 26381protected-mode nodaemonize yes sentinel monitor redis1 192.168.100.115 6379 2sentinel auth-pass redis1 123456# 启动哨兵模式[root@redis1 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis2 ~]# redis-server /etc/sentinel.conf --sentinel[root@redis3 ~]# redis-server /etc/sentinel.conf --sentinel
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签