2023 云计算技能大赛-私有云


【任务 1】私有云服务搭建[10 分]

【题目 1】基础环境配置[0.5 分]

使用提供的用户名密码,登录提供的 OpenStack 私有云平台,在当前租户下,使用CentOS7.9 镜像,创建两台云主机,云主机类型使用 4vCPU/12G/100G_50G 类型。当前租户下默认存在一张网卡,自行创建第二张网卡并连接至 controller 和 compute 节点(第二张网卡的网段为 10.10.X.0/24,X 为工位号,不需要创建路由)。自行检查安全组策略,以确保网络正常通信与 ssh 连接,然后按以下要求配置服务器:
(1)设置控制节点主机名为 controller,设置计算节点主机名为 compute;
(2)修改hosts 文件将 IP 地址映射为主机名;
完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# hostnamectl set-hostname controller
[root@compute ~]# hostnamectl set-hostname compute

[root@controller ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 controller
192.168.100.20 compute
[root@controller ~]#

1.查看控制节点名字为 controller 正确计 0.2 分
2.查看 hosts 文件中有正确的主机名和 IP 映射计 0.2 分
3.控制节点正确使用两块网卡计 0.1 分

【题目 2】Yum 源配置[0.5 分]

使用提供的 http 服务地址,在 http 服务下,存在 centos7.9 和 iaas 的网络 yum 源,使用该 http 源作为安装 iaas 平台的网络源。分别设置 controller 节点和 compute 节点的 yum 源文件 http.repo。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# cat /etc/yum.repos.d/local.repo
[centos]
name=centos
baseurl=file:///opt/centos  #比赛使用的是http远程yum源
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=file:///opt/iaas/iaas-repo
gpgcheck=0
enabled=1
[root@controller ~]#

1.查看/etc/yum.repos.d/http.repo 文件,有正确的 baseurl 路径,计 0.5 分

【题目 3】配置无秘钥 ssh[0.5 分]

配置 controller 节点可以无秘钥访问 compute 节点,配置完成后,尝试 ssh 连接 compute
节点的 hostname 进行测试。完成后提交 controller 节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# ssh compute
Last login: Sun Sep 20 23:40:30 2022 from 192.168.100.1
 ################################
 #    Welcome  to  OpenStack    #
 ################################
[root@compute ~]# ssh controller
Last login: Sun Sep 20 23:39:59 2022 from 192.168.100.1
 ################################
 #    Welcome  to  OpenStack    #
 ################################
[root@controller ~]#

1.查看控制节点允许计算节点无秘钥登录计 0.5 分

【题目 4】基础安装[0.5 分]
在控制节点和计算节点上分别安装 openstack-iaas 软件包,根据表 2 配置两个节点脚本文件中的基本变量(配置脚本文件为/etc/openstack/openrc.sh)。

[root@controller ~]# yum install -y openstack-iaas
Loaded plugins: fastestmirror
Determining fastest mirrors
centos                                                                                           | 3.6 kB  00:00:00
iaas                                                                                             | 2.9 kB  00:00:00
Package openstack-iaas-2.0.1-2.noarch already installed and latest version
Nothing to do
[root@controller ~]# sed -i 's/^.//'g /etc/openstack/openrc.sh
#去点第一行的注释符
[root@controller ~]# sed -i 's/PASS=/PASS=000000/'g /etc/openstack/openrc.sh
#替换PASS=为PASS=000000
[root@controller ~]# cat /etc/openstack/openrc.sh
#--------------------system Config--------------------##
#Controller Server Manager IP. example:x.x.x.x
HOST_IP=192.168.100.10

#Controller HOST Password. example:000000
HOST_PASS=000000

#Controller Server hostname. example:controller
HOST_NAME=controller

#Compute Node Manager IP. example:x.x.x.x
HOST_IP_NODE=192.168.100.20

#Compute HOST Password. example:000000
HOST_PASS_NODE=000000

#Compute Node hostname. example:compute
HOST_NAME_NODE=compute

#--------------------Chrony Config-------------------##
#Controller network segment IP.  example:x.x.0.0/16(x.x.x.0/24)
network_segment_IP=192.168.100.0/24

#--------------------Rabbit Config ------------------##
#user for rabbit. example:openstack
RABBIT_USER=openstack

#Password for rabbit user .example:000000
RABBIT_PASS=000000

#--------------------MySQL Config---------------------##
#Password for MySQL root user . exmaple:000000
DB_PASS=000000

#--------------------Keystone Config------------------##
#Password for Keystore admin user. exmaple:000000
DOMAIN_NAME=default
ADMIN_PASS=000000
DEMO_PASS=000000

#Password for Mysql keystore user. exmaple:000000
KEYSTONE_DBPASS=000000

#--------------------Glance Config--------------------##
#Password for Mysql glance user. exmaple:000000
GLANCE_DBPASS=000000

#Password for Keystore glance user. exmaple:000000
GLANCE_PASS=000000

#--------------------Placement Config----------------------##
#Password for Mysql placement user. exmaple:000000
PLACEMENT_DBPASS=000000

#Password for Keystore placement user. exmaple:000000
PLACEMENT_PASS=000000

#--------------------Nova Config----------------------##
#Password for Mysql nova user. exmaple:000000
NOVA_DBPASS=000000

#Password for Keystore nova user. exmaple:000000
NOVA_PASS=000000

#--------------------Neutron Config-------------------##
#Password for Mysql neutron user. exmaple:000000
NEUTRON_DBPASS=000000

#Password for Keystore neutron user. exmaple:000000
NEUTRON_PASS=000000

#metadata secret for neutron. exmaple:000000
METADATA_SECRET=000000

#External Network Interface. example:eth1
INTERFACE_NAME=ens37

#External Network The Physical Adapter. example:provider
Physical_NAME=provider

#First Vlan ID in VLAN RANGE for VLAN Network. exmaple:101
minvlan=1

#Last Vlan ID in VLAN RANGE for VLAN Network. example:200
maxvlan=1000

#--------------------Cinder Config--------------------##
#Password for Mysql cinder user. exmaple:000000
CINDER_DBPASS=000000

#Password for Keystore cinder user. exmaple:000000
CINDER_PASS=000000

#Cinder Block Disk. example:md126p3
BLOCK_DISK=sdb1

#--------------------Swift Config---------------------##
#Password for Keystore swift user. exmaple:000000
SWIFT_PASS=000000

#The NODE Object Disk for Swift. example:md126p4.
OBJECT_DISK=sdb2

#The NODE IP for Swift Storage Network. example:x.x.x.x.
STORAGE_LOCAL_NET_IP=192.168.100.20

#--------------------Trove Config----------------------##
#Password for Mysql trove user. exmaple:000000
TROVE_DBPASS=000000

#Password for Keystore trove user. exmaple:000000
TROVE_PASS=000000

#--------------------Heat Config----------------------##
#Password for Mysql heat user. exmaple:000000
HEAT_DBPASS=000000

#Password for Keystore heat user. exmaple:000000
HEAT_PASS=000000

#--------------------Ceilometer Config----------------##
#Password for Gnocchi ceilometer user. exmaple:000000
CEILOMETER_DBPASS=000000

#Password for Keystore ceilometer user. exmaple:000000
CEILOMETER_PASS=000000

#--------------------AODH Config----------------##
#Password for Mysql AODH user. exmaple:000000
AODH_DBPASS=000000

#Password for Keystore AODH user. exmaple:000000
AODH_PASS=000000

#--------------------ZUN Config----------------##
#Password for Mysql ZUN user. exmaple:000000
ZUN_DBPASS=000000

#Password for Keystore ZUN user. exmaple:000000
ZUN_PASS=000000

#Password for Keystore KURYR user. exmaple:000000
KURYR_PASS=000000

#--------------------OCTAVIA Config----------------##
#Password for Mysql OCTAVIA user. exmaple:000000
OCTAVIA_DBPASS=000000

#Password for Keystore OCTAVIA user. exmaple:000000
OCTAVIA_PASS=000000

#--------------------Manila Config----------------##
#Password for Mysql Manila user. exmaple:000000
MANILA_DBPASS=000000

#Password for Keystore Manila user. exmaple:000000
MANILA_PASS=000000

#The NODE Object Disk for Manila. example:md126p5.
SHARE_DISK=sdb3

#--------------------Cloudkitty Config----------------##
#Password for Mysql Cloudkitty user. exmaple:000000
CLOUDKITTY_DBPASS=000000

#Password for Keystore Cloudkitty user. exmaple:000000
CLOUDKITTY_PASS=000000

#--------------------Barbican Config----------------##
#Password for Mysql Barbican user. exmaple:000000
BARBICAN_DBPASS=000000

#Password for Keystore Barbican user. exmaple:000000
BARBICAN_PASS=000000
###############################################################
#####在vi编辑器中执行:%s/^.\{1\}//  删除每行前1个字符(#号)#####
###############################################################
[root@controller ~]#
[root@controller ~]# scp /etc/openstack/openrc.sh compute:/etc/openstack/

#传输完毕后,设置磁盘分区,分出三块!!!对应的磁盘名称写入环境变量中

1.检查环境变量文件配置正确计 0.5 分

【题目 5】数据库安装与调优[0.5 分]

在 controller 节点上使用 iaas-install-mysql.sh 脚本安装 Mariadb、Memcached、RabbitMQ
等服务。安装服务完毕后,修改/etc/my.cnf 文件,完成下列要求:

1.设置数据库支持大小写;
2.设置数据库缓存 innodb 表的索引,数据,插入数据时的缓冲为 4G;

3.设置数据库的 log buffer 为 64MB;
4.设置数据库的 redo log 大小为 256MB;
5.设置数据库的 redo log 文件组为 2。
完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-pre-host.sh
[root@compute ~]# iaas-pre-host.sh
#执行完这一步,一定要重新连接,刷新一下,不然rabbitmq服务会报错

[root@compute ~]# iaas-install-mysql.sh

[root@controller ~]# cat /etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# This group is read by the server
#
[mysqld]
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
max_connections=10000

innodb_log_buffer_size = 4M
#此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间

innodb_log_file_size = 32M
#此参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间

innodb_log_files_in_group = 3
#为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3

#1,数据库不区分大小写,其中 0:区分大小写,1:不区分大小写
lower_case_table_names = 1

#2,设置innodb的数据缓冲为4G
innodb_buffer_pool_size = 4G

#3,传输数据包的大小值
max_allowed_packet = 30M


#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[root@controller ~]#

1.检查数据库配置正确计 0.5 分

【题目 6】Keystone 服务安装与使用[0.5 分]

在 controller 节点上使用 iaas-install-keystone.sh 脚本安装 Keystone 服务。安装完成后, 使用相关命令,创建用户 chinaskill,密码为 000000。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-keystone.sh
[root@controller ~]# source /etc/keystone/admin-openrc.sh
[root@controller ~]# openstack user create --domain huhy --password 000000 chinaskill
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | b11e543ea3567ef79cd7a99a34ea156a |
| enabled             | True                             |
| id                  | 8bd1afe33aa34e24aeb9f3d4ea15aa75 |
| name                | chinaskill                       |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
[root@controller ~]#
#注意我的域名是自定义的,正常应该是demo

1.检查keystone 服务安装正确计 0.2 分
2.检查chinaskill 用户创建正确计 0.3 分

【题目 7】Glance 安装与使用[0.5 分]

在 controller 节点上使用 iaas-install-glance.sh 脚本安装 glance 服务。使用命令将提供的 cirros-0.3.4-x86_64-disk.img 镜像(该镜像在 HTTP 服务中,可自行下载)上传至平台, 命名为 cirros,并设置最小启动需要的硬盘为 10G,最小启动需要的内存为 1G。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller images]# iaas-install-glance.sh
[root@controller images]# ls
amphora-x64-haproxy.qcow2  CentOS-7-x86_64-2009.qcow2    MySQL_5.6_XD.qcow2
CentOS7_1804.tar           cirros-0.3.4-x86_64-disk.img
[root@controller images]# openstack image create --disk-format qcow2 --container-format bare --min-disk 10 --min-ram 1024 --file ./cirros-0.3.4-x86_64-disk.img cirros
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                                                                      |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| checksum         | ee1eca47dc88f4879d8a229cc70a07c6                                                                                                                                                           |
| container_format | bare                                                                                                                                                                                       |
| created_at       | 2022-09-19T02:51:10Z                                                                                                                                                                       |
| disk_format      | qcow2                                                                                                                                                                                      |
| file             | /v2/images/47adc4fe-6bd9-4728-809f-c868d433f2d7/file                                                                                                                                       |
| id               | 47adc4fe-6bd9-4728-809f-c868d433f2d7                                                                                                                                                       |
| min_disk         | 10                                                                                                                                                                                         |
| min_ram          | 1024                                                                                                                                                                                       |
| name             | cirros                                                                                                                                                                                     |
| owner            | 5ef6dd81e4164f8d89e41d5537b148f9
                                                                                        |
