基于Ubuntu2504部署OpenStack E版
OpenStack
- 初始化环境
- 安装数据库、memcahe、rabbitmq等服务
- 安装keystone服务
- 安装glance服务
- 安装placement服务
- 安装nova服务
- 安装neutron服务
- 安装horizon服务
官网
OpenStack Epoxy 巩固了作为 VMware 替代方案的地位,增强了安全性,并改进了硬件支持
第 31 版的亮点包括 Nova 中 PCI 直通的改进、Watcher 中添加新的 Prometheus 数据源以及 Manila 中的新安全功能。
随着 OpenStack 社区发布第 31 个版本 2025.1 Epoxy,OpenStack 的采用率正在飙升。 来自 BBC 研发中心、暴雪娱乐、Canonical、Cleura、爱立信、Mirantis、NVIDIA、Rackspace、Red Hat 和三星 SDS 等机构的约 450 名贡献者构建了 Epoxy,提供了超过 7,600 项变更和广泛的维护更新。此版本发布正值 OpenStack 社区成立 15 周年之际 。自2010 年以来,OpenStack 已提交超过 940,000 项变更,并已投入生产 4,500 万个核心,OpenStack 仍然是最活跃的开源项目社区之一。
-
强化OpenStack作为VMware的替代方案
Watcher 中新增了 Prometheus 数据源。对于 VMware 迁移,通过 Watcher 将 Prometheus 集成到 OpenStack 中,可以高效监控现有的 VMware 基础架构和迁移过程。这可以跟踪迁移过程中的性能并识别瓶颈。
此版本包含许多 Cinder 支持的存储硬件驱动程序的功能和错误修复,包括 NetApp、PowerMax、LightBits、Fujitsu、PowerFlex、3par、StorPool、Pure Storage、Nimble 和 Hitachi。对各种 Cinder 驱动程序的改进支持意味着简化了严重依赖特定存储解决方案的工作负载的迁移。此外,迁移后,OpenStack 环境可以保持与现有存储基础架构的兼容性,从而使过渡更加顺畅,并降低与存储和数据可访问性相关的风险。 -
增强安全性
Manila 用户现在可以修改共享访问规则的访问级别,将其从“只读”切换为“读写”,反之亦然。此功能可以更精确地控制哪些用户可以修改和访问共享资源。如果用户可以将其访问权限限制为只读,则可以防止未经授权的修改,从而降低数据被意外或恶意更改的风险。
马尼拉用户现在还可以通过共享网络子网元数据设置和修改共享服务器特性。云管理员可以通过 driver_updatable_subnet_metadata 配置选项定义允许的修改内容。此项改进可实现更好的网络隔离和分段,确保不同的数据集或应用程序被隔离在不同的子网中,从而降低发生违规时网络内部横向移动的风险。
在 Octavia 中,用户现在可以将自定义 Neutron 安全组与 Octavia Amphora 负载均衡器 VIP 端口结合使用。通过将特定安全组与负载均衡器的 VIP(虚拟 IP)端口关联,您可以确保只有特定类型的流量才能到达负载均衡器,从而降低未经授权访问的风险。 -
提高硬件支持能力
Ironic 新增了一个接口,支持将 bootc 容器镜像直接部署到主机,无需任何中间步骤。这降低了复杂性,使运维人员和最终用户的部署流程更加简化。
Nova 的 PCI 直通功能现已支持新的内核 vfio-PCI 变体驱动程序,例如 Ubuntu 24.04 上的 Nvidia GRID。操作员现在可以使用这些特定的 PCI 设备创建实例并进行实时迁移,从而增强 OpenStack 支持 AI 工作负载的能力。
初始化环境
单节点搭建
root@huhy:~# hostnamectlStatic hostname: huhyIcon name: computer-vmChassis: vm 🖴Machine ID: 3f78506c26d94d0fad063da03ea75679Boot ID: 06ec0de05bd449ce8e3a59d116855e8bProduct UUID: 4ef84d56-204b-38d6-0a02-5005f7746478AF_VSOCK CID: 4151600248Virtualization: vmware
Operating System: Ubuntu 25.04Kernel: Linux 6.14.0-15-genericArchitecture: x86-64Hardware Vendor: VMware, Inc.Hardware Model: VMware Virtual PlatformHardware Serial: VMware-56 4d f8 4e 4b 20 d6 38-0a 02 50 05 f7 74 64 78
Firmware Version: 6.00Firmware Date: Thu 2020-11-12Firmware Age: 4y 5month 6d
root@huhy:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroutevalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:74:64:78 brd ff:ff:ff:ff:ff:ffaltname enp2s1altname enx000c29746478inet 192.168.200.120/24 brd 192.168.200.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe74:6478/64 scope link proto kernel_llvalid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 00:0c:29:74:64:82 brd ff:ff:ff:ff:ff:ffaltname enp2s2altname enx000c29746482
- 初始化环境:免密,主机名、时间同步
vi init.sh
#!/bin/bash# 定义节点信息
NODES=("192.168.200.120 controller root")# 定义当前节点的密码(默认集群统一密码)
HOST_PASS="000000"# 时间同步的目标节点
TIME_SERVER=controller# 时间同步的地址段
TIME_SERVER_IP=192.160.200.0/24# 欢迎界面
cat > /etc/motd <<EOF################################# Welcome to openstack #################################
EOF# 修改主机名
for node in "${NODES[@]}"; doip=$(echo "$node" | awk '{print $1}')hostname=$(echo "$node" | awk '{print $2}')# 获取当前节点的主机名和 IPcurrent_ip=$(hostname -I | awk '{print $1}')current_hostname=$(hostname)# 检查当前节点与要修改的节点信息是否匹配if [[ "$current_ip" == "$ip" && "$current_hostname" != "$hostname" ]]; thenecho "Updating hostname to $hostname on $current_ip..."hostnamectl set-hostname "$hostname"if [ $? -eq 0 ]; thenecho "Hostname updated successfully."elseecho "Failed to update hostname."fibreakfi
done# 遍历节点信息并添加到 hosts 文件
for node in "${NODES[@]}"; doip=$(echo "$node" | awk '{print $1}')hostname=$(echo "$node" | awk '{print $2}')# 检查 hosts 文件中是否已存在相应的解析if grep -q "$ip $hostname" /etc/hosts; thenecho "Host entry for $hostname already exists in /etc/hosts."else# 添加节点的解析条目到 hosts 文件sudo sh -c "echo '$ip $hostname' >> /etc/hosts"echo "Added host entry for $hostname in /etc/hosts."fi
doneif [[ ! -s ~/.ssh/id_rsa.pub ]]; thenssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q -b 2048
fi# 检查并安装 sshpass 工具
if ! which sshpass &> /dev/null; thenecho "sshpass 工具未安装,正在安装 sshpass..."sudo apt-get install -y sshpass
fi# 遍历所有节点进行免密操作
for node in "${NODES[@]}"; doip=$(echo "$node" | awk '{print $1}')hostname=$(echo "$node" | awk '{print $2}')user=$(echo "$node" | awk '{print $3}')# 使用 sshpass 提供密码,并自动确认密钥sshpass -p "$HOST_PASS" ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub "$user@$hostname"
done# 时间同步
apt install -y chrony
if [[ $TIME_SERVER_IP == *$(hostname -I)* ]]; then# 配置当前节点为时间同步源sed -i '20,23s/^/#/g' /etc/chrony/chrony.confecho "server $TIME_SERVER iburst maxsources 2" >> /etc/chrony/chrony.confecho "allow $TIME_SERVER_IP" >> /etc/chrony/chrony.confecho "local stratum 10" >> /etc/chrony/chrony.conf
else# 配置当前节点同步到目标节点sed -i '20,23s/^/#/g' /etc/chrony/chrony.confecho "pool $TIME_SERVER iburst maxsources 2" >> /etc/chrony/chrony.conf
fi# 重启并启用 chrony 服务
systemctl restart chronyd
systemctl enable chronyecho "###############################################################"
echo "################# 集群初始化成功 #####################"
echo "###############################################################"
配置环境变量
mkdir /etc/openstack/
cat > /etc/openstack/openrc.sh << eof
#--------------------system Config--------------------##
#Controller Server Manager IP. example:x.x.x.x
HOST_IP=192.168.200.120#Controller HOST Password. example:000000
HOST_PASS=000000#Controller Server hostname. example:controller
HOST_NAME=controller#--------------------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=ens34#用于创建ovs网络
OVS_NAME=br-ens34#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
eof
- 查看客户端版本
root@controller:~# openstack --version
openstack 7.4.0
安装数据库、memcahe、rabbitmq等服务
vi iaas-install-mysql.sh
#!/bin/bash
source /etc/openstack/openrc.sh
apt update
# install package
apt install -y python3-openstackclient
apt install -y mariadb-server python3-pymysqlcat > /etc/mysql/mariadb.conf.d/99-openstack.cnf << EOF
[mysqld]
bind-address = 0.0.0.0
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
EOFsystemctl enable --now mariadb
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASS';"
mysql -uroot -p$DB_PASS -e "FLUSH PRIVILEGES"
systemctl restart mariadbapt install -y rabbitmq-server
rabbitmqctl add_user $RABBIT_USER $RABBIT_PASS
rabbitmqctl set_permissions $RABBIT_USER ".*" ".*" ".*"
systemctl enable --now rabbitmq-serverapt install -y memcached python3-memcache
sed -i 's/-l 127.0.0.1/-l 0.0.0.0/'g /etc/memcached.conf
systemctl enable --now memcached
echo "################# mariadb,rabbitmq,memcached installation completed ####################"
bash iaas-install-mysql.sh
安装keystone服务
vi iaas-install-keystone.sh
#!/bin/bash
source /etc/openstack/openrc.sh#keystone mysql
mysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS keystone ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '$KEYSTONE_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '$KEYSTONE_DBPASS' ;"apt install -y keystone
cp /etc/keystone/keystone.conf{,.bak}cat > /etc/keystone/keystone.conf << eof
[DEFAULT]
log_dir = /var/log/keystone
[application_credential]
[assignment]
[auth]
[cache]
[catalog]
[cors]
[credential]
[database]
connection = mysql+pymysql://keystone:$KEYSTONE_DBPASS@$HOST_NAME/keystone
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[extra_headers]
Distribution = Ubuntu
[federation]
[fernet_receipts]
[fernet_tokens]
[healthcheck]
[identity]
[identity_mapping]
[jwt_tokens]
[ldap]
[memcache]
[oauth1]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[policy]
[profiler]
[receipt]
[resource]
[revoke]
[role]
[saml]
[security_compliance]
[shadow_users]
[token]
provider = fernet
[tokenless_auth]
[totp]
[trust]
[unified_limit]
[wsgi]
eofsu -s /bin/sh -c "keystone-manage db_sync" keystone
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
keystone-manage bootstrap --bootstrap-password $ADMIN_PASS \--bootstrap-admin-url http://$HOST_NAME:5000/v3/ \--bootstrap-internal-url http://$HOST_NAME:5000/v3/ \--bootstrap-public-url http://$HOST_NAME:5000/v3/ \--bootstrap-region-id RegionOneecho "ServerName $HOST_NAME" >> /etc/apache2/apache2.conf
systemctl enable --now apache2cat > /etc/keystone/admin-openrc.sh << EOF
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=$ADMIN_PASS
export OS_AUTH_URL=http://$HOST_NAME:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
source /etc/keystone/admin-openrc.sh
openstack project create --domain default --description "Service Project" service
openstack token issue
echo "############################ keystone installation completed ###########################"
bash iaas-install-keystone.sh
- 查看版本
root@controller:~# keystone-manage --version
27.0.0
安装glance服务
vi iaas-install-glance.sh
#!/bin/bash
source /etc/openstack/openrc.sh
source /etc/keystone/admin-openrc.sh#glance mysql
mysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS glance ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY '$GLANCE_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY '$GLANCE_DBPASS' ;"openstack user create --domain $DOMAIN_NAME --password $GLANCE_PASS glance
openstack role add --project service --user glance admin
openstack service create --name glance --description "OpenStack Image" image
openstack endpoint create --region RegionOne image public http://$HOST_NAME:9292
openstack endpoint create --region RegionOne image internal http://$HOST_NAME:9292
openstack endpoint create --region RegionOne image admin http://$HOST_NAME:9292apt install -y glance
cp /etc/glance/glance-api.conf{,.bak}cat > /etc/glance/glance-api.conf << eof
[DEFAULT]
[barbican]
[barbican_service_user]
[cinder]
[cors]
[database]
connection = mysql+pymysql://glance:$GLANCE_DBPASS@$HOST_NAME/glance
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
[image_format]
disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop.root-tar
[keystone_authtoken]
www_authenticate_uri = http://$HOST_NAME:5000
auth_url = http://$HOST_NAME:5000
memcached_servers = $HOST_NAME:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = $GLANCE_PASS
[paste_deploy]
flavor = keystone
eofsu -s /bin/sh -c "glance-manage db_sync" glance
systemctl enable --now glance-api
systemctl restart glance-api
echo "########################## glance installation completed ###############################"
bash iaas-install-glance.sh
- 查看版本
root@controller:~# glance-manage --version
30.0.0
安装placement服务
vi iaas-install-placement.sh
#!/bin/bash
source /etc/openstack/openrc.sh
source /etc/keystone/admin-openrc.sh#placement mysql
mysql -uroot -p$DB_PASS -e "CREATE DATABASE placement;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY '$PLACEMENT_DBPASS';"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY '$PLACEMENT_DBPASS';"openstack user create --domain $DOMAIN_NAME --password $PLACEMENT_PASS placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "Placement API" placement
openstack endpoint create --region RegionOne placement public http://$HOST_NAME:8778
openstack endpoint create --region RegionOne placement internal http://$HOST_NAME:8778
openstack endpoint create --region RegionOne placement admin http://$HOST_NAME:8778apt install -y placement-apicp /etc/placement/placement.conf{,.bak}
cat > /etc/placement/placement.conf << eof
[DEFAULT]
[api]
auth_strategy = keystone
[cors]
[keystone_authtoken]
auth_url = http://$HOST_NAME:5000/v3
memcached_servers = $HOST_NAME:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = $PLACEMENT_PASS
[placement_database]
connection = mysql+pymysql://placement:$PLACEMENT_DBPASS@$HOST_NAME/placement
eofsu -s /bin/sh -c "placement-manage db sync" placement
systemctl restart apache2
placement-status upgrade check
echo "############################# placement installation completed #########################"
bash iaas-install-placement.sh
- 查看版本
root@controller:~# placement-manage --version
13.0.0
安装nova服务
vi iaas-install-nova-controller.sh
#!/bin/bash
source /etc/openstack/openrc.sh
source /etc/keystone/admin-openrc.shmysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS nova ;"
mysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS nova_api ;"
mysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS nova_cell0 ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '$NOVA_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '$NOVA_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '$NOVA_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '$NOVA_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '$NOVA_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '$NOVA_DBPASS' ;"openstack user create --domain $DOMAIN_NAME --password $NOVA_PASS nova
openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute
openstack endpoint create --region RegionOne compute public http://$HOST_NAME:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://$HOST_NAME:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://$HOST_NAME:8774/v2.1apt install -y nova-api nova-conductor nova-novncproxy nova-scheduler
apt install -y nova-compute
cp /etc/nova/nova.conf{,.bak}
cat > /etc/nova/nova.conf << eof
[DEFAULT]
log_dir = /var/log/nova
lock_path = /var/lock/nova
state_path = /var/lib/nova
transport_url = rabbit://$RABBIT_USER:$RABBIT_PASS@$HOST_NAME
my_ip = $HOST_IP
[api]
auth_strategy = keystone
[api_database]
connection = mysql+pymysql://nova:$NOVA_DBPASS@$HOST_NAME/nova_api
[barbican]
[barbican_service_user]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
connection = mysql+pymysql://nova:$NOVA_DBPASS@$HOST_NAME/nova
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://$HOST_NAME:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[keystone]
[keystone_authtoken]
www_authenticate_uri = http://$HOST_NAME:5000/
auth_url = http://$HOST_NAME:5000/
memcached_servers = $HOST_NAME:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = $NOVA_PASS
[libvirt]
[metrics]
[mks]
[neutron]
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[pci]
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://$HOST_NAME:5000/v3
username = placement
password = $PLACEMENT_PASS
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = $HOST_IP
server_proxyclient_address = $HOST_IP
novncproxy_base_url = http://$HOST_IP:6080/vnc_auto.html
[workarounds]
[wsgi]
[zvm]
[cells]
enable = False
[os_region_name]
openstack =
eofsu -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 list_cells" novasystemctl enable --now nova-api
systemctl enable --now nova-scheduler
systemctl enable --now nova-conductor
systemctl enable --now nova-novncproxycat > /root/nova-service-restart.sh <<EOF
#!bin/bash
# 处理api服务
service nova-api restart
# 处理资源调度服务
service nova-scheduler restart
# 处理数据库服务
service nova-conductor restart
# 处理vnc远程窗口服务
service nova-novncproxy restart
# 处理nova-compute服务
service nova-compute restart
EOF
nova-manage cell_v2 discover_hosts
nova-manage cell_v2 map_cell_and_hosts
bash /root/nova-service-restart.sh
echo "############################# nova installation completed ##############################"
bash iaas-install-nova-controller.sh
- 查看版本
root@controller:~# nova-manage --version
31.0.0
安装neutron服务
vi iaas-install-neutron-controller.sh
#!/bin/bash
source /etc/openstack/openrc.sh
source /etc/keystone/admin-openrc.shmysql -uroot -p$DB_PASS -e "create database IF NOT EXISTS neutron ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '$NEUTRON_DBPASS' ;"
mysql -uroot -p$DB_PASS -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '$NEUTRON_DBPASS' ;"openstack user create --domain $DOMAIN_NAME --password $NEUTRON_PASS neutron
openstack role add --project service --user neutron admin
openstack service create --name neutron --description "OpenStack Networking" network
openstack endpoint create --region RegionOne network public http://$HOST_NAME:9696
openstack endpoint create --region RegionOne network internal http://$HOST_NAME:9696
openstack endpoint create --region RegionOne network admin http://$HOST_NAME:9696cat >> /etc/sysctl.conf << EOF
# 用于控制系统是否开启对数据包源地址的校验,关闭
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
# 开启二层转发设备
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
modprobe br_netfilter
sysctl -papt install -y neutron-server neutron-plugin-ml2 neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agentcp /etc/neutron/neutron.conf{,.bak}
cat > /etc/neutron/neutron.conf << eof
[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
auth_strategy = keystone
state_path = /var/lib/neutron
dhcp_agent_notification = true
allow_overlapping_ips = true
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://$RABBIT_USER:$RABBIT_PASS@$HOST_NAME
[agent]
root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
[database]
connection = mysql+pymysql://neutron:$NEUTRON_DBPASS@$HOST_NAME/neutron
[keystone_authtoken]
www_authenticate_uri = http://$HOST_NAME:5000
auth_url = http://$HOST_NAME:5000
memcached_servers = $HOST_NAME:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = $NEUTRON_PASS
[nova]
auth_url = http://$HOST_NAME:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = $NOVA_PASS
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
eofcp /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak}
cat > /etc/neutron/plugins/ml2/ml2_conf.ini << eof
[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan,gre
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = $Physical_NAME
[ml2_type_geneve]
[ml2_type_gre]
[ml2_type_vlan]
[ml2_type_vxlan]
vni_ranges = $minvlan:$maxvlan
[ovs_driver]
[securitygroup]
enable_ipset = true
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[sriov_driver]
eofcp /etc/neutron/plugins/ml2/openvswitch_agent.ini{,.bak}
cat > /etc/neutron/plugins/ml2/openvswitch_agent.ini << eof
[DEFAULT]
[agent]
l2_population = True
tunnel_types = vxlan
prevent_arp_spoofing = True
[dhcp]
[network_log]
[ovs]
local_ip = $HOST_IP
bridge_mappings = $Physical_NAME:$OVS_NAME
[securitygroup]
eofcp /etc/neutron/l3_agent.ini{,.bak}
cat > /etc/neutron/l3_agent.ini << eof
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge =
[agent]
[network_log]
[ovs]
eofcp /etc/neutron/dhcp_agent.ini{,.bak}
cat > /etc/neutron/dhcp_agent.ini << eof
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
[agent]
[ovs]
eofcp /etc/neutron/metadata_agent.ini{,.bak}
cat > /etc/neutron/metadata_agent.ini << eof
[DEFAULT]
nova_metadata_host = $HOST_NAME
metadata_proxy_shared_secret = $METADATA_SECRET
[agent]
[cache]
eofsed -i '2s/.*/linuxnet_interface_driver = nova.network.linux_net.LinuxOVSlnterfaceDriver\n&/' /etc/nova/nova.conf
sed -i "50s/.*/auth_url = http:\/\/$HOST_NAME:5000\nauth_type = password\nproject_domain_name = default\nuser_domain_name = default\nregion_name = RegionOne\nproject_name = service\nusername = neutron\npassword = $NEUTRON_PASS\nservice_metadata_proxy = true\nmetadata_proxy_shared_secret = $METADATA_SECRET\n&/" /etc/nova/nova.confsu -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutronsystemctl restart nova-apiovs-vsctl add-br $OVS_NAME
ovs-vsctl add-port $OVS_NAME $INTERFACE_NAMEsystemctl enable --now neutron-server
systemctl enable --now neutron-openvswitch-agent
systemctl enable --now neutron-dhcp-agent
systemctl enable --now neutron-metadata-agent
systemctl enable --now neutron-l3-agentcat > /root/neutron-service-restart.sh <<EOF
#!bin/bash
# 提供neutron服务
service neutron-server restart
# 提供ovs服务
service neutron-openvswitch-agent restart
# 提供地址动态服务
service neutron-dhcp-agent restart
# 提供元数据服务
service neutron-metadata-agent restart
# 提供三层网络服务
service neutron-l3-agent restart
EOF
bash /root/neutron-service-restart.sh
echo "######################### neutron installation completed ###############################"
bash iaas-install-neutron-controller.sh
- 查看版本
root@controller:~# neutron-server --version
This program is using eventlet and has been monkey_patched
neutron-server 26.0.0
安装horizon服务
vi iaas-install-horizon.sh
#!/bin/bash
source /etc/openstack/openrc.sh
source /etc/keystone/admin-openrc.shapt install -y openstack-dashboardcp /etc/openstack-dashboard/local_settings.py{,.bak}
sed -i '126s/.*/OPENSTACK_HOST = "'$HOST_NAME'"/' /etc/openstack-dashboard/local_settings.py
sed -i '112s/.*/SESSION_ENGINE = '\''django.contrib.sessions.backends.cache'\''/' /etc/openstack-dashboard/local_settings.py
sed -i '127s#.*#OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST#' /etc/openstack-dashboard/local_settings.py
echo "OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True" >> /etc/openstack-dashboard/local_settings.py
echo "OPENSTACK_API_VERSIONS = {\"identity\": 3,\"image\": 2,\"volume\": 3,
}" >> /etc/openstack-dashboard/local_settings.py
echo "OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = \"Default\"" >> /etc/openstack-dashboard/local_settings.py
echo 'OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"' >> /etc/openstack-dashboard/local_settings.py
echo "OPENSTACK_CINDER_FEATURES = {'enable_backup': True,
}" >> /etc/openstack-dashboard/local_settings.py
sed -i '131s/.*/TIME_ZONE = "Asia\/Shanghai"/' /etc/openstack-dashboard/local_settings.pysystemctl reload apache2
echo "######################### horizon installation completed ###############################"
bash iaas-install-horizon.sh
- 浏览器访问web服务:IP/horizon(admin/000000)
相关文章:
基于Ubuntu2504部署OpenStack E版
OpenStack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务 官网 OpenStack Epoxy 巩固了作为 VMware 替代方案的地位,增强了安全性,并改进了硬件支持 第 3…...
Jsp技术入门指南【七】JSP动作讲解
Jsp技术入门指南【七】JSP动作讲解 前言一、什么是JSP动作?二、核心JSP动作详解1. jsp:include:动态包含其他页面与<% include %>的区别 2. jsp:forward:请求转发到另一个页面3. jsp:param:为动作传递参数4. jsp:useBean&am…...
电脑 访问 github提示 找不到网页,处理方案
1、找到 本机的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理员身份打开 hosts 文件 如果文件中没有 github的配置,需要自己手动添加上去; 如果有,则需要 检查 github.com 与 github.global.ssl.fastly.…...
性能比拼: Elixir vs Go
本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 对比 Elixir 和 Go 简介 许多人长期以来一直要求我对比 Elixir 和 Go。在本视频…...
动手实现文本生成模型:基于 Decoder-only Transformer (PyTorch)
1. 选择框架:PyTorch 我们选择 PyTorch 作为实现框架。PyTorch 提供了灵活的动态图,并且拥有功能强大的 nn.Transformer 模块,方便我们快速构建模型。其社区活跃,资源丰富,是进行深度学习研究和开发的优秀选择。 确保你已经安装了 PyTorch 和其他必要的库: Bash pip i…...
WSL+Ubuntu+miniconda环境配置
安装到指定目录 bash Miniconda3-latest-Linux-x86_64.sh -b -p /usr/local/miniconda3添加环境变量 echo export PATH"/usr/local/miniconda3/bin:$PATH" >> /etc/profile echo export PATH"/usr/local/miniconda3/bin:$PATH" >> ~/.bashrc…...
linux学习 5 正则表达式及通配符
重心应该放在通配符的使用上 正则表达式 正则表达式是用于 文本匹配和替换 的强大工具 介绍两个交互式的网站来学习正则表达式 regexlearn 支持中文 regexone 还有一个在线测试的网址 regex101 基本规则 符号作用示例.匹配任何字符除了换行a.b -> axb/a,b[abc]匹配字符…...
【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧
一、Nginx 在 Web 服务器场景中的深度应用 1.1 静态网站部署与优化 在 CentOS 7 系统中,使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先,准备网站文件,在/var/www/html目录下创建index.html文件: sudo mkdir -p…...
详解与HTTP服务器相关操作
HTTP 服务器是一种遵循超文本传输协议(HTTP)的服务器,用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍: 工作原理 HTTP 服务器监听指定端口(通常是 80 端口用于 HTTP,443 端口用于 HT…...
LeetCode 2563.统计公平数对的数目:排序 + 二分查找
【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…...
Manus技术架构、实现内幕及分布式智能体项目实战
Manus技术架构、实现内幕及分布式智能体项目实战 模块一: 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议,构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二: 解析Manus大模型Agent操作电脑的原理与关键API…...
基于springboot的个人财务管理系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码
热管理:新能源汽车的隐形守护者 在新能源汽车飞速发展的今天,热管理系统作为保障车辆核心部件稳定运行的关键,正逐渐成为行业关注的焦点。据市场研究机构的数据显示,近年来新能源汽车的销量持续攀升,而与之相伴的是热…...
Ubuntu开启自启动PostgreSQL读取HDD失败处理思路
前置文章: windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享Ubuntu挂载HDD迁移存储PostgreSQL数据 背景: 启动实体Ubuntu机器后后很大的概率PostgreSQL不会成功启动,查看日志: Ubuntu启动时间: rootPine…...
损失函数总结
目录 回归问题L1损失 平均绝对值误差(MAE)Smooth L1 LossL2损失 均方误差损失MSE 分类问题交叉熵损失KL 散度损失 KLDivLoss负对数似然损失 NLLLoss 排序MarginRankingLoss 回归问题 L1损失 平均绝对值误差(MAE) 指模型预测值f(x…...
LeetCode 热题 100:回溯
46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入ÿ…...
Jetson Orin NX 部署YOLOv12笔记
步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意:YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…...
『Linux_网络』 第二章 UDP_Socket编程
学习了网络的概念了,接下来我们开始实践,本次我们会通过UDP来模拟实现UDP客户端和UDP服务器之间的通信,以及在此基础上扩展几个应用。 下面,我们将使用socket,bind,htons等接口实现UDP网络通信。 v1 版本 …...
【leetcode刷题日记】lc.322-零钱兑换
目录 1.题目 2.代码 1.题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认…...
从GET到POST:HTTP请求的攻防实战与CTF挑战解析
初探HTTP请求:当浏览器遇见服务器 基础协议差异可视化 # 典型GET请求 GET /login.php?username=admin&password=p@ssw0rd HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0# 典型POST请求 POST /login.php HTTP/1.1 Host: example.com Content-Type: application/x…...
实现Azure Data Factory安全地请求企业内部API返回数据
需要配置一个Web Activity组件在Azure云上的Azure Data Factory运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账…...
JDOM处理XML:Java程序员的“乐高积木2.0版“
各位代码建筑师们!今天我们要玩一款比原生DOM更"Java友好"的XML积木套装——JDOM!它像乐高得宝系列(Duplo)一样简单易用,却能让你的XML工程稳如霍格沃茨城堡!(温馨提示:别…...
Grouped Query Attention (GQA) PyTorch实现
个人在网上看到的实现好像都长得奇奇怪怪的,没有简洁的感觉,因此在这里给出一种易读的GQA实现方法: import torch import torch.nn as nn import torch.nn.functional as Fclass GroupedQueryAttention(nn.Module):def __init__(self, embed…...
《AI大模型应知应会100篇》第27篇:模型温度参数调节:控制创造性与确定性
第27篇:模型温度参数调节:控制创造性与确定性 摘要 在大语言模型的使用中,“温度”(Temperature)是一个关键参数,它决定了模型输出的创造性和确定性之间的平衡。通过调整温度参数,您可以根据任…...
演讲比赛流程管理项目c++
对于一个基本项目,先分析基本的东西有哪些 1.类 演讲管理类:用于编写比赛流程用的功能 演讲者类:包含姓名,分数 创建比赛流程:创建选手12个人,分为两组,6人一组,每组进行两轮比赛࿰…...
在小米AX6000中通过米家控制tailscale
由于tailscale占用内存较大,AX6000中的可用内存非常有限,所以需要对AX6000的内存使用进行优化: 1.减小tmpfs内存占用的大小: #从150M -> 90M,由于tailscale下载安装包是27M作用, 解压后50M左右…...
REC: 引爆全球万亿级市场!Web3+消费革命重塑全球-东南亚-跨境商业未来
在全球数字经济浪潮下,东南亚已成为增长最快的互联网市场之一,其与全球之间蓬勃发展的跨境贸易更是蕴藏着巨大潜力。然而,传统模式下的效率瓶颈、信任壁垒和用户激励难题日益凸显。在此背景下,基于去中心化与消费相结合的 REC 颠覆…...
微服务与事件驱动架构(EDA)
微服务架构 微服务架构核心特征 服务自治:每个服务拥有独立的代码库、数据库和运维流程。轻量级通信:服务间通过API(REST/gRPC)或消息队列(如Kafka)交互。去中心化治理:允许技术栈多样化&…...
单片机如何通过串口与上位机进行数据交换
单片机通过串口与上位机进行数据交换是一种常见的方式,广泛应用于嵌入式系统中。以下是实现这一功能的具体步骤和注意事项: 1. 硬件连接 在硬件层面,需要确保单片机和上位机之间的串口连接正确: 信号线连接:通常使用…...
AI速读 Seed-Thinking-v1.5:大模型推理的新飞跃
在大语言模型(LLM)蓬勃发展的今天,推理模型的性能提升成为了AI领域的关键议题。今天为大家解读的论文,带来了名为Seed-Thinking-v1.5的推理模型,它在多个任务上表现惊艳,还创新性地解决了不少难题ÿ…...
Mysql从入门到上手(二)-全面了解增删改查(CRUD).
一、检索数据 MySQL 中的检索数据操作是数据库操作中最常见的任务之一。使用 SQL 查询语言中的 SELECT 语句,可以从数据库中的一个或多个表中检索数据。以下是 MySQL 中与数据检索相关的各种技术和用法的详细讲解。 1.1、基本查询 最基本的查询是使用 SELECT 语句来…...
220V转5V转12V电机驱动供电WT5105
220V转5V转12V电机驱动供电WT5105 WT5105 芯片概述 WT5105 是一款集成非隔离式电源控制器,内部集成了 650V 高雪崩能力功率 MOSFET 以及高压启动与自供电电路。该芯片具有多模式输出的特点,输出电压可通过 FB 电阻灵活调整,能够实现 3.3V 以…...
基于Python Django 的全国房价大数据可视化系统(附源码,部署)
博主介绍:✌程序员徐师兄,7年大厂开发经验。全网粉丝12w,CSDN博客专家,同时活跃在掘金、华为云、阿里云、InfoQ等平台,专注Java技术和毕业项目实战分享✌ 🍅文末获取源码联系🍅 👇&a…...
leetcode0113. 路径总和 II - medium
1 题目:路径总和 II 官方标定难度:中 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root …...
day46——两数之和-输入有序数组(LeetCode-167)
题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 &l…...
数据结构:以一个例题演示弗洛伊德算法
例 8.5.2 利用弗洛伊德算法,对图 8.5.5 中左侧的带权有向图求最短路径,给出每一对顶点之间的最短路径及其路径长度在求解过程中的变化。 图 8.5.5 带权图和邻接矩阵 【解】 根据图 8.5.5 中的带权有向图,可得所对应的邻接矩阵 g g g &#…...
Nginx 报错403 排查与解决
目录 前言-环境基础问题出现:403 Forbidden问题排查问题解决 前言 今天领导让我部署一个前端项目,一顿操作报错访问报错403,让我们一起搞定他。 环境 CentOS 7 x86 的服务器上部署了 Nginx 服务器。 配置文件 我把前端项目打包后的 dist 文件夹放在了 /root/…...
React-useImperativeHandle (forwardRef)
我们会遇到这样的场景:某个组件想要暴露一些方法,来供外部组件来调用。例如我们在开发form表单的时候,就需要把设置表单值、重置值、提交等方法暴露给外部使用。会有如下代码: import { forwardRef } from react;const Form for…...
研一自救指南 - 07. CSS面向面试学习
最近的前端面试多多少少都会遇到css的提问,感觉还是要把重点内容记记背背。这里基于b站和我自己面试的情况整理。 20250418更新: 1. BFC Block Formatting Context,一个块级的盒子,可以创建多个。里面有很多个块,他们…...
生成式人工智能驱动下的个性化学习资源开发研究——以K12学科知识图谱构建为例
一、引言 1.1 研究背景与意义 在当今数字化时代,教育领域正经历着深刻的变革,生成式 AI 技术的迅猛发展为 K12 教育带来了新的契机与挑战。长期以来,K12 教育主要采用标准化教学模式,这种 “一刀切” 的方式难以满足学生多样化的…...
A股周度复盘与下周策略 的deepseek提示词模板
以下是反向整理的股票大盘分析提示词模板,采用结构化框架数据占位符设计,可直接套用每周市场数据: 请根据一下markdown格式的模板,帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…...
性能比拼: Deno vs. Node.js vs. Bun (2025版)
本内容是对知名性能评测博主 Anton Putra Deno vs. Node.js vs. Bun: Performance Comparison 2025 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将使用当前可用的最新版本对 Node.js、Bun 和 Deno 进行比较。我决定更新本视频&#x…...
猫咪如厕检测与分类识别系统系列【十二】猫咪进出事件逻辑及日志优化
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如…...
stm32| 中断标志位和中断挂起位 | TIM_ClearFlag 函数和TIM_ClearITPendingBit 函数
1. 中断标志位(Interrupt Flag) 作用: 中断标志位位于外设寄存器中(如定时器的TIMx_SR、GPIO的EXTI_PR等),用于指示某个特定事件是否发生(例如定时器溢出、GPIO引脚电平变化)。该标志…...
QML Rectangle 组件
基本属性 属性类型默认值描述colorcolor"white"矩形填充颜色border.colorcolor"transparent"边框颜色border.widthint0边框宽度radiusreal0圆角半径gradientGradientnull渐变填充antialiasingbooltrue是否抗锯齿 几何属性 (继承自Item) 属性类型默认值描…...
Spring 学习笔记之 @Transactional详解
一、数据库事务基础 数据库事务(Transaction)是数据库管理系统中用于确保数据一致性和完整性的一种机制。它是一组操作的集合,这些操作要么全部成功,要么全部失败,从而保证数据库状态的正确性。 1.1 事务的基本概念 定…...
绕过UI的cooke和token的验证
很多的网站都在登录页面加入了识别文字,识别图片,拖动拼图的验证码方式来防止爬虫、恶意注册等,如果是做自动化,需要绕过 验证码才能进入下一步操作。 方案一、测试环境去除验证码 :最轻松的方法,找开发帮忙…...
2024-04-19| Java: Documented注解学习 JavaDoc
在 Java 中,Documented 是一个元注解(meta-annotation),用于标记其他注解,表明这些注解应该被包含在 JavaDoc 文档中。以下是关于 Documented 注解的作用的简要说明: 作用 记录注解信息到 JavaDoc&#x…...
09-DevOps-Jenkins实现CI持续集成
前面已经把harbor搭建好了,也可以向harbor中推送自定义镜像。 原计划是在Jenkins这台服务器上,完成镜像构建,然后把镜像推送的harbor仓库中。现在改变计划了,Jenkins所在的服务器(192.168.1.10)不负责镜像…...
Java中包装类和泛型
包装类和泛型 包装类装箱和拆箱 泛型泛型的概念泛型的使用泛型的上界 通配符通配符概念通配符上界通配符下界 前言 在Java中,由于基本类型不是继承⾃Object,为了在泛型中可以⽀持基本类型,Java给每个基本类型都对应了⼀个包装类型,…...