侧边栏壁纸
  • 累计撰写 30 篇文章
  • 累计创建 3 个标签
  • 累计收到 4 条评论
标签搜索

目 录CONTENT

文章目录

iaas运维开发

小裴
2023-03-13 / 0 评论 / 0 点赞 / 139 阅读 / 2,569 字

【题目 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


0

评论区