| properties       | os_hash_algo='sha512', os_hash_value='1b03ca1bc3fafe448b90583c12f367949f8b0e665685979d95b004e48574b953316799e23240f4f739d1b5eb4c4ca24d38fdc6f4f9d8247a2bc64db25d6bbdb2', os_hidden='False' |
| protected        | False
                                                                                        |
| schema           | /v2/schemas/image
                                                                                        |
| size             | 13287936
                                                                                        |
| status           | active
                                                                                        |
| tags             |
                                                                                        |
| updated_at       | 2022-09-19T02:51:11Z
                                                                                        |
| virtual_size     | None
                                                                                        |
| visibility       | shared
                                                                                        |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
[root@controller images]#

1.检查glance 服务安装正确计 0.1 分
2.检查cirros 镜像最小启动硬盘与内存配置正确计 0.4 分

【题目 8】Nova 安装与优化[0.5 分]

在 controller 节点和 compute 节点上分别使用 iaas-install-placement.sh 脚本、iaas-install-nova -controller.sh 脚本、iaas-install-nova-compute.sh 脚本安装Nova 服务。安装完成后,请修改 nova 相关配置文件,解决因等待时间过长而导致虚拟机启动超时从而获取不到 IP 地址而报

[root@controller ~]# iaas-install-placement.sh
[root@controller ~]# iaas-install-nova-controller.sh
[root@controller ~]# vim /etc/nova/nova.conf

#vif_plugging_is_fatal=true

改为

vif_plugging_is_fatal=false

1.检查nova 服务解决超时问题配置正确计 0.5 分

【题目 9】Neutron 安装[0.5 分]

使用提供的脚本 iaas-install-neutron-controller.sh 和 iaas-install-neutron-compute.sh,在controller 和 compute 节点上安装 neutron 服务。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-neutron-controller.sh

1.检查neutron 服务安装正确计 0.2 分
2.检查neutron 服务的 linuxbridge 网桥服务启动正确计 0.3 分

【题目 10】Dashboard 安装[0.5 分]

在controller 节点上使用iaas-install-dashboad.sh 脚本安装dashboad服务。安装完成后, 将 Dashboard 中的 Djingo 数据修改为存储在文件中(此种修改解决了 ALL-in-one 快照在其他云平台 Dashboard 不能访问的问题)。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-dashboard.sh
[root@controller ~]# vim /etc/openstack-dashboard/local_settings

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

改为

SESSION_ENGINE = 'django.contrib.sessions.backends.file'

1.检查Dashboard 服务安装正确计 0.2 分
2.检查Dashboard 服务中Djingo 数据修改为存储在文件中配置正确计 0.3 分

【题目 11】Swift 安装[0.5 分]

在 控 制 节 点 和 计 算 节 点 上 分 别 使 用 iaas-install-swift-controller.sh 和iaas-install-swift-compute.sh 脚本安装 Swift 服务。安装完成后,使用命令创建一个名叫examcontainer 的容器,将 cirros-0.3.4-x86_64-disk.img 镜像上传到 examcontainer 容器中,并设置分段存放,每一段大小为 10M。完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-swift-controller.sh
[root@compute ~]# iaas-install-swift-compute.sh

[root@controller ~]# ls
anaconda-ks.cfg  cirros-0.3.4-x86_64-disk.img  logininfo.txt
[root@controller ~]# swift post examcontainers
[root@controller ~]# swift upload examcontaiers -S 10000000 cirros-0.3.4-x86_64-disk.img
cirros-0.3.4-x86_64-disk.img segment 1
cirros-0.3.4-x86_64-disk.img segment 0
cirros-0.3.4-x86_64-disk.img
[root@controller ~]# du -sh cirros-0.3.4-x86_64-disk.img
13M     cirros-0.3.4-x86_64-disk.img
[root@controller ~]#

#因为镜像就13M,所有存储为两段

1.检查 swift 服务安装正确计 0.3 分
2.分段上传cirros 镜像正确计 0.2 分

【题目 12】Cinder 创建硬盘[0.5 分]

在 控 制 节 点 和 计 算 节 点 分 别 使 用 iaas-install-cinder-controller.sh 、iaas-install-cinder-compute.sh 脚本安装Cinder 服务,请在计算节点,对块存储进行扩容操作, 即在计算节点再分出一个 5G 的分区,加入到 cinder 块存储的后端存储中去。完成后提交计算节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-cinder-controller.sh
[root@compute ~]# iaas-install-cinder-compute.sh

[root@compute ~]# lsblk
NAME                                            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                                               8:0    0  200G  0 disk
├─sda1                                            8:1    0    1G  0 part /boot
└─sda2                                            8:2    0   19G  0 part
  ├─centos-root                                 253:0    0   17G  0 lvm  /
  └─centos-swap                                 253:1    0    2G  0 lvm  [SWAP]
sdb                                               8:16   0   50G  0 disk
├─sdb1                                            8:17   0   10G  0 part
│ ├─cinder--volumes-cinder--volumes--pool_tmeta 253:2    0   12M  0 lvm
│ │ └─cinder--volumes-cinder--volumes--pool     253:4    0  9.5G  0 lvm
│ └─cinder--volumes-cinder--volumes--pool_tdata 253:3    0  9.5G  0 lvm
│   └─cinder--volumes-cinder--volumes--pool     253:4    0  9.5G  0 lvm
├─sdb2                                            8:18   0   10G  0 part /swift/node/sdb2
├─sdb3                                            8:19   0   10G  0 part
└─sdb4                                            8:20   0    5G  0 part
sr0                                              11:0    1  4.4G  0 rom
[root@compute ~]#
[root@compute ~]# vgdisplay
  --- Volume group ---
  VG Name               cinder-volumes
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <10.00 GiB
  PE Size               4.00 MiB
  Total PE              2559
  Alloc PE / Size       2438 / 9.52 GiB
  Free  PE / Size       121 / 484.00 MiB
  VG UUID               3k0yKg-iQB2-b2CM-a0z2-2ddJ-cdG3-8WpyrG

  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               acAXNK-eqKm-qs9b-ly3T-R3Sh-8qyv-nELNWv
  [root@compute ~]# vgextend cinder-volumes /dev/sdb4
  Volume group "cinder-volumes" successfully extended
[root@compute ~]# vgdisplay
  --- Volume group ---
  VG Name               cinder-volumes
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               14.99 GiB
  PE Size               4.00 MiB
  Total PE              3838
  Alloc PE / Size       2438 / 9.52 GiB
  Free  PE / Size       1400 / <5.47 GiB
  VG UUID               3k0yKg-iQB2-b2CM-a0z2-2ddJ-cdG3-8WpyrG

  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               acAXNK-eqKm-qs9b-ly3T-R3Sh-8qyv-nELNWv

[root@compute ~]#

1.检查cinder 后端存储扩容成功计 0.5 分

【题目 13】Manila 服务安装与使用[0.5 分]

在 控 制 和 计 算 节 点 上 分 别 使 用 iaas-install-manila-controller.sh 和iaas-install-manila-compute.sh 脚本安装 manila 服务。安装服务后创建 default_share_type 共享类型(不使用驱动程序支持),接着创建一个大小为 2G 的共享存储名为 share01 并开放share01 目录对 OpenStack 管理网段使用权限。最后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-manila-controller.sh
[root@compute ~]# iaas-install-manila-compute.sh

[root@controller ~]# manila type-create default_share_type False
+----------------------+--------------------------------------+
| Property             | Value                                |
+----------------------+--------------------------------------+
| required_extra_specs | driver_handles_share_servers : False |
| Name                 | default_share_type                   |
| Visibility           | public                               |
| is_default           | YES                                  |
| ID                   | 36dddd7a-6c51-4320-9f8e-d99dcb71fcdd |
| optional_extra_specs |                                      |
| Description          | None                                 |
+----------------------+--------------------------------------+
[root@controller ~]# manila type-list
+--------------------------------------+--------------------+------------+------------+--------------------------------------+----------------------+-------------+
| ID                                   | Name               | visibility | is_default | required_extra_specs
     | optional_extra_specs | Description |
+--------------------------------------+--------------------+------------+------------+--------------------------------------+----------------------+-------------+
| 36dddd7a-6c51-4320-9f8e-d99dcb71fcdd | default_share_type | public     | YES        | driver_handles_share_servers : False |                      | None        |
+--------------------------------------+--------------------+------------+------------+--------------------------------------+----------------------+-------------+
[root@controller ~]# manila create NFS 2 --name share-test
+---------------------------------------+--------------------------------------+
| Property                              | Value                                |
+---------------------------------------+--------------------------------------+
| status                                | creating                             |
| share_type_name                       | default_share_type                   |
| description                           | None                                 |
| availability_zone                     | None                                 |
| share_network_id                      | None                                 |
| share_server_id                       | None                                 |
| share_group_id                        | None                                 |
| host                                  |                                      |
| revert_to_snapshot_support            | False                                |
| access_rules_status                   | active                               |
| snapshot_id                           | None                                 |
| create_share_from_snapshot_support    | False                                |
| is_public                             | False                                |
| task_state                            | None                                 |
| snapshot_support                      | False                                |
| id                                    | 01b7551c-ac6f-4815-9ade-34dd50d5c489 |
| size                                  | 2                                    |
| source_share_group_snapshot_member_id | None                                 |
| user_id                               | 65355acf2f4e4e8e8e29fd08d7290750     |
| name                                  | share-test                           |
| share_type                            | 36dddd7a-6c51-4320-9f8e-d99dcb71fcdd |
| has_replicas                          | False                                |
| replication_type                      | None                                 |
| created_at                            | 2022-09-19T06:50:18.000000           |
| share_proto                           | NFS                                  |
| mount_snapshot_support                | False                                |
| project_id                            | 1b29cb9baa394a0eb3d531913dc9ccec     |
| metadata                              | {}                                   |
+---------------------------------------+--------------------------------------+
[root@controller ~]# manila list
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
| ID                                   | Name       | Size | Share Proto | Status    | Is Public | Share Type Name    | Host                        | Availability Zone |
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
| 01b7551c-ac6f-4815-9ade-34dd50d5c489 | share-test | 2    | NFS         | available | False     | default_share_type | compute@lvm#lvm-single-pool | nova              |
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
[root@controller ~]# manila access-allow share-test ip 192.168.100.0/24 --access-level rw
+--------------+--------------------------------------+
| Property     | Value                                |
+--------------+--------------------------------------+
| access_key   | None                                 |
| share_id     | 01b7551c-ac6f-4815-9ade-34dd50d5c489 |
| created_at   | 2022-09-19T06:51:47.000000           |
| updated_at   | None                                 |
| access_type  | ip                                   |
| access_to    | 192.168.100.0/24                     |
| access_level | rw                                   |
| state        | queued_to_apply                      |
| id           | a5fe5b74-e571-405a-a2cb-bda449ed1f53 |
| metadata     | {}                                   |
+--------------+--------------------------------------+
[root@controller ~]#
[root@controller ~]# manila access-list share-test
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+
| id                                   | access_type | access_to        | access_level | state  | access_key | created_at                 | updated_at |
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+
| a5fe5b74-e571-405a-a2cb-bda449ed1f53 | ip          | 192.168.100.0/24 | rw           | active | None       | 2022-09-19T06:51:47.000000 | None       |
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+

