【题目 1】Ansible 服务部署:部署 MariaDB 集群
使用 OpenStack 私有云平台,创建 4 台系统为 centos7.9 的云主机,其中一台作为 Ansible的母机并命名为 ansible,另外三台云主机命名为 node1、node2、node3;使用这一台母机,编写 Ansible 脚本(在/root 目录下创建 example 目录作为 Ansible 工作目录,部署的入口文件 命 名 为 cscc_install.yaml ) , 对 其 他 三 台 云 主 机 进 行 安 装 高 可 用 数 据 库 集 群(MariaDB_Galera_cluster,数据库密码设置为 123456)的操作(所需的安装包在 HTTP 服务中)。完成后提交 Ansible 节点的用户名、密码和 IP 地址到答题框。
[root@ansible mariadb]# cat tasks/main.yml
---
# tasks file for mariadb
- copy:
src: ftp.repo
dest: /etc/yum.repos.d/
- yum:
name: mariadb-server
- service:
name: mariadb
state: started
#- shell:
# cmd: mysqladmin -uroot password 123456
- service:
name: mariadb
state: stopped
- copy:
src: server.cnf
dest: /etc/my.cnf.d/server.cnf
- shell:
cmd: setenforce 0
- shell:
cmd: /bin/galera_new_cluster
when: inventory_hostname in groups.n1
- service:
name: mariadb
state: started
when: inventory_hostname in groups.n2
- service:
name: mariadb
state: started
when: inventory_hostname in groups.n3
[root@ansible mariadb]# cat files/server.cnf
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#
# this is read by the standalone daemon and embedded servers
[server]
# this is only for the mysqld standalone daemon
[mysqld]
#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://node1,node2,node3
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
mysql -uroot -p123456
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
报错解决方法
[root@node-1 ~]# vi /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 3d68d237-c923-11ed-af75-ef8d6d86837e
seqno: -1
safe_to_bootstrap: 0
【题目 2】Ansible 服务部署:部署 ELK 集群服务
使用赛项提供的 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 地址到答题框。
【题目 3】Python 运维开发:基于 OpenStack Restful API 实现镜像上传
使用 OpenStack all-in-one 镜像,创建 OpenStack Python 运维开发环境。云主机的用户/
密码为:“root/Abc@1234”,OpenStack 的域名/账号/密码为:“demo/admin/000000”。
提示说明:python 脚本文件头建议加入“#encoding:utf-8”避免编码错误;测试脚本代
码用 python3 命令执行与测试。
在 controller 节点的/root 目录下创建 api_image_manager.py 脚本,编写 python 代码对接
OpenStack API,完成镜像的创建与上传。创建之前查询是否存在“同名镜像”,如果存在
先删除该镜像。
(1)创建镜像:要求在 OpenStack 私有云平台中上传镜像 cirros-0.3.4-x86_64-disk.img,名字为 cirros001,disk_format 为 qcow2,container_format 为 bare。
(2)查询镜像:查询 cirros001 的详细信息,并以 json 格式文本输出到控制台。
完成后提交 OpenStack Python 运维开发环境 Controller 节点的 IP 地址,用户名和密码提
交。
#获取token值
import requests
import json
import time
import argparse
try:
url = "http://192.168.1.101:5000/v3/auth/tokens"
body = {
"auth": {"identity":{"methods":["password"],"password":{
"user":{"domain":{"name":"demo"},"name":"admin","password":"000000"}}},
"scope":{"project":{"domain":{"name":"demo"},"name":"admin"}}}}
headers= {
"Content-Type":"application/json"
}
token = requests.post(url,data=json.dumps(body),headers=headers).headers['X-Subject-Token']
headers={"X-Auth-Token":token}
print(token)
except Exception as e:
print(f"debeat{str(e)}")
exit(0)
#定义class类
class create_glance:
def __init__(self,headers,url):
self.headers=headers
self.url=url
def delete_images(self,image_name):
result = json.loads(requests.get(self.url,headers=self.headers).text)
for i in result['images']:
if i['name'] == image_name:
requests.delete(f"http://192.168.1.101:9292/v2/images/{i['id']}",headers=self.headers)
def create_glance(self,image_name:str,container_format="bare",disk_format="qcow2"):
body = {
"name": image_name,
"container_format": container_format,
"disk_foramt": disk_format
}
status_code = requests.post(self.url,data=json.dumps(body),headers=self.headers)
print(status_code.json['names'])
def get_image_id(self,image_name):
result = json.loads(requests.get(self.url, headers=self.headers).text)
for i in result['images']:
if i['name'] == image_name:
return i['id']
def updata_glance(self,image_name:str,file_path=''):
self.url=self.url+"/"+self.get_image_id(image_name)+'/file'
self.headers['Content-Type'] = 'application/octet-stream'
status_code = requests.put(self.url,data=open(file_path,'rb').read(),headers=self.headers)
def show_image(self,image_name):
result = json.loads(requests.get(self.url, headers=self.headers).text)
for i in result['images']:
if i['name'] == image_name:
return i['id']
create_glance=create_glance(headers,"http://192.168.1.101:9292/v2/images")
create_glance.delete_images("giant fox")
create_glance.create_glance("giant fox")
print(create_glance.show_image("giant fox"))
create_glance.updata_glance('giant fox',file_path="./CentOS_7.5_x86_64_XD.qcow2")
【题目 4】Python 运维开发:基于 Openstack Python SDK 实现云主机创建
使 用 已 建 好 的 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 地址,用户名和密码
提交。
import json
import requests
import time
try:
url = "http://192.168.1.101:5000/v3/auth/tokens"
body = {"auth":{"identity":{"methods":["password"],"password":{
"user":{"domain":{"name":"demo"},"name":"admin","password":"000000"}}},
"scope":{"project":{"domain":{"name":"demo"},"name":"admin"}}}}
headers = {"Content-Type":"application/json"}
Token = requests.post(url,json.dumps(body),headers=headers).headers["X-Subject-Token"]
headers = {"X-Auth-Token":Token}
print(Token)
except Exception as e:
print(f"失败信息如下:{str(e)}")
exit(0)
class create_vm:
def __init__(self,headers):
self.headers=headers
def delete_vm(self):
result = requests.get("http://192.168.1.101:8774/v2.1/servers",headers=self.headers)
for i in result.json()['servers']:
if i['name'] == 'test_vm':
requests.delete(f"http://192.168.1.101:8774/v2.1/servers/{i['id']}",headers=self.headers)
def get_image_id(self):
result = requests.get("http://192.168.1.101:9292/v2/images",headers=self.headers)
for i in result.json()['images']:
if i['name'] == "giant fox":
self.image_id=i['id']
def get_network_id(self):
result = requests.get("http://192.168.1.101:9696/v2.0/networks",headers=self.headers)
for i in result.json()['networks']:
if i['name'] == 'network':
self.network_id=i['id']
def get_flavor_id(self):
result = requests.get("http://192.168.1.101:8774/v2.1/flavors",headers=self.headers)
for i in result.json()['flavors']:
if i['names'] == '4g4u100g':
self.flavor_id=i['id']
def create_vm(self):
self.delete_vm()
self.get_flavor_id()
self.get_image_id()
self.get_network_id()
data = {
"server": {
"name": "test_vm",
"imageRef": self.image_id,
"flavorRef": self.flavor_id,
"networks": [{'uuid':self.network_id}]
}
}
status_code = requests.post("http://192.168.1.101:8774/v2.1/servers",headers=self.headers,data=json.dumps(data))
print(status_code.json())
create_vm=create_vm(headers=headers)
create_vm.create_vm()
【题目 5】Python 运维开发:云主机类型管理的命令行工具开发
使用已建好的 OpenStack Python 运维开发环境,在/root 目录下创建 flavor_manager.py
脚本,完成云主机类型的管理,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 100001
评论区