#查看share-test共享文件目录的访问路径,选做,到此任务已经结束
[root@controller ~]# manila show share-test | grep path | cut -d'|' -f3
 path = 192.168.100.20:/var/lib/manila/mnt/share-8648e34b-a68b-4710-97fe-4e85515c444e
[root@controller ~]# mount -t nfs 192.168.100.20:/var/lib/manila/mnt/share-8648e34b-a68b-4710-97fe-4e85515c444e /mnt/
[root@compute ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G  4.0K  1.9G   1% /dev/shm
tmpfs                    1.9G   12M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  4.8G   13G  29% /
/dev/sda1               1014M  152M  863M  15% /boot
tmpfs                    378M     0  378M   0% /run/user/0
/dev/sdb2                 10G   59M   10G   1% /swift/node/sdb2
/dev/dm-5                2.0G  6.0M  1.8G   1% /var/lib/manila/mnt/share-8648e34b-a68b-4710-97fe-4e85515c444e
[root@compute ~]#

1.检查 share01 共享存储正确创建并赋予权限计 0.5 分

【题目 14】Barbican 服务安装与使用[0.5 分]

使用 iaas-install-barbican.sh 脚本安装 barbican 服务,安装服务完毕后,使用 openstack 命令创建一个名为 secret01 的密钥,创建完成后提交控制节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# iaas-install-barbican.sh
[root@controller ~]# openstack secret store --name secret01 --payload secretkey
+---------------+-----------------------------------------------------------------------+
| Field         | Value                                                                 |
+---------------+-----------------------------------------------------------------------+
| Secret href   | http://localhost:9311/v1/secrets/0c75b604-1cae-4172-b632-b769f1d649e3 |
| Name          | secret01                                                              |
| Created       | None                                                                  |
| Status        | None                                                                  |
| Content types | None                                                                  |
| Algorithm     | aes                                                                   |
| Bit length    | 256                                                                   |
| Secret type   | opaque                                                                |
| Mode          | cbc                                                                   |
| Expiration    | None                                                                  |
+---------------+-----------------------------------------------------------------------+

1.检查 secret01 密钥创建正确计 0.5 分

【题目 15】Cloudkitty 服务安装与使用[1 分]

使用 iaas-install-cloudkitty.sh 脚本安装cloudkitty 服务,安装完毕后,启用 hashmap 评级模块,接着创建 volume_thresholds 组,创建服务匹配规则 volume.size,并设置每 GB 的价格为 0.01。接下来对应大量数据设置应用折扣,在组 volume_thresholds 中创建阈值,设置若超过 50GB 的阈值,应用 2%的折扣(0.98)。设置完成后提交控制节点的用户名、密码和 IP 地址到答题框。

#0.启用hashmap
[root@controller ~]# openstack rating module enable hashmap 

#1.创建hashmap service
[root@controller ~]# openstack rating  hashmap service create volume.size 
+--------+--------------------------------------+
| Name   | Service ID                           |
+--------+--------------------------------------+
| volume.size | 09da4a8b-b849-4715-a8e3-7cd12dfcf46e |
+--------+--------------------------------------+

#2.创建hashmap service group
[root@controller ~]# openstack rating hashmap group create  volume_thresholds 
openstack rating hashmap group create  volume_thresholds 
+-------------------+--------------------------------------+
| Name              | Group ID                             |
+-------------------+--------------------------------------+
| volume_thresholds | 8b3dfe73-5efb-46ab-a93b-dc9519063ed6 |
+-------------------+--------------------------------------+

#3.创建volume单价
[root@controller ~]# openstack rating hashmap mapping create   -s  09da4a8b-b849-4715-a8e3-7cd12dfcf46e -g 8b3dfe73-5efb-46ab-a93b-dc9519063ed6  -t flat  0.01  

#4.创建service rule
[root@controller ~]# openstack rating hashmap threshold create   -s  09da4a8b-b849-4715-a8e3-7cd12dfcf46e -g 8b3dfe73-5efb-46ab-a93b-dc9519063ed6  -t rate 50 0.98

1.检查hashmap 评级模块启用成功计 0.2 分
2.检查服务匹配规则volume.size 创建成功 0.8 分

【题目 16】OpenStack 平台内存优化[0.5 分]

搭建完 OpenStack 平台后,关闭系统的内存共享,打开透明大页。完成后提交控制节点
的用户名、密码和 IP 地址到答题框。

[root@controller ~]# find / -name defrag
/sys/kernel/mm/transparent_hugepage/defrag
/sys/kernel/mm/transparent_hugepage/khugepaged/defrag
[root@controller ~]# echo never > /sys/kernel/mm/transparent_hugepage/defr
ag 
[root@controller ~]# cat /sys/kernel/mm/transparent_hugepage/defrag 
always madvise [never]
[root@controller ~]# 

1.检查系统内存优化成功计 0.5 分

【题目 17】修改文件句柄数[0.5 分]

Linux 服务器大并发时,往往需要预先调优 Linux 参数。默认情况下,Linux 最大文件句柄数为 1024 个。当你的服务器在大并发达到极限时,就会报出“too many open files”。创建一台云主机,修改相关配置,将控制节点的最大文件句柄数永久修改为 65535。配置完成后提交 controller 点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# ulimit -n
1024
[root@controller ~]#  echo "* soft nofile 65535" >> /etc/security/limits.conf
[root@controller ~]#  echo "* hard nofile 65535" >> /etc/security/limits.conf

*       #代表所有用户
soft    #超过文件句柄数时,仅提示
hard    #超过文件句柄数时,直接限制
Last login: Thu May  5 19:26:47 2022 from 10.60.2.201


 #########################
 #  Welcome to XianDian  #
 #########################


[root@controller ~]# ulimit -n
65535
[root@controller ~]# 

1.检查配置 linux 系统句柄数为 65535 成功计 0.5 分

【题目 18】Linux 系统调优-防止SYN 攻击[1 分]

修改 controller 节点的相关配置文件,开启 SYN cookie,防止 SYN 洪水攻击。完成后提交 controller 节点的用户名、密码和 IP 地址到答题框。

[root@container ~]# vim /etc/sysctl.conf

#添加以下参数
net.ipv4.tcp_max_syn_backlog=2048

net.ipv4.tcp_syncookies=1

net.ipv4.tcp_syn_retries = 0

[root@container ~]# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_syncookies = 1
sysctl: setting key "net.ipv4.tcp_syn_retries": Invalid argument
net.ipv4.tcp_syn_retries = 0
[root@container ~]#

1.检查开启SYN cookie 配置计 1 分

【任务 2】私有云服务运维[15 分]

【题目 1】OpenStack 开放镜像权限[0.5 分]

使用 OpenStack 私 有 云 平 台 , 在 OpenStack 平台的 admin 项 目 中 使 用cirros-0.3.4-x86_64-disk.img 镜像文件创建名为glance-cirros 的镜像,通过OpenStack 命令将glance-cirros 镜像指定 demo 项目进行共享使用。配置完成后提交controller 点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# openstack image create --disk-format qcow2 --container-format bare --file cirros-0.3.4-x86_64-disk.img glance-cirros
9+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                                                                      |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| checksum         | ee1eca47dc88f4879d8a229cc70a07c6                                                                                                                                                           |
| container_format | bare                                                                                                                                                                                       |
| created_at       | 2022-09-19T07:02:51Z                                                                                                                                                                       |
| disk_format      | qcow2                                                                                                                                                                                      |
| file             | /v2/images/3bac7fd7-bc66-4586-9872-3cbea90da5d2/file                                                                                                                                       |
| id               | 3bac7fd7-bc66-4586-9872-3cbea90da5d2                                                                                                                                                       |
| min_disk         | 0

    |
| min_ram          | 0

    |
| name             | glance-cirros

    |
| owner            | 1b29cb9baa394a0eb3d531913dc9ccec

    |
| properties       | os_hash_algo='sha512', os_hash_value='1b03ca1bc3fafe448b90583c12f367949f8b0e665685979d95b004e48574b953316799e23240f4f739d1b5eb4c4ca24d38fdc6f4f9d8247a2bc64db25d6bbdb2', os_hidden='False' |
| protected        | False

    |
| schema           | /v2/schemas/image

    |
| size             | 13287936

    |
| status           | active

    |
| tags             |

    |
| updated_at       | 2022-09-19T07:02:53Z

    |
| virtual_size     | None

    |
| visibility       | shared

    |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
[root@controller ~]#
[root@controller ~]# openstack domain list
+----------------------------------+---------+---------+--------------------+
| ID                               | Name    | Enabled | Description        |
+----------------------------------+---------+---------+--------------------+
| 7fc907bd4a6e471aa6d714ff66646d2a | huhy    | True    | Default Domain     |
| default                          | Default | True    | The default domain |
+----------------------------------+---------+---------+--------------------+
[root@controller ~]#
[root@controller ~]# glance member-create 3bac7fd7-bc66-4586-9872-3cbea90da5d2 7fc907bd4a6e471aa6d714ff66646d2a
# 镜像id 域名id
+--------------------------------------+----------------------------------+---------+
| Image ID                             | Member ID                        | Status  |
+--------------------------------------+----------------------------------+---------+
| 3bac7fd7-bc66-4586-9872-3cbea90da5d2 | 7fc907bd4a6e471aa6d714ff66646d2a | pending |
+--------------------------------------+----------------------------------+---------+
[root@controller ~]#
[root@controller ~]# glance member-update 3bac7fd7-bc66-4586-9872-3cbea90da5d2 7fc907bd4a6e471aa6d714ff66646d2a accepted                                                                                    +--------------------------------------+----------------------------------+----------+
| Image ID                             | Member ID                        | Status   |
+--------------------------------------+----------------------------------+----------+
| 3bac7fd7-bc66-4586-9872-3cbea90da5d2 | 7fc907bd4a6e471aa6d714ff66646d2a | accepted |
+--------------------------------------+----------------------------------+----------+
[root@controller ~]#

1.检查glance-cirros 镜像权限开放正确计 0.5 分

【题目 2】OpenStack 消息队列调优[0.5 分]

OpenStack 各服务内部通信都是通过 RPC 来交互,各 agent 都需要去连接 RabbitMQ; 随着各服务 agent 增多,MQ 的连接数会随之增多,最终可能会到达上限,成为瓶颈。使用自行搭建的OpenStack 私有云平台,分别通过用户级别、系统级别、配置文件来设置RabbitMQ 服务的最大连接数为 10240,配置完成后提交修改节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# vi /etc/sysctl.conf
fs.file-max=10240
#在sysctl.conf文件的最下方添加一行fs.file-max=10240
[root@controller ~]# sysctl -p
fs.file-max = 10240

[root@controller ~]# vi /etc/security/limits.conf
openstack soft     nofile  10240
openstack hard     nofile  10240
#在配置文件的最后添加两行内容如上,修改完之后,保存退出

[root@controller ~]# vi /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
Status of node rabbit@controller
[{pid,4561},
 {running_applications,
 ..........
 {file_descriptors,
     [{total_limit,10140},   #已经有100个连接数,可以看到当前的RabbitMQ已被修改
      {total_used,77},
      {sockets_limit,9124},
      {sockets_used,75}]},
 {processes,[{limit,1048576},{used,1150}]},
 {run_queue,0},
 {uptime,40},
 {kernel,{net_ticktime,60}}]

1.检查 rabbitmq 服务最大连接数正确计 0.5 分

【题目 3】OpenStack Glance 镜像压缩[0.5 分]

使用自行搭建的 OpenStack 平台。在 HTTP 服务中存在一个镜像为CentOS7.5-compress.qcow2 的镜像,请使用 qemu 相关命令,对该镜像进行压缩,压缩后的镜像命名为chinaskill-js-compress.qcow2 并存放在/root 目录下。完成后提交 controller 点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# du -sh CentOS7.5-compress.qcow2
892M CentOS7.5-compress.qcow2
[root@controller ~]# qemu-img convert -c -O qcow2 CentOS7.5-compress.qcow2 CentOS7.5-compress2.qcow2

-c 压缩
-O qcow2 输出格式为 qcow2
CentOS7.5-compress.qcow2   被压缩的文件
CentOS7.5-compress2.qcow2 压缩完成后文件

[root@controller ~]# du -sh CentOS7.5-compress2.qcow2
405M CentOS7.5-compress2.qcow2

1.检查镜像压缩正确计 0.5 分

【题目 4】glance 对接 cinder 后端存储[0.5 分]

在自行搭建的OpenStack 平台中修改相关参数,使glance 可以使用cinder 作为后端存储, 将镜像存储于cinder 卷中。使用 cirros-0.3.4-x86_64-disk.img 文件创建 cirros-image 镜像存储于 cirros-cinder 卷中,通过 cirros-image 镜像使用 cinder 卷启动盘的方式进行创建虚拟机。完成后提交修改节点的用户名、密码和 IP 地址到答题框。

[root@controller ~]# vi /etc/glance/glance-api.conf

#show_multiple_locations = false

改为
show_multiple_locations = true


[root@controller ~]# systemctl restart openstack-glance-*
[root@controller ~]# vi /etc/cinder/cinder.conf

#allowed_direct_url_schemes =
改为
allowed_direct_url_schemes =cinder

#image_upload_use_internal_tenant = false
改为
image_upload_use_internal_tenant = true
#最后重启cinder
[root@controller ~]# systemctl restart openstack-cinderack-cinder-scheduler.service httpd

代码不全,还差一些操作,只有一半的分

1.检查修改glance 后端存储为 cinder 正确计 0.5 分

【题目 5】OpenStack Heat 运维:创建容器[0.5 分]

在自行搭建的 OpenStack 私 有 云 平 台 上 , 在 /root 目录下编写 Heat 模板create_container.yaml,要求执行 yaml 文件可以创建名为 heat-swift 的容器。完成后提交控制节点的用户名、密码和 IP 地址到答题框。(在提交信息前请准备好 yaml 模板执行的环境)

[root@controller ~]# vim create_container.yaml

heat_template_version: 2014-10-16
resources:
  user:
    type: OS::Container::Swift
    properties:
      name: heat-swift

#此类题目,在dashboard界面上都有模板可以查询

1.执行heat 模板文件成功创建容器计 0.5 分

【题目 6】OpenStack Nova 清除缓存[0.5 分]

在 OpenStack 平台的一台计算节点创建虚拟机,若是第一次在该节点创建次虚拟机,会先将镜像文件复制到该计算节点目录/var/lib/nova/instances/_base。长期下来,该目录会占用比较大的磁盘空间而要清理。可以通过修改 nova 的配置文件来自动清理该缓存目录,即在该节点没有使用某镜像启动的云主机,那么这个镜像在过一定的时间后会被自动删除。配置完成后提交改动节点的用户名、密码和 IP 地址到答题框。

此题默认配置文件是是正确的,直接提交即可得分

1.检查nova 配置自动清理缓存文件正确计 0.5 分

【题目 7】Redis 一主二从三哨兵模式[1 分]

使用提供的 OpenStack 私有云平台,申请三台 CentOS7.9 系统的云主机,使用提供的http 源,在三个节点自行安装 Redis 服务并启动,配置 Redis 的访问需要密码,密码设置为123456。然后将这三个 Redis 节点配置为 Redis 的一主二从三哨兵架构,即一个 Redis 主节点,两个从节点,三个节点均为哨兵节点。配置完成后提交Redis 主节点的用户名、密码和IP 地址到答题框。

(1)环境配置

主机 系统 IP 安装包
Master CentOS7.9 192.168.154.19 redis-5.0.7.tar.gz
Slave1 CentOS7.9 192.168.154.20 redis-5.0.7.tar.gz
Slave2 CentOS7.9 192.168.154.21 redis-5.0.7.tar.gz

(2) 修改 Redis 配置文件(所有节点操作)

systemctl stop firewalld
setenforce 0
 
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no								#17行,关闭保护模式
port 26379										#21行,Redis哨兵默认的监听端口
daemonize yes									#26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log"					#36行,指定日志存放路径
dir "/var/lib/redis/6379"						#65行,指定数据库存放路径
sentinel monitor mymaster 192.168.154.19 6379 2	#84行,修改 指定该哨兵节点监控192.168.184.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000	#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000		#146行,故障节点的最大超时时间为180000(180秒)





(3)启动哨兵模式

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
注意!先启动主服务器,再启动从服务器



(4)查看哨兵信息

[root@slave2 redis-5.0.7]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.58.30:6379,slaves=2,sentinels=3
[1]+  完成                  redis-sentinel sentinel.conf

1.检查 redis 主从集群部署正确计 0.5 分
2.检查 redis 集群部署为哨兵节点正确计 0.5 分

【题目 8】Redis 服务调优-AOF[1 分]

使用上一题安装的Redis 服务。在 Redis 中,AOF 配置为以三种不同的方式在磁盘上执行 write 或者 fsync。假设当前 Redis 压力过大,请配置 Redis 不执行 fsync。除此之外,避免AOF 文件过大,Redis 会进行 AOF 重写,生成缩小的 AOF 文件。请修改配置,让 AOF 重写时,不进行fsync 操作。配置完成后提交 Redis 节点的用户名、密码和 IP 地址到答题框。

[root@master ~]# vim /etc/redis.conf

no-appendfsync-on-rewrite no
aof-rewrite-incremental-fsync yes

#连个参数分别改为

aof-rewrite-incremental-fsync no
no-appendfsync-on-rewrite yes
#配置就是设置为yes时候,在aof重写期间会停止aof的fsync操作
[root@master ~]# systemctl restart redis
[root@master ~]#

1.检查配置 redis 不执行 fsync 正确计 0.5 分、
2.检查配置 redis 进行 AOF 重写不执行 fsync 正确计 0.5 分

【题目 9】应用部署:堡垒机部署[0.5 分]

使用提供的 OpenStack 平台申请一台 CentOS7.9 的云主机,使用提供的软件包安装JumpServer 堡垒机服务,并配置使用该堡垒机对接自己安装的 controller 和 compute 节点。完成后提交 JumpServer 节点的用户名、密码和 IP 地址到答题框。

使用提供的软件包配置Yum源,通过地址将jumpserver.tar.gz软件包下载至Jumpserver节点的/root目录下

[root@jumpserver ~]# ls
anaconda-ks.cfg  jumpserver.tar.gz  original-ks.cfg

解压软件包jumpserver.tar.gz至/opt目录下

[root@jumpserver ~]# tar -zxvf jumpserver.tar.gz -C /opt/
[root@jumpserver ~]# ls /opt/
compose  config  docker  docker.service  images  jumpserver-repo  static.env

将默认Yum源移至其他目录,创建本地Yum源文件

[root@jumpserver ~]# mv /etc/yum.repos.d/* /mnt/
[root@jumpserver ~]# cat >> /etc/yum.repos.d/jumpserver.repo << EOF
[jumpserver]
name=jumpserver
baseurl=file:///opt/jumpserver-repo
gpgcheck=0
enabled=1
EOF
[root@jumpserver ~]# yum repolist
repo id		repo name		status
jumpserver	jumpserver		2

安装Python数据库

[root@jumpserver ~]# yum install python2 -y

安装配置Docker环境

[root@jumpserver opt]# cp -rf /opt/docker/* /usr/bin/
[root@jumpserver opt]# chmod 775 /usr/bin/docker*
[root@jumpserver opt]# cp -rf /opt/docker.service /etc/systemd/system
[root@jumpserver opt]# chmod 775 /etc/systemd/system/docker.service 
[root@jumpserver opt]# systemctl daemon-reload
[root@jumpserver opt]# systemctl enable docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/dock
er.service.

验证服务状态

[root@jumpserver opt]# docker -v
Docker version 18.06.3-ce, build d7080c1
[root@jumpserver opt]# docker-compose -v
docker-compose version 1.27.4, build 40524192
[root@jumpserver opt]# 

安装Jumpserver服务

[root@jumpserver images]# ls
jumpserver_core_v2.11.4.tar  jumpserver_lion_v2.11.4.tar  jumpserver_nginx_alpine2.tar
jumpserver_koko_v2.11.4.tar  jumpserver_luna_v2.11.4.tar  jumpserver_redis_6-alpine.tar
jumpserver_lina_v2.11.4.tar  jumpserver_mysql_5.tar       load.sh
[root@jumpserver images]# cat load.sh 
#!/bin/bash
docker load -i jumpserver_core_v2.11.4.tar
docker load -i jumpserver_koko_v2.11.4.tar
docker load -i jumpserver_lina_v2.11.4.tar
docker load -i jumpserver_lion_v2.11.4.tar
docker load -i jumpserver_luna_v2.11.4.tar
docker load -i jumpserver_mysql_5.tar
docker load -i jumpserver_nginx_alpine2.tar
docker load -i jumpserver_redis_6-alpine.tar
[root@jumpserver images]# sh load.sh 

创建Jumpserver服务组件目录

[root@jumpserver images]# mkdir -p /opt/jumpserver/{core,koko,lion,mysql,nginx,redis}
[root@jumpserver images]# cp -rf /opt/config /opt/jumpserver/

生效环境变量static.env,使用所提供的脚本up.sh启动Jumpserver服务

[root@jumpserver compose]# ls
config_static                docker-compose-lb.yml              docker-compose-network.yml         down.sh
docker-compose-app.yml       docker-compose-mysql-internal.yml  docker-compose-redis-internal.yml  up.sh
docker-compose-es.yml        docker-compose-mysql.yml           docker-compose-redis.yml
docker-compose-external.yml  docker-compose-network_ipv6.yml    docker-compose-task.yml
[root@jumpserver compose]# source /opt/static.env 
[root@jumpserver compose]# sh up.sh 
Creating network "jms_net" with driver "bridge"
Creating jms_redis ... done
Creating jms_mysql ... done
Creating jms_core  ... done
Creating jms_lina   ... done
Creating jms_nginx  ... done
Creating jms_celery ... done
Creating jms_lion   ... done
Creating jms_luna   ... done
Creating jms_koko   ... done
[root@jumpserver compose]#

浏览器访问http://10.24.193.142 Jumpserver Web登录(admin/admin)
图1 登录.png

登录成功后,会提示设置新密码,如图2所示:

图2 修改密码.png

登录平台后,单击页面右上角下拉菜单切换中文字符设置,如图3所示:

图3 首页.png

至此Jumpserver安装完成。

(6)管理资产

使用管理员admin用户登录Jumpserver管理平台,单击左侧导航栏,展开“资产管理”项目,选择“管理用户”,单击右侧“创建”按钮,如图4所示:

图4 管理用户.png

创建远程连接用户,用户名为root密码为“Abc@1234”,单击“提交”按钮进行创建,如图5所示:

图5 创建管理用户.png

选择“系统用户”,单击右侧“创建”按钮,创建系统用户,选择主机协议“SSH”,设置用户名root,密码为服务器SSH密码并单击“提交”按钮,如图6所示:

图6 创建系统用户.png

单击左侧导航栏,展开“资产管理”项目,选择“资产列表”,单击右侧“创建”按钮,如图7所示:

图7 管理资产.png

创建资产,将云平台主机(controller)加入资产内,如图8、图9所示:

图8 创建资产controller.png

图9 创建成功.png

(7)资产授权

单击左侧导航栏,展开“权限管理”项目,选择“资产授权”,单击右侧“创建”按钮,创建资产授权规则,如图10所示:

图10 创建资产授权规则.png

(8)测试连接

单击右上角管理员用户下拉菜单,选择“用户界面”,如图11所示:

图11 创建资产授权规则.png

如果未出现Default项目下的资产主机,单击收藏夹后“刷新”按钮进行刷新,如图12所示:

图12 查看资产.png

单击左侧导航栏,选择“Web终端”进入远程连接页面,如图13所示:

图13 进入远程连接终端.png

单击左侧Default,展开文件夹,单击controller主机,右侧成功连接主机,如图14所示:

图14 测试连接.png

至此OpenStack对接堡垒机案例操作成功。

【题目 10】skywalking 服务部署与应用[1 分]

使用提供的 OpenStack 私有云平台,申请一台 centos7.9 系统的云主机,使用提供的软件包安装 Elasticsearch 服务和 skywalking 服务,将 skywalking 的 UI 访问端口修改为 8888。接下来再申请一台CentOS7.9 的云主机,用于搭建gpmall 商城应用,并配置SkyWalking Agent, 将 gpmall 的 jar 包放置探针并启动。安装与配置完成后提交 skywalking 节点的用户名、密码和 IP 地址到答题框。

登录物理OpenStack平台,使用CentOS7.9镜像创建两台云主机(node-1,mall),云主机类型使用4VCPU/8GB内存/100GB硬盘。创建后的云主机作为本次案例的实验节点。

修改主机名

[root@node-1 ~]# hostnamectl set-hostname node-1
[root@node-1 ~]# hostnamectl
  Static hostname: node-1
        Icon name: computer-vm
          Chassis: vm
      Machine ID: cc2c86fe566741e6a2ff6d399c5d5daa
          Boot ID: 6c32a0c1d29e4f30929422c8032239ca
  Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
      CPE OS Name: cpe:/o:centos:centos:7
          Kernel: Linux 3.10.0-1160.el7.x86_64
    Architecture: x86-64

将提供的elasticsearch-7.17.0-linux-x86_64.tar.gz软件包上传到此节点并解压到/opt目录,进入解压后的目录并创建data目录

[root@node-1 ~]# tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz -C /opt
[root@node-1 ~]# cd /opt/elasticsearch-7.17.0/
[root@node-1 elasticsearch-7.17.0]# mkdir data

修改Elasticsearch配置,修改并添加如下几行内容

[root@node-1 elasticsearch-7.17.0]# vi config/elasticsearch.yml
…
cluster.name: my-application
node.name: node-1
path.data: /opt/elasticsearch-7.17.0/data
path.logs: /opt/elasticsearch-7.17.0/logs
network.host: 0.0.0.0
cluster.initial_master_nodes: ["node-1"]
…
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

创建Elasticsearch启动用户,并设置属组及权限

[root@node-1 elasticsearch-7.17.0]# groupadd elsearch
[root@node-1 elasticsearch-7.17.0]# useradd elsearch -g elsearch -p elasticsearch
[root@node-1 elasticsearch-7.17.0]# chown -R elsearch:elsearch /opt/elasticsearch-7.17.0

修改资源限制及内核配置,添加如下内容

[root@node-1 elasticsearch-7.17.0]# vi /etc/security/limits.conf
…
* hard   nofile           65536
* soft   nofile           65536
[root@node-1 elasticsearch-7.17.0]# vi /etc/sysctl.conf
vm.max_map_count=262144
[root@node-1 elasticsearch-7.17.0]# sysctl -p
[root@node-1 elasticsearch-7.17.0]# reboot

启动Elasticsearch服务

[root@node-1 ~]# cd /opt/elasticsearch-7.17.0/
[root@node-1 elasticsearch-7.17.0]# su elsearch
[elsearch@node-1 elasticsearch-7.17.0]$ ./bin/elasticsearch -d
按Ctrl+D退出

查询端口,存在9200则成功启动

[root@node-1 elasticsearch-7.17.0]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address     Foreign Address       State       PID/Program name
tcp        0      0 0.0.0.0:22         0.0.0.0:*             LISTEN      1081/sshd      
tcp        0      0 127.0.0.1:25       0.0.0.0:*             LISTEN      1041/master    
tcp        0      0 0.0.0.0:111        0.0.0.0:*             LISTEN      610/rpcbind    
tcp6       0      0 :::9300           :::*                 LISTEN      2261/java      
tcp6       0      0 :::22             :::*                 LISTEN      1081/sshd      
tcp6       0      0 ::1:25             :::*                 LISTEN      1041/master    
tcp6       0      0 :::111             :::*                 LISTEN      610/rpcbind    
tcp6       0      0 :::9200           :::*                 LISTEN      2261/java

使用提供的jdk-8u144-linux-x64.tar.gz软件包,上传jdk软件包,配置jdk如下

[root@node-1 ~]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local/
[root@node-1 ~]# vi /etc/profile
# /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_144
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
…
[root@node-1 ~]# source /etc/profile
[root@node-1 ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

进入解压后目录,修改OAP配置文件

[root@node-1 ~]# cd /opt/apache-skywalking-apm-bin-es7/
[root@node-1 apache-skywalking-apm-bin-es7]# vi config/application.yml
…
#集群配置使用单机版
cluster:
selector: ${SW_CLUSTER:standalone}
standalone:
…
#数据库使用elasticsearch7
storage:
selector: ${SW_STORAGE:elasticsearch7}
…
elasticsearch7:
  nameSpace: ${SW_NAMESPACE:""}
  clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.128.11.32:9200}

启动OAP服务,查询端口,存在11800与12800则成功启动

[root@node-1 apache-skywalking-apm-bin-es7]# ./bin/oapService.sh
SkyWalking OAP started successfully!
[root@node-1 apache-skywalking-apm-bin-es7]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address       Foreign Address     State     PID/Program name
tcp        0      0 0.0.0.0:22           0.0.0.0:*           LISTEN     1081/sshd      
tcp        0      0 127.0.0.1:25         0.0.0.0:*           LISTEN     1041/master    
tcp        0      0 0.0.0.0:111          0.0.0.0:*           LISTEN     610/rpcbind    
tcp6       0      0 :::9300             :::*                 LISTEN     2261/java      
tcp6       0      0 :::22               :::*                 LISTEN     1081/sshd      
tcp6       0      0 :::11800             :::*                 LISTEN     2416/java      
tcp6       0      0 ::1:25               :::*                 LISTEN     1041/master    
tcp6       0      0 :::12800             :::*                 LISTEN     2416/java      
tcp6       0      0 :::111               :::*                 LISTEN     610/rpcbind    
tcp6       0      0 :::9200             :::*                 LISTEN     2261/java

部署SkyWalking UI服务由于SkyWalking UI的默认地址是8080,与很多中间件可能存在冲突,修改一下

[root@node-1 apache-skywalking-apm-bin-es7]# vi webapp/webapp.yml
…
server:
port: 8888
…

启动SkyWalking UI服务

[root@node-1 apache-skywalking-apm-bin-es7]# ./bin/webappService.sh
SkyWalking Web Application started successfully!

查看端口,存在8888则成功启动

[root@node-1 apache-skywalking-apm-bin-es7]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address       Foreign Address     State       PID/Program name
tcp        0      0 0.0.0.0:22           0.0.0.0:*           LISTEN      1081/sshd      
tcp        0      0 127.0.0.1:25         0.0.0.0:*           LISTEN      1041/master    
tcp        0      0 0.0.0.0:111          0.0.0.0:*           LISTEN      610/rpcbind    
tcp6       0      0 :::9300             :::*               LISTEN      2261/java      
tcp6       0      0 :::22               :::*               LISTEN      1081/sshd      
tcp6       0      0 :::8888             :::*               LISTEN      3133/java      
tcp6       0      0 :::11800             :::*               LISTEN      2416/java      
tcp6       0      0 ::1:25               :::*               LISTEN      1041/master    
tcp6       0      0 :::12800             :::*               LISTEN      2416/java      
tcp6       0      0 :::111               :::*               LISTEN      610/rpcbind    
tcp6       0      0 :::9200             :::*               LISTEN      2261/java

搭建并启动应用商城服务,并配置SkyWalking Agent修改mall节点主机名

[root@localhost ~]# hostnamectl set-hostname mall
[root@mall ~]# hostnamectl
  Static hostname: mall
        Icon name: computer-vm
          Chassis: vm
      Machine ID: cc2c86fe566741e6a2ff6d399c5d5daa
          Boot ID: 51559d155ec14aafad2411ca8b85db42
  Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
      CPE OS Name: cpe:/o:centos:centos:7
          Kernel: Linux 3.10.0-1160.el7.x86_64
    Architecture: x86-64

修改/etc/hosts配置文件如下

[root@mall ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.128.11.42 mal

将提供的gpmall包上传到服务器的/root目录下并解压gpmall.tar.gz,配置本地local.repo文件

[root@mall ~]# mv /etc/yum.repos.d/* /media/
[root@mall ~]# cd gpmall/
[root@mall gpmall]# tar -zxvf gpmall-repo.tar.gz -C /root/
[root@mall ~]# cat /etc/yum.repos.d/local.repo
[mall]
name=mall
baseurl=file:///root/gpmall-repo
gpgcheck=0
enabled=1

安装基础服务,包括Java JDK环境、数据库、Redis、Nginx等

[root@mall ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
...
[root@mall ~]# java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)
[root@mall ~]# yum install redis -y
[root@mall ~]# yum install nginx -y
[root@mall ~]# yum install mariadb mariadb-server -y
[root@mall ~]# tar -zxvf zookeeper-3.4.14.tar.gz

#进入到zookeeper-3.4.14/conf目录下,将zoo_sample.cfg文件重命名为zoo.cf

[root@mall ~]# cd zookeeper-3.4.14/conf/
[root@mall conf]# mv zoo_sample.cfg zoo.cfg
[root@mall conf]# cd ../bin
[root@mall bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

#查看ZooKeeper状态

[root@mall bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: standalone

安装Kafka服务,将提供的kafka_2.11-1.1.1.tgz包上传到mall节点上

[root@mall bin]# cd
[root@mall ~]# tar -zxvf kafka_2.11-1.1.1.tgz
[root@mall ~]# cd kafka_2.11-1.1.1/bin/
[root@mall bin]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@mall bin]# jps
6039 Kafka
1722 QuorumPeerMain
6126 Jps
[root@mall bin]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address       Foreign Address     State       PID/Program name    
tcp        0      0 0.0.0.0:22           0.0.0.0:*           LISTEN      1008/sshd  
tcp        0      0 127.0.0.1:25         0.0.0.0:*           LISTEN      887/master  
tcp6       0      0 :::9092             :::*               LISTEN      6039/java  
tcp6       0      0 :::46949             :::*               LISTEN      6039/java  
tcp6       0      0 :::2181             :::*               LISTEN      1722/java  
tcp6       0      0 :::48677             :::*               LISTEN      1722/java  
tcp6       0      0 :::22               :::*               LISTEN      1008/sshd  
tcp6       0      0 ::1:25               :::*               LISTEN      887/master

修改数据库配置文件并启动MariaDB数据库,设置root用户密码为123456,并创建gpmall数据库,将提供的gpmall.sql导入。

[root@mall bin]# cd
[root@mall ~]# vi /etc/my.cnf
[mysqld]
…
!includedir /etc/my.cnf.d
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

[root@mall ~]# systemctl start mariadb

设置root用户的权限,命令如下

MariaDB [(none)]> grant all privileges on *.* to root@localhost identified by '123456' with grant option;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant all privileges on *.* to root@"%" identified by '123456' with grant option;
Query OK, 0 rows affected (0.001 sec)

将gpmall.sql文件上传至云主机的/root目录下。创建数据库gpmall并导入gpmall.sql文件。

MariaDB [(none)]> create database gpmall;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use gpmall;
MariaDB [gpmall]> source /root/gpmall/gpmall.sql

退出数据库并设置开机自启

MariaDB [gpmall]> Ctrl-C -- exit!
Aborted
[root@mall ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

修改Redis配置文件,编辑/etc/redis.conf文件。
将bind 127.0.0.1这一行注释掉;将protected-mode yes 改为 protected-mode no。

[root@mall ~]# vi /etc/redis.conf
…
#bind 127.0.0.1
protected-mode no
…
[root@mall ~]# systemctl start redis
[root@mall ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

启动Nginx服务命令如下

[root@mall ~]# systemctl start nginx
[root@mall ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

应用系统部署,使用提供gpmall-shopping-0.0.1-SNAPSHOT.jar、gpmall-user-0.0.1-SNAPSHOT.jar、shopping-provider-0.0.1-SNAPSHOT.jar、user-provider-0.0.1-SNAPSHOT.jar 、dist这5个包部署应用系统,其中4个jar包为后端服务包,dist为前端包。(包在gpmall目录下)
修改/etc/hosts文件,修改项目全局配置文件如下(原有的172.128.11.42 mall映射删除)

[root@mall ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.128.11.42 kafka.mall
172.128.11.42 mysql.mall
172.128.11.42 redis.mall
172.128.11.42 zookeeper.mall

清空默认项目路径下的文件,将dist目录下的文件,复制到Nginx默认项目路径

[root@mall ~]# rm -rf /usr/share/nginx/html/*
[root@mall ~]# cp -rvf gpmall/dist/* /usr/share/nginx/html/

修改Nginx配置文件/etc/nginx/nginx.conf,添加映射如下所示

[root@mall ~]# vi /etc/nginx/nginx.conf
…
  server {
      listen       80;
      listen       [::]:80;
      server_name _;
      root         /usr/share/nginx/html;

       # Load configuration files for the default server block.
      include /etc/nginx/default.d/*.conf;
       
      location / {
      root   /usr/share/nginx/html;
      index index.html index.htm;
      }
      location /user {
          proxy_pass http://127.0.0.1:8082;
      }

      location /shopping {
          proxy_pass http://127.0.0.1:8081;
      }

      location /cashier {
          proxy_pass http://127.0.0.1:8083;
      }

      error_page 404 /404.html;
…
[root@mall ~]# systemctl restart nginx

到此,前端部署完毕。

部署后端

将node-1节点的/opt/apache-skywalking-apm-bin-es7目录下的agent目录复制到mall节点下:

[root@mall ~]# scp -r 172.128.11.32:/opt/apache-skywalking-apm-bin-es7/agent /root

修改SkyWalking agent配置文件

[root@mall ~]# vi agent/config/agent.config
…
agent.service_name=${SW_AGENT_NAME:my-application}
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}
…
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.128.11.32:11800}
…

将提供的4个jar包上传到服务器的/root目录下,放置探针并启动,通过设置启动参数的方式检测系统,启动命令如下:

[root@mall ~]# nohup java -javaagent:/root/agent/skywalking-agent.jar -jar gpmall/shopping-provider-0.0.1-SNAPSHOT.jar &
[1] 20086
[root@mall ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@mall ~]# nohup java -javaagent:/root/agent/skywalking-agent.jar -jar gpmall/user-provider-0.0.1-SNAPSHOT.jar &
[2] 20132
[root@mall ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@mall ~]# nohup java -javaagent:/root/agent/skywalking-agent.jar -jar gpmall/gpmall-shopping-0.0.1-SNAPSHOT.jar &
[3] 20177
[root@mall ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@mall ~]# nohup java -javaagent:/root/agent/skywalking-agent.jar -jar gpmall/gpmall-user-0.0.1-SNAPSHOT.jar &
[4] 20281
[root@mall ~]# nohup: ignoring input and appending output to ‘nohup.out’
# httpd访问网络配置
[root@mall ~]# setsebool -P httpd_can_network_connect 1

按照顺序运行4个jar包后,至此后端服务部署完毕
打开浏览器,在地址栏中输入http://localhost,访问界面

商城首页
单击右上角“头像”,进行登录操作,使用用户名/密码为test/test进行登录

1.检查 skywalking 服务部署正确计 1 分

【题目 11】Linux 内核优化[1 分]

在使用 Linux 服务器的时候,TCP 协议规定,对于已经建立的连接,网络双方要进行四次挥手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。因为服务器程序要同时管理大量连接,所以很有必要保证无用的连接完全断开,否则大量僵死的连接会浪费许多服务器资源。创建一台 CentOS7.9 云主机,修改相应的配置文件,分别开启 SYN Cookies;允许将 TIME-WAIT sockets 重新用于新的 TCP 连接;开启TCP 连接中TIME-WAIT sockets 的快速回收;修改系統默认的 TIMEOUT 时间为 30。完成后提交修改节点的用户名、密码和 IP 地址到答题框。

[root@container ~]# vim /etc/sysctl.conf

#添加如下参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

[root@container ~]# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
[root@container ~]#

1.检查内核优化正确计 1 分

【题目 12】排错:Glance 服务排错[1 分]

使用赛项提供的 chinaskill-error1 镜像启动云主机,flavor 使用 4vcpu/12G 内存/100G 硬
盘。启动后存在错误的私有云平台,错误现象为查看不到 image 列表,试根据错误信息排查云平台错误,使云平台可以查询到 image 信息。完成后提交云主机节点的用户名、密码和 IP 地址到答题框。

如果不会做,提供取巧思路~~
国赛是用错误镜像来创建一个云主机进行排错,可以试着修改正常经常的标签,然后创建正常的glance服务
可以得到部分分

1.检查错误镜像glance 服务启动正确计 1 分

【题目 13】排错:数据库排错[1.5 分]

使用赛项提供的排错镜像 chinaskill-error2 创建一台云主机(云主机的登录用户名为 root, 密码为 000000),该云主机中存在错误的数据库服务,错误现象为数据库服务无法启动。请将数据库服务修复并启动,将数据库的密码修改为 chinaskill123。修复完成后提交该云主机的用户名、密码和 IP 地址到答题框。

使用一个正常的mysql数据库,创建一个符合要求的用户和密码,可以得到0.5分~判分系统是先连接数据库
再进去查询

1.检查错误镜像数据库服务启动正确计 1.5 分

【任务 3】私有云运维开发[10 分]

【题目 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 运行环境,以便考试系统访问)

(1)环境准备

节点 地址
ansible 192.168.100.10
node1 192.168.100.20
node2 192.168.100.30
node3 192.168.100.40

(2)环境配置

[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# su
[root@ansible ~]# 

[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]# 

[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# su
[root@node2 ~]# 

[root@localhost ~]# hostnamectl set-hostname node3
[root@localhost ~]# su
[root@node3 ~]# 

# 将ip地址映射成主机名(其他3台节点配置一样,此处省略)
[root@ansible ~]# vi /etc/hosts
192.168.100.10 ansible
192.168.100.20 node1
192.168.100.30 node2
192.168.100.40 node3
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#关闭防火墙和selinux(其他3台节点配置一样,此处省略)
[root@ansible ~]# systemctl stop firewalld && setenforce 0


# ansible节点部署ansible服务(通过CRT远程工具将提供的ansible软件包上传到ansible节点)
[root@ansible ~]# tar -xvf ansible.tar.gz

#删除centos自带的源并配置本地yum源安装ansible服务
[root@ansible ~]# mv /etc/yum.repos.d/* /home/
[root@ansible ~]# vi /etc/yum.repos.d/local.repo
[ansible]
name=ansible
baseurl=file:///root/ansible
gpgcheck=0
enabled=1

[root@ansible ~]# yum install ansible -y

#检查是否安装完成
[root@ansible ~]# ansible --version
ansible 2.9.10
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

(3)设置免密

[root@ansible ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:svV0oqhTRNGB/tH37Xi49/OUg+AFu2XlxcKhsyXm+wI root@ansible
The key's randomart image is:
+---[RSA 2048]----+
|      .+..    .  |
|      o .    o o |
|     o   . .= +.o|
|      o . .o+=o..|
|     ...S.o++= o |
|      .=.+Eo*.o o|
|     .o . .+.. *.|
|    ..      ..oo=|
|    ..       .o+*|
+----[SHA256]-----+


[root@ansible ~]# ssh-copy-id root@node1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'node1 (192.168.100.20)' can't be established.
ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE.
ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@node1'"
and check to make sure that only the key(s) you wanted were added.


[root@ansible ~]# ssh-copy-id root@node2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'node2 (192.168.100.30)' can't be established.
ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE.
ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node2's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@node2'"
and check to make sure that only the key(s) you wanted were added.


[root@ansible ~]# ssh-copy-id root@node3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'node3 (192.168.100.40)' can't be established.
ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE.
ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node3's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@node3'"
and check to make sure that only the key(s) you wanted were added.

(4)修改ansible文件配置组

[root@ansible ~]# vi /etc/ansible/hosts 
[node]
node1
node2
node3

[node1]
node1

[node2]
node2

[node3]
node3


#解压mariadb.tar软件包将mariadb-repo源拷贝到node1,node2,node3节点的/root目录下
[root@ansible ~]# tar -xvf mariadb.tar 
mariadb/
mariadb/mariadb-repo.tar.gz
mariadb/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mariadb/schema.xml
[root@ansible ~]# tar -xvf mariadb/mariadb-repo.tar.gz 
[root@ansible ~]# scp -r mariadb-repo/ root@node1:/root
[root@ansible ~]# scp -r mariadb-repo/ root@node2:/root
[root@ansible ~]# scp -r mariadb-repo/ root@node3:/root

(5)创建ansible执行的工作目录编写执行playbook剧本的相关文件

[root@ansible ~]# mkdir cscc_galera
[root@ansible ~]# cd cscc_galera/


#创建local.repo文件
[root@ansible cscc_galera]# vi local.repo
[centos]
name=centos
baseurl=file:///opt/centos   #自行挂载centos7.9镜像到/opt目录
gpgcheck=0
enabled=1
[mariadb]
name=mariadb
baseurl=file:///root/mariadb-repo
gpgcheck=0
enabled=1

#创建server.cnf文件
[root@ansible cscc_galera]# vi server.cnf
[server]
[mysqld]
[galera]
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
bind-address=0.0.0.0
wsrep_slave_threads=1
innodb_flush_log_at_trx_commit=0
[embedded]
[mariadb]
[mariadb-10.3]

#创建playbook剧本文件
[root@ansible cscc_galera]# vi install_galera.yaml
---
- hosts: all
  remote_user: root
  tasks:
  - name: rm repo
    shell: rm -rf /etc/yum.repos.d/* 
  - name: copy repo
    copy: src=local.repo dest=/etc/yum.repos.d/
  - name: install mariadb
    yum: name=mariadb-server
  - name: start mariadb
    service: name=mariadb state=started enabled=yes
  - name: init_mysql
    shell: mysqladmin -uroot password 123456
  - name: stop mariadb
    service: name=mariadb state=stopped
  - name: copy server.cnf
    copy: src=server.cnf dest=/etc/my.cnf.d/server.cnf
- hosts: node1
  remote_user: root
  tasks:
  - name: start mariadb
    shell: /usr/sbin/mysqld --wsrep-new-cluster -u root &
- hosts: node2,node3
  remote_user: root
  tasks:
  - name: start mariadb
    shell: systemctl start mariadb

(6)执行入口文件

[root@ansible cscc_galera]# ansible-playbook install_galera.yaml 
[WARNING]: Found both group and host with same name: node1
[WARNING]: Found both group and host with same name: node3
[WARNING]: Found both group and host with same name: node2

PLAY [all] *******************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [node3]
ok: [node2]
ok: [node1]

TASK [rm repo] ***************************************************************************************************
[WARNING]: Consider using the file module with state=absent rather than running 'rm'.  If you need to use command
because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
changed: [node2]
changed: [node3]
changed: [node1]

TASK [copy repo] *************************************************************************************************
changed: [node3]
changed: [node2]
changed: [node1]

TASK [install mariadb] *******************************************************************************************
changed: [node2]
changed: [node3]
changed: [node1]

TASK [start mariadb] *********************************************************************************************
changed: [node1]
changed: [node2]
changed: [node3]

TASK [init_mysql] ************************************************************************************************
changed: [node2]
changed: [node1]
changed: [node3]

TASK [stop mariadb] **********************************************************************************************
changed: [node1]
changed: [node2]
changed: [node3]

TASK [copy server.cnf] **********************************************************************************************
changed: [node1]
changed: [node2]
changed: [node3]

PLAY [node1] *****************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [node1]

TASK [start mariadb] *********************************************************************************************
changed: [node1]

PLAY [node2,node3] ***********************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [node2]
ok: [node3]

TASK [start mariadb] *********************************************************************************************
changed: [node2]
changed: [node3]

PLAY RECAP *******************************************************************************************************
node1                      : ok=9    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=9    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=9    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible cscc_galera]# 

(7)验证,检查wsrep_cluster_size的值是否为3/wsrep_ready的状态是否为ON

[root@ansible cscc_galera]# ssh node1
Last login: Fri Aug 26 05:01:52 2022 from 192.168.100.1
[root@node1 ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.23-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> show status like 'wsrep_ready';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready   | ON    |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> 

1.执行yaml 文件正确计 0.5 分
2.检查数据库集群部署正确计 1 分
3.检查数据库集群数量为 3 正确计 0.5 分

【题目 2】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 脚本,准备好环境, 以便考试系统访问)

参考学习地址

https://www.likecs.com/show-307196346.html

1.执行yaml 文件正确计 0.5 分
2.检查 ELK 服务部署正确计 1.5 分

【题目 3】Python 运维开发:基于OpenStack Restful API 实现镜像上传[1 分]

使用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 地址,用户名和密码提交。

(1)基础环境准备,安装python3,已经需要的依赖

[root@ controller ~]# python3 --version
Python 3.6.8

#使用提供的whl文件安装依赖
[root@controller ~]# cd Python-api
[root@controller ~]#  pip3 install certifi-2019.11.28-py2.py3-none-any.whl
[root@controller ~]# pip3 install urllib3-1.25.11-py3-none-any.whl
[root@controller ~]#  pip3 install idna-2.8-py2.py3-none-any.whl
[root@controller ~]#  pip3 install chardet-3.0.4-py2.py3-none-any.whl
[root@controller ~]#  pip3 install requests-2.24.0-py2.py3-none-any.whl

(2)代码实现

[root@controller ~]# vi api_image_manager.py

#encoding:utf-8  
import requests, json, time  
import logging  
# -----------logger-----------  
# get logger  
logger = logging.getLogger(__name__)  
# level  
logger.setLevel(logging.DEBUG)  
# format  
format = logging.Formatter('%(asctime)s %(message)s')  
# to console  
stream_handler = logging.StreamHandler()  
stream_handler.setFormatter(format)  
logger.addHandler(stream_handler)  
# -----------logger-----------  
def get_auth_token(controller_ip, domain, user, password):  
   '''  
  :param controller_ip: openstack master ip address  
  :param domain: current user's domain  
  :param user: user name  
  :param password: user password  
  :return: keystoen auth Token for current user.  
   '''  
  try:  
      url = f"http://{controller_ip}:5000/v3/auth/tokens"  
      body = {  
           "auth": {  
               "identity": {  
                   "methods": [  
                       "password"  
                  ],  
                   "password": {  
                       "user": {  
                           "domain": {  
                               "name": domain  
                          },  
                           "name": user,  
                           "password": password  
                      }  
                  }  
              },  
               "scope": {  
                   "project": {  
                       "domain": {  
                           "name": domain  
                      },  
                       "name": user  
                  }  
              }  
          }  
      }  
      headers = {  
           "Content-Type": "application/json",  
      }  
      print(body)  
      Token = requests.post(url, data=json.dumps(body), headers=headers).headers['X-Subject-Token']  
      headers = {  
           "X-Auth-Token": Token  
      }  
      logger.debug(f"获取Token值:{str(Token)}")  
      return headers  
  except Exception as e:  
      logger.error(f"获取Token值失败,请检查访问云主机控制节点IP是否正确?输出错误信息如下:{str(e)}")  
       exit(0)  
# 镜像管理  
class image_manager:  
  def __init__(self, handers: dict, resUrl: str):  
      self.headers = handers  
      self.resUrl = resUrl  
   #POST v2/images  
  def create_image(self, image_name: str, container_format="bare", disk_format="qcow2"):  
       """  
      :param image_name:  
      :param container_format:  
      :param disk_format:  
      :return:  
       """  
      body = {  
           "container_format": container_format,  
           "disk_format": disk_format,  
           "name": image_name  
      }  
      response = requests.post(self.resUrl, data=json.dumps(body), headers=self.headers)  
      logger.debug(response.status_code)  
       if response.status_code == 201:  
          return {"ImageItemCreatedSuccess": response.status_code}  
      return response.text  
   # 获取glance镜像id  
  def get_image_id(self, image_name: str):  
      result = json.loads(requests.get(self.resUrl, headers=self.headers).text)  
      logger.debug(result)  
       for item in result['images']:  
           if (item['name'] == image_name):  
              return item['id']  
   # 上传glance镜像  
   # Image data¶ Uploads and downloads raw image data.  
   # These operations may be restricted to administrators. Consult your cloud operator’s documentation for details.  
   # /v2/images/{image_id}/file  
   # 镜像可以重名  
  def upload_iamge_data(self, image_id: str, file_path=""):  
       """  
      :param image_id:  
      :param file_path:  
      :return:  
       """  
      self.resUrl = self.resUrl + "/" + image_id + "/file"  
      self.headers['Content-Type'] = "application/octet-stream"  
      response = requests.put(self.resUrl, data=open(file_path, 'rb').read(), headers=self.headers)  
      logger.debug(response.status_code)  
       if response.status_code == 204:  
          return {"ImageItemCreatedSuccess": response.status_code}  
      return response.text  
   # ----------------------------  
   # /v2/images  
   # List images  
  def get_images(self):  
       """  
      :return:  
       """  
      status_code = requests.get(self.resUrl, headers=self.headers).text  
      logger.debug(f"返回状态:{str(status_code)}")  
      return status_code  
   # /v2/images/{image_id} Show image  
  def get_image(self, id: str):  
       """  
       get a flavor by id.  
      :return:  
       """  
      api_url = self.resUrl + "/" + id  
      response = requests.get(api_url, headers=self.headers)  
      result = json.loads(response.text)  
      logger.debug(f"返回信息:{str(result)}")  
      return result  
   # /v2/images/{image_id} Delete image  
  def delete_image(self, id: str):  
       """  
        delete a image by id.  
        :return:  
        """  
      api_url = self.resUrl + "/" + id  
      response = requests.delete(api_url, headers=self.headers)  
       # 204 - No ContentThe server has fulfilled the request.  
       if response.status_code == 204:  
          return {"Image itemDeletedSuccess": response.status_code}  
      result = json.loads(response.text)  
      logger.debug(f"返回信息:{str(result)}")  
      return result  
       # http://192.168.200.226:8774/v2.1/ get apis version infomation.  
if __name__ == '__main__':  
   # 1. openstack allinone (controller ) credentials  
   # host ip address  
  controller_ip = "192.168.200.100"  
   # domain name  
  domain = "demo"  
   # user name  
  user = "admin"  
   # user password  
  password = "000000"  
  headers = get_auth_token(controller_ip, domain, user, password)  
  print("headers:", headers)  
  # http://controller:9292  
  image_m = image_manager(headers, f"http://{controller_ip}:9292/v2/images")  
   # 1 查所有  
  images = image_m.get_images()  
  print("查询所有images:", images)  
   #2 创建镜像(注意,镜像允许同名)  
  result = image_m.create_image(image_name="cirros001")  # 调用glance-api中创建镜像方法  
  print(f"创建cirros001 镜像:", result)  
   #   #1.1查询id  
  id = image_m.get_image_id(image_name="cirros001")  
  print("cirros002镜像的,id为: ", id)  
   # 1.2 上传镜像文件  
  result = image_m.upload_iamge_data(id, file_path="cirros-0.3.4-x86_64-disk.img")  
  print(f"上传{id}镜像:", result)  

需要修改的所有变量信息全部都在 if name == ‘main‘: 下面

1.执行api_image_manager.py 脚本,成功创建镜像,计 0.5 分
2.检查镜像状态正确,计 0.5 分

【题目 4】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 地址,用户名和密码提交。

(1)代码实现
创建云主机所需的镜像、类型、网络是用name来识别的,需要提前创建好

[root@container ~]# vi sdk_server_manager.py

import json,logging  
import openstack  
#openstack logger  
# openstack.enable_logging(debug=True)  
#文档地址  
# https://docs.openstack.org/openstacksdk/latest/user/index.html  
def create_connection(auth_url, user_domain_name, username, password):  
   """  
  建立连接  
  :param auth_url:  
  :param user_domain_name:  
  :param username:  
  :param password:  
  :return:  
  """  
   return openstack.connect(  
       auth_url=auth_url,  
       user_domain_name=user_domain_name,  
       username=username,  
       password=password,  
  )  
#user Manager  
# 参见文档  
# https://docs.openstack.org/openstacksdk/latest/user/guides/identity.html  
#openstack.connection.Connection  
#云主机管理  
class server_manager:  
   def __init__(self, connect):  
       self.connect = connect  
   def list_servers(self):  
       """  
      查询所有云主机.  
      :return:  
      """  
       #to json  
       items = self.connect.compute.servers()  
       server_jsons = {}  
       for server in items:  
           server_jsons[server['name']] = server  
       # return ""  
       return items# json.dumps(server_jsons,indent=2,skipkeys=True)  
   def create_server(self, server_name, image_name, flavor_name,networ_name):  
       """  
      create a server.  
      :param server_name:  
      :param image_name:  
      :param flavor_name:  
      :param networ_name:  
      :return:  
      """  
       image = self.connect.compute.find_image(image_name)  
       flavor = self.connect.compute.find_flavor(flavor_name)  
       network = self.connect.network.find_network(networ_name)  
       server = self.connect.compute.create_server(  
           name=server_name, image_id=image.id, flavor_id=flavor.id,  
           networks=[{"uuid": network.id}])  
       result = self.connect.compute.wait_for_server(server)  
       return result #json.dumps(result,indent=2,skipkeys=True)  
   def delete_server(self, server_name):  
       """  
      删除云主机  
      :param server_name:  
      :return:  
      """  
       server = self.connect.compute.find_server(server_name)  
       result = self.connect.compute.delete_server(server)  
       return result #json.dumps(result, indent=2, skipkeys=True)  
   def get_server(self, server_name):  
       """  
      获取云主机  
      :param server_name:  
      :return:  
      """  
       server = self.connect.compute.find_server(server_name)  
       return json.dumps(server, indent=2, skipkeys=True)  
class image_manager:  
   def __init__(self, connect):  
       self.connect = connect  
   def list_images(self):  
       """  
      查询所有镜像  
      :return:  
      """  
       #to json  
       items = self.connect.compute.images()  
       images_jsons = {}  
       for image in items:  
           images_jsons[image['name']] = image  
       return json.dumps(images_jsons,indent=2)  
   def get_image(self, image_name:str):  
       """  
      查询镜像  
      :return:  
      """  
       #to json  
       image = self.connect.compute.find_image(image_name)  
       return json.dumps(image,indent=2)  
class flavor_manager:  
   def __init__(self, connect):  
       self.connect = connect  
   def list_flavors(self):  
       """  
      查询所有云主机类型  
      :return:  
      """  
       #to json  
       items = self.connect.compute.flavors()  
       flavors_jsons = {}  
       for flavor in items:  
           flavors_jsons[flavor['name']] = flavor  
       return json.dumps(flavors_jsons,indent=2)  
   def get_flavor(self, flavor_name:str):  
       """  
      根据名称获取云主机类.  
      :return:  
      """  
       #to json  
       flavor = self.connect.compute.find_flavor(flavor_name)  
       return json.dumps(flavor,indent=2)  
class network_manager:  
   def __init__(self, connect):  
       self.connect = connect  
   def list_networks(self):  
       """  
      查询所有网络.  
      :return:  
      """  
       #to json  
       items = self.connect.network.networks()  
       items_jsons = {}  
       for network in items:  
           items_jsons[network['name']] = network  
       return json.dumps(items_jsons,indent=2)  
   def get_network(self, network_name:str):  
       """  
      跟名称查询网络.  
      :return:  
      """  
       #to json  
       flavor = self.connect.compute.find_network(network_name)  
       return json.dumps(flavor,indent=2)  
if __name__ == '__main__':  
   # Initialize connection(通过配置文件)  
   auth_url = "http://192.168.200.100:5000/v3/"  
   username = "admin"  
   password = "000000"  
   user_domain_name = 'demo'  
   conn = create_connection(auth_url, user_domain_name, username, password)  
   # 1 查询flavors  
   print("list flavors--------")  
   sdk_m = flavor_manager(conn)  
   flavors = sdk_m.list_flavors()  
   print("flavors:", flavors)  
   # 2 镜像管理  
   sdk_m = image_manager(conn)  
   items = sdk_m.list_images()  
   print("image:", items)  
   # 3 网络管理  
   print("list networks--------")  
   sdk_m = network_manager(conn)  
   networks = sdk_m.list_networks()  
   print("networks:", networks)  
   #4 查询 云主机  
   sdk_m = server_manager(conn)  
   servers = sdk_m.list_servers()  
   print("servers:", servers)  
   #5 创建云主机  
   print("creat server--------")  
   servers = sdk_m.create_server("server001","cirros","m1.tiny","net")  
   print("servers:", servers)  
   #6 删除云主机  
   result = sdk_m.delete_server("test_song")  
   print("servers:", result)  

1.执行 sdk_server_manager.py 脚本,成功创建云主机,计 0.5 分
2.检查创建的云主机状态正确,计 0.5 分

【题目 5】Python 运维开发:云主机类型管理的命令行工具开发[2 分]

使用已建好的 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

在这里插入代码片

1.执行 flavor_manager.py 脚本,指定 create 和配置参数,成功创建 1 个云主机类型,计 0.5
分;
2.执行 flavor_manager.py 脚本,指定 getall 参数,成功查询所有云主机类型,计 0.5 分;
3.执行 flavor_manager.py 脚本,指定 get 和配置参数,成功查询具体名称的云主机类型,计
0.5 分;
4.执行 flavor_manager.py 脚本,指定 delete 和配置参数,成功删除指定 ID 云主机类型,计
0.5 分。

import json,openstack,argparse

class flavor_manager:
    def __init__(self,auth_url,user_domain_name,username,password):
        self.connect = openstack.connect(
            auth_url=auth_url,
            user_domain_name=user_domain_name,
            username=username,
            password=password
        )

    def create_flavor(self,args):
        flavor = self.connect.compute.find_flavor(args.n)
        if flavor is not None:
            self.connect.compute.delete_flavor(flavor)
        flavor = self.connect.compute.create_flavor(
            name=args.n,
            vcpus=args.v,
            ram=args.m,
            disk=args.d,
            id=args.id
        )
        return json.dumps(flavor)

    def list_all_flavor(self,args):
        flavors = self.connect.compute.flavors()
        for flavor in flavors:
            print(json.dumps(flavor))

    def get_flavor_by_id(self,args):
        flavor = self.connect.compute.find_flavor(args.id)
        return json.dumps(flavor)

    def delete_flavor_by_id(self,args):
        self.connect.compute.delete_flavor(args.id)

if __name__ == '__main__':
    flavor_m = flavor_manager(
        'http://192.168.73.10:5000/v3',
        'demo',
        'admin',
        '000000'
    )
    # 命令解析器
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()  # 添加子命令解析器
    # create 子命令
    parser_create = subparsers.add_parser('create',help="创建云主机类型")
    parser_create.add_argument('-n', type=str,help="支持指定 flavor 名称,数据类型为字符串类型")
    parser_create.add_argument('-m', type=int,help="支持指定内存大小,数据类型为 int,单位 M")
    parser_create.add_argument('-v', type=int,help="支持指定虚拟 cpu 个数,数据类型为 int")
    parser_create.add_argument('-d', type=int,help="支持磁盘大小,内存大小类型为 int,单位 G")
    parser_create.add_argument('-id', type=str,help="支持指定 ID,类型为字符串")
    parser_create.set_defaults(func=flavor_m.create_flavor)
    # getall 子命令
    parser_getall = subparsers.add_parser("getall",help="查询目前账号下所有的云主机类型")
    parser_getall.set_defaults(func=flavor_m.list_all_flavor)
    # get 子命令
    parser_get = subparsers.add_parser('get',help="查询给定具体名称的云主机类型查询")
    parser_get.add_argument('-id', type=str,help="支持指定 ID 查询,类型为 string")
    parser_get.set_defaults(func=flavor_m.get_flavor_by_id)
    # delete子命令
    parser_delete = subparsers.add_parser('delete',help="删除指定的 ID 的云主机类型")
    parser_delete.add_argument('-id', type=str,help="指定 ID 查询")
    parser_delete.set_defaults(func=flavor_m.delete_flavor_by_id)
    args = parser.parse_args()
    print(args.func(args))

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

在这里插入代码片

1.执行user_manager.py 脚本,指定 create 和配置参数,成功创建 1 个用户,计 0.5 分;
2.执行user_manager.py 脚本,指定 get 和配置参数,成功查询具体名称的用户,计 0.5 分; 3.执行user_manager.py 脚本,指定 getall 和配置参数,成功查询 admin 账号下的所有用户, 计 0.5 分;
4.执行user_manager.py 脚本,指定 delete 和配置参数,成功删除指定名称的用户,计 0.5 分

[root@controller ~]# cat user_manager.py 
import json, yaml, openstack, argparse

class UserManager:
    def __init__(self, auth_url, user_domain_name, username, password):
        self.connect = openstack.connect(
            auth_url=auth_url,
            user_domain_name=user_domain_name,
            username=username,
            password=password
        )

    def create_user(self, args):
        user_info = json.loads(args.input)  # 转换为对象
        user = self.connect.identity.create_user(
            name=user_info['name'],
            password=user_info['password'],
            description=user_info['description']
        )
        print(json.dumps(user))

    def get_user(self, args):
        user = self.connect.identity.find_user(args.name)
        if args.output is not None:
            output = open(str(args.output), 'w')
            json.dump(user, output)
        else:
            print(json.dumps(user))

    def list_all_user(self, args):
        users = self.connect.identity.users()
        if args.output is not None:
            output = open(str(args.output), 'w')
            yaml.safe_dump(json.loads(json.dumps(list(users))), output)
        else:
            print(json.dumps(list(users)))

    def del_user(self, args):
        user = self.connect.identity.find_user(args.name)
        resp = self.connect.identity.delete_user(user)
        print(resp)


if __name__ == '__main__':
    user_m = UserManager(
        'http://192.168.73.10:5000/v3',
        'demo',
        'admin',
        '000000'
    )

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    # create 子命令
    parser_create = subparsers.add_parser("create", help="创建 1 个用户")
    parser_create.add_argument('-i', '--input',type=str,required=True, help="参数“-i 或--input”,格式为 json 格式文本用户数据")
    parser_create.set_defaults(func=user_m.create_user)
    # get 子命令
    parser_get = subparsers.add_parser('get', help="表示查询 1 个用户")
    parser_get.add_argument('-n', '--name', required=True, type=str, help="参数“-n 或 --name”支持指定名称查询,类型为 string")
    parser_get.add_argument('-o', '--output', type=str, help="参数“-o 或 output”支持查询该用户信息输出到文件,格式为 json 格式。")
    parser_get.set_defaults(func=user_m.get_user)
    # getall子命令
    parser_getll = subparsers.add_parser('getall', help="目前账号下所有的用户")
    parser_getll.add_argument('-o', '--output', type=str, help="参数“-o 或--output”支持输出到文件,格式为 yaml 格式。")
    parser_getll.set_defaults(func=user_m.list_all_user)
    # delete子命令
    parser_delete = subparsers.add_parser('delete', help="表示删除一个用户")
    parser_delete.add_argument('-n', '--name', required=True, type=str, help="参数“-n 或--name”支持指定名称查询,类型为 string")
    parser_delete.set_defaults(func=user_m.del_user)
    args = parser.parse_args()
    args.func(args)

文章作者: I W
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 I W !
  目录