教程:在 Azure 虚拟机 (VM) 上手动安装 JBoss EAP
本教程介绍在 Red Hat Enterprise Linux (RHEL) 上安装 Red Hat JBoss 企业应用程序平台 (EAP) 并在 Azure 虚拟机 (VM) 上在域模式下配置群集的步骤。
本教程介绍如何执行以下任务:
- 创建自定义虚拟网络,并在网络中创建 VM。
- 使用命令行手动在 VM 上安装所需的 JDK 和 Red Hat JBoss EAP。
- 使用命令行接口 (CLI) 在域模式下配置 Red Hat JBoss EAP 群集。
- 在群集中配置 PostgreSQL 数据源连接。
- 在群集中部署并运行示例 Java EE 应用程序。
- 通过 Azure 应用程序网关将应用程序公开给公共 Internet。
- 验证成功配置。
如果你更喜欢直接从 Azure 门户在 GNU/Linux VM 上代表你完成所有这些步骤的全自动解决方案,请参阅快速入门:在 Azure 虚拟机 (VM) 上部署 JBoss EAP 群集。
如果你有兴趣提供反馈或与开发 Azure 上的 JBoss EAP 解决方案的工程团队就迁移方案展开密切合作,请填写这份简短的 Boss EAP 迁移调查并提供你的联系信息。 项目经理、架构师和工程师团队会及时与你联系,以开展密切合作。
注意
本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 在从软件中删除该术语后,我们会将其从本文中删除。
先决条件
安装 Azure CLI 2.51.0 或更高版本以运行 Azure CLI 命令。
- 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
- 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
确保拥有必要的 Red Hat 许可证。 你需要拥有具有 Red Hat 订阅管理 (RHSM) 权利的 Red Hat 帐户,才能使用 Red Hat JBoss EAP。 此权利允许全自动解决方案(在快速入门:在 Azure 虚拟机 (VM) 上部署 JBoss EAP 群集)安装经过 Red Hat 测试和认证的 JBoss EAP 版本。
注意
如果你没有 EAP 权利,可以通过适用于个人的 Red Hat 开发人员订阅注册免费的开发人员订阅。 保存帐户详细信息,这些详细信息将在下一节中用作 RHSM 用户名和 RHSM 密码。
如果已注册,或者在完成注册后,可以使用以下步骤找到必要的凭据(池 ID)。 在后续步骤中,这些池 ID 也用作具有 EAP 权利的 RHSM 池 ID。
登录到你的 Red Hat 帐户。
首次登录时,系统会提示你填写个人资料。 根据使用情况,为帐户类型选择个人或公司,如以下屏幕截图所示:
打开 Red Hat 开发人员订阅个人版。 此链接可访问你的帐户中相应 SKU 的所有订阅。
在所有已购买的订阅表下的控件行中,选择活动。
选择结束日期的可排序列标题,直到将来最远的值显示为第一行。
选择第一行。 然后,从池 ID 中复制并保存主池后面的值。
Java 开发工具包 (JDK),版本 11。 在本指南中,我们推荐 Red Hat Build of OpenJDK。 确保在运行命令的 shell 中正确设置
JAVA_HOME
环境变量。Git;使用
git --version
测试git
是否有效。 本教程已使用版本 2.25.1 进行测试。Maven;使用
mvn -version
测试mvn
是否有效。 本教程已使用版本 3.6.3 进行测试。
准备环境
在本节中,将设置在其中安装 JDK、Red Hat JBoss EAP 和 PostgreSQL Java Database Connectivity (JDBC) 驱动程序的基础结构。
假设
本教程在域模式下配置 Red Hat JBoss EAP 群集,在总共三个 VM 上使用一个管理服务器和两个托管服务器。 若要配置群集,需要创建以下三个 Azure VM:
- 管理员 VM(VM 名称
adminVM
)作为域控制器运行。 - 两个托管 VM(VM 名称
mspVM1
和mspVM2
)作为主机控制器运行。
登录 Azure
如果尚未这样做,请使用 az login 命令登录到 Azure 订阅,并遵照屏幕上的指示操作:
az login
注意
如果多个 Azure 租户与你的 Azure 凭据关联,必须指定要登录到哪个租户。 可以通过 --tenant
选项执行此操作。 例如,az login --tenant contoso.onmicrosoft.com
。
创建资源组
使用 az group create 创建资源组。 资源组名称在订阅中必须全局唯一。 因此,请考虑在创建的任何必须唯一的名称前面附加一些唯一标识符。 一种有用的方法是使用首字母缩写,后跟今天的日期(格式为 mmdd
)。 此示例在 westus
位置创建一个名为 $RESOURCE_GROUP_NAME
的资源组:
export SUBSCRIPTION=$(az account show --query id --output tsv)
export SUFFIX=$(date +%s)
export RESOURCE_GROUP_NAME=rg-$SUFFIX
echo "Resource group name: $RESOURCE_GROUP_NAME"
az group create \
--name $RESOURCE_GROUP_NAME \
--location westus
创建虚拟网络
由 Red Hat JBoss EAP 群集组成的资源必须使用虚拟网络相互通信,并与公共 Internet 通信。 有关规划虚拟网络的完整指南,请参阅 Azure 的云采用框架指南计划虚拟网络。 有关详细信息,请参阅 Azure 虚拟网络常见问题解答。
本节中的示例创建了一个地址空间为 192.168.0.0/16
的虚拟网络,并创建了 VM 使用的子网。
首先,使用 az network vnet create 创建一个虚拟网络。 以下示例创建一个名为 myVNet
的网络。
az network vnet create \
--resource-group $RESOURCE_GROUP_NAME \
--name myVNet \
--address-prefixes 192.168.0.0/24
使用 az network vnet subnet create 为 Red Hat JBoss EAP 群集创建子网。 以下示例创建名为 mySubnet
的子网:
az network vnet subnet create \
--resource-group $RESOURCE_GROUP_NAME \
--name mySubnet \
--vnet-name myVNet \
--address-prefixes 192.168.0.0/25
使用 az network vnet subnet create 为应用程序网关创建子网。 以下示例创建名为 jbossVMGatewaySubnet
的子网:
az network vnet subnet create \
--resource-group $RESOURCE_GROUP_NAME \
--name jbossVMGatewaySubnet \
--vnet-name myVNet \
--address-prefixes 192.168.0.128/25
创建网络安全组并为其分配子网
在使用公共 IP 创建 VM 之前,请创建网络安全组 (NSG),以保护之前创建的虚拟网络和子网。
使用 az network nsg create 创建网络安全组。 以下示例创建名为 mynsg
的网络安全组:
az network nsg create \
--resource-group $RESOURCE_GROUP_NAME \
--name mynsg
使用 az network nsg rule create 创建网络安全组规则。 以下示例创建名为 ALLOW_APPGW
和 ALLOW_HTTP_ACCESS
的网络安全组规则。 这些规则允许应用程序网关接受 Red Hat JBoss EAP 使用的 HTTP 端口上的入站流量:
az network nsg rule create \
--resource-group $RESOURCE_GROUP_NAME \
--nsg-name mynsg \
--name ALLOW_APPGW \
--protocol Tcp \
--destination-port-ranges 65200-65535 \
--source-address-prefix GatewayManager \
--destination-address-prefix '*' \
--access Allow \
--priority 500 \
--direction Inbound
az network nsg rule create \
--resource-group $RESOURCE_GROUP_NAME \
--nsg-name mynsg \
--name ALLOW_HTTP_ACCESS \
--protocol Tcp \
--destination-port-ranges 22 80 443 9990 8080 \
--source-address-prefix Internet \
--destination-address-prefix '*' \
--access Allow \
--priority 510 \
--direction Inbound
使用 az network vnet subnet update 将之前创建的子网与此网络安全组相关联,如以下示例所示:
az network vnet subnet update \
--resource-group $RESOURCE_GROUP_NAME \
--vnet-name myVNet \
--name mySubnet \
--network-security-group mynsg
az network vnet subnet update \
--resource-group $RESOURCE_GROUP_NAME \
--vnet-name myVNet \
--name jbossVMGatewaySubnet \
--network-security-group mynsg
为管理员创建 Red Hat Enterprise Linux 计算机
生成 SSH 密钥
使用以下命令为以下项生成 SSH 密钥 adminVM
:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/jbosseapvm
ssh-add ~/.ssh/jbosseapvm
创建管理 VM
用于创建 VM 的市场映像为 RedHat:rhel-raw:86-gen2:latest
。 有关其他映像,请参阅 Azure 中提供的 Red Hat Enterprise Linux (RHEL) 映像。
注意
可以使用 az vm image list 命令查询 Red Hat 提供的所有可用 Red Hat Enterprise Linux 映像,例如:az vm image list --offer RHEL --publisher RedHat --output table --all
。 有关详细信息,请参阅 Red Hat Enterprise Linux 映像概述。
如果使用其他映像,可能需要安装额外的库才能启用本指南中使用的基础结构。
创建一个基本 VM,在其上安装所有必需的工具,对其进行快照,然后基于快照创建副本。
运行 az vm create 创建 VM。 在此 VM 上运行管理服务器。
以下示例使用 TLS/SSL 身份验证创建 Azure 托管标识和 Red Hat Enterprise Linux VM。
az identity create \
--name "passwordless-managed-identity" \
--resource-group $RESOURCE_GROUP_NAME \
--location westus
az vm create \
--resource-group $RESOURCE_GROUP_NAME \
--name adminVM \
--image RedHat:rhel-raw:86-gen2:latest \
--assign-identity "/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity" \
--size Standard_DS1_v2 \
--admin-username azureuser \
--ssh-key-values ~/.ssh/jbosseapvm.pub \
--public-ip-sku Standard \
--nsg mynsg \
--vnet-name myVnet \
--subnet mySubnet
安装 Red Hat JBoss EAP
使用以下步骤安装:
使用以下命令获取
adminVM
的公共 IP:export ADMIN_VM_PUBLIC_IP=$(az vm show \ --resource-group $RESOURCE_GROUP_NAME \ --name adminVM \ --show-details \ --query publicIps | tr -d '"')
使用以下命令打开终端,并通过 SSH 连接到
adminVM
:ssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP
使用以下命令为端口配置防火墙:
sudo firewall-cmd --zone=public --add-port={9999/tcp,8443/tcp,8009/tcp,8080/tcp,9990/tcp,9993/tcp,45700/tcp,7600/tcp} --permanent sudo firewall-cmd --reload sudo iptables-save
应在前两个命令后看到
success
一词。 在第三个命令之后,应看到类似于以下示例的输出:# Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023 *filter :INPUT ACCEPT [20:3546] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [24:5446] COMMIT # Completed on Wed Mar 29 22:39:23 2023 # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023 *security :INPUT ACCEPT [19:3506] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [5:492] -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT -A OUTPUT -d 168.63.129.16/32 -p tcp -m owner --uid-owner 0 -j ACCEPT -A OUTPUT -d 168.63.129.16/32 -p tcp -m conntrack --ctstate INVALID,NEW -j DROP COMMIT # Completed on Wed Mar 29 22:39:23 2023 # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023 *raw :PREROUTING ACCEPT [20:3546] :OUTPUT ACCEPT [24:5446] COMMIT # Completed on Wed Mar 29 22:39:23 2023 # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023 *mangle :PREROUTING ACCEPT [20:3546] :INPUT ACCEPT [20:3546] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [24:5446] :POSTROUTING ACCEPT [24:5446] COMMIT # Completed on Wed Mar 29 22:39:23 2023 # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023 *nat :PREROUTING ACCEPT [1:40] :INPUT ACCEPT [0:0] :POSTROUTING ACCEPT [4:240] :OUTPUT ACCEPT [4:240] COMMIT # Completed on Wed Mar 29 22:39:23 2023
注意
RHSM_USER
安装 Red Hat JBoss EAP 需要这些值和RHSM_PASSWORD
值。 建议使用具有有限权限的服务帐户访问 Red Hat 客户门户。
使用以下命令将管理主机注册到 Red Hat Subscription Management (RHSM) 帐户:
export RHSM_USER=<your-rhsm-username> export RHSM_PASSWORD='<your-rhsm-password>' export EAP_POOL=<your-rhsm-pool-ID> sudo subscription-manager register --username ${RHSM_USER} --password ${RHSM_PASSWORD} --force
应会看到与如下示例类似的输出:
Registering to: subscription.rhsm.redhat.com:443/subscription The system has been registered with ID: redacted The registered system name is: adminVM
使用以下命令将管理主机连接到 Red Hat JBoss EAP 池:
sudo subscription-manager attach --pool=${EAP_POOL}
注意
如果使用的是简单内容访问模式,则忽略此命令。
使用以下命令安装 Red Hat JBoss EAP:
sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*' sudo yum groupinstall -y jboss-eap7
对于第二个和第三个命令,应会看到许多输出行,以 Complete!
结尾
使用以下命令设置权限和网络配置:
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config echo 'AllowTcpForwarding no' | sudo tee -a /etc/ssh/sshd_config sudo systemctl restart sshd
使用以下命令配置环境变量:
echo 'export EAP_RPM_CONF_DOMAIN="/etc/opt/rh/eap7/wildfly/eap7-domain.conf"' >> ~/.bash_profile echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' >> ~/.bash_profile source ~/.bash_profile sudo touch /etc/profile.d/eap_env.sh echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' | sudo tee -a /etc/profile.d/eap_env.sh
通过键入 exit 退出 SSH 连接。
为托管服务器创建计算机
在 adminVM
上安装了 Red Hat JBoss EAP,它作为域控制器服务器运行。 你仍然需要准备计算机来运行这两台主机控制器服务器。 接下来,创建 adminVM
的快照,并为两个托管服务器 mspVM1
和 mspVM2
准备计算机。
本节介绍一种使用 adminVM
的快照准备计算机的方法。 返回到已登录 Azure CLI 的终端,然后使用以下步骤:
使用以下命令停止
adminVM
:az vm stop --resource-group $RESOURCE_GROUP_NAME --name adminVM
使用 az snapshot create 为
adminVM
OS 磁盘拍摄快照,如下例所示:export ADMIN_OS_DISK_ID=$(az vm show \ --resource-group $RESOURCE_GROUP_NAME \ --name adminVM \ --query storageProfile.osDisk.managedDisk.id \ --output tsv) az snapshot create \ --resource-group $RESOURCE_GROUP_NAME \ --name myAdminOSDiskSnapshot \ --source ${ADMIN_OS_DISK_ID}
使用以下命令启动
adminVM
:az vm start --resource-group $RESOURCE_GROUP_NAME --name adminVM
使用以下步骤创建
mspVM1
:首先,使用 az disk create 为
mspVM1
创建托管磁盘:#Get the snapshot ID export SNAPSHOT_ID=$(az snapshot show \ --name myAdminOSDiskSnapshot \ --resource-group $RESOURCE_GROUP_NAME \ --query '[id]' \ --output tsv) #Create a new Managed Disks using the snapshot Id #Note that managed disk is created in the same location as the snapshot az disk create \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM1_OsDisk_1 \ --source ${SNAPSHOT_ID}
接下来,使用以下命令创建 VM
mspVM1
,并附加 OS 磁盘mspVM1_OsDisk_1
:#Get the resource Id of the managed disk export MSPVM1_DISK_ID=$(az disk show \ --name mspVM1_OsDisk_1 \ --resource-group $RESOURCE_GROUP_NAME \ --query '[id]' \ --output tsv) #Create VM by attaching existing managed disks as OS az vm create \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM1 \ --assign-identity "/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity" \ --attach-os-disk ${MSPVM1_DISK_ID} \ --os-type linux \ --public-ip-sku Standard \ --nsg mynsg \ --vnet-name myVnet \ --subnet mySubnet
你在安装 Red Hat JBoss EAP 的情况下创建
mspVM1
。 由于 VM 是从adminVM
OS 磁盘的快照创建的,因此这两个 VM 具有相同的主机名。 使用 az vm run-command invoke 将主机名更改为值mspVM1
:az vm run-command invoke \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM1 \ --command-id RunShellScript \ --scripts "sudo hostnamectl set-hostname mspVM1"
当命令成功完成时,你将看到类似于以下示例的输出:
{ "value": [ { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "Enable succeeded: \n[stdout]\n\n[stderr]\n", "time": null } ] }
使用相同的命令创建
mspVM2
:#Create a new Managed Disks for mspVM2 az disk create \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM2_OsDisk_1 \ --source ${SNAPSHOT_ID} #Get the resource Id of the managed disk export MSPVM2_DISK_ID=$(az disk show \ --name mspVM2_OsDisk_1 \ --resource-group $RESOURCE_GROUP_NAME \ --query '[id]' \ --output tsv) #Create VM by attaching existing managed disks as OS az vm create \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM2 \ --assign-identity "/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity" \ --attach-os-disk ${MSPVM2_DISK_ID} \ --os-type linux \ --public-ip-sku Standard \ --nsg mynsg \ --vnet-name myVnet \ --subnet mySubnet #Set hostname az vm run-command invoke \ --resource-group $RESOURCE_GROUP_NAME \ --name mspVM2 \ --command-id RunShellScript \ --scripts "sudo hostnamectl set-hostname mspVM2"
使用以下命令获取并显示专用 IP 地址,稍后部分将用到这些地址:
export ADMINVM_NIC_ID=$(az vm show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name adminVM \
--query networkProfile.networkInterfaces'[0]'.id \
--output tsv)
export ADMINVM_IP=$(az network nic show \
--ids ${ADMINVM_NIC_ID} \
--query ipConfigurations'[0]'.privateIPAddress \
--output tsv)
export MSPVM1_NIC_ID=$(az vm show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name mspVM1 \
--query networkProfile.networkInterfaces'[0]'.id \
--output tsv)
export MSPVM1_IP=$(az network nic show \
--ids ${MSPVM1_NIC_ID} \
--query ipConfigurations'[0]'.privateIPAddress \
--output tsv)
export MSPVM2_NIC_ID=$(az vm show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name mspVM2 \
--query networkProfile.networkInterfaces'[0]'.id \
--output tsv)
export MSPVM2_IP=$(az network nic show \
--ids ${MSPVM2_NIC_ID} \
--query ipConfigurations'[0]'.privateIPAddress \
--output tsv)
echo "Private IP of adminVM: ${ADMINVM_IP}"
echo "Private IP of mspVM1: ${MSPVM1_IP}"
echo "Private IP of mspVM2: ${MSPVM2_IP}"
现在,三台计算机都已准备就绪。 接下来,在托管域模式下配置 Red Hat JBoss EAP 群集。
配置托管域和群集
配置启用了会话复制的群集。 有关详细信息,请参阅会话复制。
若要启用会话复制,请为群集使用 Red Hat JBoss EAP 高可用性。 Microsoft Azure 不支持基于多播的 JGroups 发现协议。 尽管可以使用其他 JGroups 发现协议(如静态配置 (TCPPING
)、共享数据库 (JDBC_PING
)、基于共享文件系统的 ping((FILE_PING
) 或 TCPGOSSIP
),但强烈建议使用为 Azure 开发的共享文件发现协议:AZURE_PING
。 有关详细信息,请参阅 在 Microsoft Azure 中使用 JBoss EAP 高可用性。
为 AZURE_PING 创建 Azure 存储帐户和 Blob 容器
使用以下命令创建存储帐户和 Blob 容器:
# Define your storage account name
export STORAGE_ACCOUNT_NAME=azurepingstgabc1111rg
# Define your Blob container name
export CONTAINER_NAME=azurepingcontainerabc1111rg
# Create storage account
az storage account create \
--resource-group $RESOURCE_GROUP_NAME \
--name ${STORAGE_ACCOUNT_NAME} \
--location westus \
--sku Standard_LRS \
--kind StorageV2 \
--access-tier Hot
然后,使用以下命令检索存储帐户密钥以供以后使用。 如果看到错误,请等待几分钟,然后重试。 创建存储帐户的上一个命令可能尚未完成。
export STORAGE_ACCESS_KEY=$(az storage account keys list \
--resource-group $RESOURCE_GROUP_NAME \
--account-name ${STORAGE_ACCOUNT_NAME} \
--query "[0].value" \
--output tsv)
# Create blob container
az storage container create \
--name ${CONTAINER_NAME} \
--account-name ${STORAGE_ACCOUNT_NAME} \
--account-key ${STORAGE_ACCESS_KEY}
应会看到以下输出:
{
"created": true
}
配置域控制器(管理节点)
本教程使用 Red Hat JBoss EAP 管理 CLI 命令配置域控制器。 有关详细信息,请参阅管理 CLI 指南。
以下步骤在 adminVM
上设置域控制器配置。 使用 SSH 以 azureuser
用户身份连接到 adminVM
。 回想一下,之前已将 adminVM
的公共 IP 地址捕获到 ADMIN_VM_PUBLIC_IP
环境变量中。
ssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP
首先,使用以下命令并使用 AZURE_PING
协议配置 HA 配置文件和 JGroups:
export HOST_VM_IP=$(hostname -I)
export STORAGE_ACCOUNT_NAME=azurepingstgabc1111rg
export CONTAINER_NAME=azurepingcontainerabc1111rg
export STORAGE_ACCESS_KEY=<the-value-from-before-you-connected-with-SSH>
#-Configure the HA profile and JGroups using AZURE_PING protocol
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
'embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-master.xml',\
':write-attribute(name=name,value=domain1)',\
'/profile=ha/subsystem=jgroups/stack=tcp:remove',\
'/profile=ha/subsystem=jgroups/stack=tcp:add()',\
'/profile=ha/subsystem=jgroups/stack=tcp/transport=TCP:add(socket-binding=jgroups-tcp,properties={ip_mcast=false})',\
"/profile=ha/subsystem=jgroups/stack=tcp/protocol=azure.AZURE_PING:add(properties={storage_account_name=\"${STORAGE_ACCOUNT_NAME}\", storage_access_key=\"${STORAGE_ACCESS_KEY}\", container=\"${CONTAINER_NAME}\"})",\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MERGE3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_SOCK:add(socket-binding=jgroups-tcp-fd)',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_ALL:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=VERIFY_SUSPECT:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=UNICAST3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.STABLE:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.GMS:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MFC:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FRAG3:add',\
'/profile=ha/subsystem=jgroups/channel=ee:write-attribute(name="stack", value="tcp")',\
'/server-group=main-server-group:write-attribute(name="profile", value="ha")',\
'/server-group=main-server-group:write-attribute(name="socket-binding-group", value="ha-sockets")',\
"/host=master/subsystem=elytron/http-authentication-factory=management-http-authentication:write-attribute(name=mechanism-configurations,value=[{mechanism-name=DIGEST,mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])",\
"/host=master/interface=unsecure:add(inet-address=${HOST_VM_IP})",\
"/host=master/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=master/interface=public:add(inet-address=${HOST_VM_IP})"
# Save a copy of the domain.xml, later you need to share it with all host controllers
cp $EAP_HOME/wildfly/domain/configuration/domain.xml /tmp/domain.xml
输出的最后一节应该类似于以下示例。 如果没有,请在继续操作之前排查和解决该问题。
[domain@embedded /] /host=master/interface=public:add(inet-address=192.168.0.4 )
{
"outcome" => "success",
"result" => undefined,
"server-groups" => undefined,
"response-headers" => {"process-state" => "reload-required"}
}
02:05:55,019 INFO [org.jboss.as] (MSC service thread 1-1) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 28ms
然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:
注意
JBOSS_EAP_USER
配置 JBoss EAP 管理用户需要这些和JBOSS_EAP_PASSWORD
值。
# Configure the JBoss server and setup EAP service
echo 'WILDFLY_HOST_CONFIG=host-master.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN
# Configure JBoss EAP management user
export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456
sudo $EAP_HOME/wildfly/bin/add-user.sh -u $JBOSS_EAP_USER -p $JBOSS_EAP_PASSWORD -g 'guest,mgmtgroup'
输出应类似于以下示例:
Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-users.properties'
Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-users.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-groups.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-groups.properties'
最后,使用以下命令启动 EAP 服务:
# Start the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service
# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service
# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service
# Check the status of EAP service
systemctl status eap7-domain.service
输出应类似于以下示例:
● eap7-domain.service - JBoss EAP (domain mode)
Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
Active: active (running) since Thu 2023-03-30 02:11:44 UTC; 5s ago
Main PID: 3855 (scl)
Tasks: 82 (limit: 20612)
Memory: 232.4M
CGroup: /system.slice/eap7-domain.service
├─3855 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
├─3856 /bin/bash /var/tmp/sclfYu7yW
├─3858 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
├─3862 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
├─3955 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
└─3967 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>
Mar 30 02:11:44 adminVM systemd[1]: Started JBoss EAP (domain mode).
键入 q 退出分页器。 通过键入 exit 退出 SSH 连接。
启动 Red Hat JBoss EAP 服务后,可以通过 Web 浏览器中的 http://$ADMIN_VM_PUBLIC_IP:9990
访问管理控制台。 使用配置的用户名 jbossadmin
和密码 Secret123456
登录。
选择“运行时”选项卡。在导航窗格中,选择“拓扑”。 现在你应该看到,群集只包含一个域控制器:
配置主机控制器(工作器节点)
使用 SSH 以 azureuser
用户身份连接到 mspVM1
。 使用以下命令获取 VM 的公共 IP 地址:
MSPVM_PUBLIC_IP=$(az vm show \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM1 \
--show-details \
--query publicIps | tr -d '"' )
ssh -A -i ~/.ssh/jbosseapvm azureuser@$MSPVM_PUBLIC_IP
使用以下命令在 mspVM1
上设置主机控制器:
# environment variables
export DOMAIN_CONTROLLER_PRIVATE_IP=<adminVM-private-IP>
export HOST_VM_NAME=$(hostname)
export HOST_VM_NAME_LOWERCASE=$(echo "${HOST_VM_NAME,,}")
export HOST_VM_IP=$(hostname -I)
export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456
# Save default domain configuration as backup
sudo -u jboss mv $EAP_HOME/wildfly/domain/configuration/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml.backup
# Fetch domain.xml from domain controller
scp azureuser@${DOMAIN_CONTROLLER_PRIVATE_IP}:/tmp/domain.xml /tmp/domain.xml
sudo mv /tmp/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml
sudo chown jboss:jboss $EAP_HOME/wildfly/domain/configuration/domain.xml
使用以下命令将主机控制器更改应用到 mspVM1
:
# Setup host controller
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
"embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-slave.xml",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-one:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-two:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=${HOST_VM_NAME_LOWERCASE}-server0:add(group=main-server-group)",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-configuration=slave:add(authentication-name=${JBOSS_EAP_USER}, credential-reference={clear-text=${JBOSS_EAP_PASSWORD}})",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-context=slave-context:add(match-rules=[{authentication-configuration=slave}])",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote.username, value=${JBOSS_EAP_USER})",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote, value={host=${DOMAIN_CONTROLLER_PRIVATE_IP}, port=9990, protocol=remote+http, authentication-context=slave-context})",\
"/host=${HOST_VM_NAME_LOWERCASE}/core-service=discovery-options/static-discovery=primary:write-attribute(name=host, value=${DOMAIN_CONTROLLER_PRIVATE_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=unsecured:add(inet-address=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=public:write-attribute(name=inet-address, value=${HOST_VM_IP})"
输出的最后一节应该类似于以下示例。 如果没有,请在继续操作之前排查和解决该问题。
[domain@embedded /] /host=mspvm1/interface=public:write-attribute(name=inet-address, value=192.168.0.5 )
{
"outcome" => "success",
"result" => undefined,
"server-groups" => undefined,
"response-headers" => {"process-state" => "reload-required"}
}
02:58:59,388 INFO [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 58ms
然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:
echo 'WILDFLY_HOST_CONFIG=host-slave.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN
# Enable the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service
# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service
# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service
# Check the status of EAP service
systemctl status eap7-domain.service
输出应类似于以下示例:
● eap7-domain.service - JBoss EAP (domain mode)
Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
Active: active (running) since Thu 2023-03-30 03:02:15 UTC; 7s ago
Main PID: 9699 (scl)
Tasks: 51 (limit: 20612)
Memory: 267.6M
CGroup: /system.slice/eap7-domain.service
├─9699 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
├─9700 /bin/bash /var/tmp/sclgJ1hRD
├─9702 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
├─9706 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
├─9799 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
└─9811 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>
Mar 30 03:02:15 mspVM1 systemd[1]: Started JBoss EAP (domain mode).
键入 q 退出分页器。 通过键入 exit 退出 SSH 连接。
使用 SSH 以 azureuser
用户身份连接到 mspVM2
。 使用以下命令获取 VM 的公共 IP 地址:
az vm show \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM2 \
--show-details \
--query publicIps | tr -d '"'
在 mspVM2
上重复前面的步骤,然后键入 exit 退出 SSH 连接。
将两个主机控制器连接到 adminVM
后,应能够看到群集拓扑,如以下屏幕截图所示:
使用 Azure 应用程序网关公开 Red Hat JBoss EAP 群集
现在你已经在 Azure VM 上创建了群集,本节将指导你使用 Azure 应用程序网关向 Internet 公开 JBoss EAP。
创建 Azure 应用程序网关
若要向 Internet 公开 Red Hat JBoss EAP,需要公共 IP 地址。 创建公共 IP 地址,然后将 Azure 应用程序网关与之关联。 使用 az network public-ip create 创建它,如以下示例所示:
az network public-ip create \
--resource-group $RESOURCE_GROUP_NAME \
--name myAGPublicIPAddress \
--allocation-method Static \
--sku Standard
接下来,将后端服务器添加到应用程序网关后端池中。 使用以下命令查询后端 IP 地址。 只需要将主机控制器(工作节点)配置为后端服务器。
export MSPVM1_NIC_ID=$(az vm show \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM1 \
--query networkProfile.networkInterfaces'[0]'.id \
--output tsv)
export MSPVM1_IP=$(az network nic show \
--ids ${MSPVM1_NIC_ID} \
--query ipConfigurations'[0]'.privateIPAddress \
--output tsv)
export MSPVM2_NIC_ID=$(az vm show \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM2 \
--query networkProfile.networkInterfaces'[0]'.id \
--output tsv)
export MSPVM2_IP=$(az network nic show \
--ids ${MSPVM2_NIC_ID} \
--query ipConfigurations'[0]'.privateIPAddress \
--output tsv)
接下来,创建 Azure 应用程序网关。 以下示例使用默认后端池中的主机控制器创建应用程序网关:
az network application-gateway create \
--resource-group $RESOURCE_GROUP_NAME \
--name myAppGateway \
--public-ip-address myAGPublicIPAddress \
--location westus \
--capacity 2 \
--http-settings-port 8080 \
--http-settings-protocol Http \
--frontend-port 80 \
--sku Standard_V2 \
--subnet jbossVMGatewaySubnet \
--vnet-name myVNet \
--priority 1001 \
--servers ${MSPVM1_IP} ${MSPVM2_IP}
注意
此示例设置使用 HTTP 访问 Red Hat JBoss EAP 服务器的简单方法。 如果需要安全访问,请按照应用程序网关的端到端 TLS 中的说明配置 TLS/SSL 终止。
此示例公开端口 8080 上的主机控制器。 在后面的步骤中,你将部署一个具有数据库连接到群集的示例应用程序。
连接到 Azure Database for PostgreSQL 灵活服务器
本节介绍如何创建 Azure Database for PostgreSQL 灵活服务器实例,以及如何在 Red Hat JBoss EAP 群集上配置与 PostgreSQL 的连接。
创建 Azure Database for PostgreSQL 灵活服务器实例
使用以下步骤创建数据库实例:
使用 az postgres flexible-server create 预配 Azure Database for PostgreSQL 灵活服务器实例,如以下示例所示:
export DATA_BASE_USER=jboss DB_SERVER_NAME="jbossdb$(date +%s)" echo "DB_SERVER_NAME=${DB_SERVER_NAME}" az postgres flexible-server create \ --active-directory-auth Enabled \ --resource-group $RESOURCE_GROUP_NAME \ --name ${DB_SERVER_NAME} \ --location westus \ --version 16 \ --public-access 0.0.0.0 \ --tier Burstable \ --sku-name Standard_B1ms \ --yes objectId=$(az identity show --name passwordless-managed-identity --resource-group $RESOURCE_GROUP_NAME --query principalId -o tsv) az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name ${DB_SERVER_NAME} \ --display-name "passwordless-managed-identity" \ --object-id $objectId \ --type ServicePrincipal
使用以下命令允许从 Azure 服务进行访问:
# Save aside the following names for later use export fullyQualifiedDomainName=$(az postgres flexible-server show \ --resource-group $RESOURCE_GROUP_NAME \ --name ${DB_SERVER_NAME} \ --query "fullyQualifiedDomainName" \ --output tsv) export name=$(az postgres flexible-server show \ --resource-group $RESOURCE_GROUP_NAME \ --name ${DB_SERVER_NAME} \ --query "name" \ --output tsv) az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name ${DB_SERVER_NAME} \ --rule-name "AllowAllWindowsAzureIps" \ --start-ip-address "0.0.0.0" \ --end-ip-address "0.0.0.0"
使用以下命令创建数据库:
az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name ${DB_SERVER_NAME} \ --database-name testdb
安装驱动程序
使用以下步骤通过 JBoss 管理 CLI 安装 JDBC 驱动程序:
使用以下命令通过 SSH 连接到
adminVM
。 如果已经打开了连接,则可以跳过此步骤。ssh -A -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP
使用以下命令在 adminVM 上下载 JDBC 驱动程序:
# Create JDBC driver and module directory jdbcDriverModuleDirectory="$EAP_HOME"/wildfly/modules/com/postgresql/main sudo mkdir -p "$jdbcDriverModuleDirectory" # Download JDBC driver and passwordless extensions extensionJarName=azure-identity-extensions-1.1.20.jar extensionPomName=azure-identity-extensions-1.1.20.pom sudo curl --retry 5 -Lo ${jdbcDriverModuleDirectory}/${extensionJarName} https://repo1.maven.org/maven2/com/azure/azure-identity-extensions/1.1.20/$extensionJarName sudo curl --retry 5 -Lo ${jdbcDriverModuleDirectory}/${extensionPomName} https://repo1.maven.org/maven2/com/azure/azure-identity-extensions/1.1.20/$extensionPomName sudo yum install maven -y sudo mvn dependency:copy-dependencies -f ${jdbcDriverModuleDirectory}/${extensionPomName} -Ddest=${jdbcDriverModuleDirectory} # Create module for JDBC driver jdbcDriverModule=module.xml sudo cat <<EOF >${jdbcDriverModule} <?xml version="1.0" ?> <module xmlns="urn:jboss:module:1.1" name="com.postgresql"> <resources> <resource-root path="${extensionJarName}"/> EOF # Add all jars from target/dependency for jar in ${jdbcDriverModuleDirectory}/target/dependency/*.jar; do if [ -f "$jar" ]; then # Extract just the filename from the path jarname=$(basename "$jar") echo " <resource-root path=\"target/dependency/${jarname}\"/>" >> ${jdbcDriverModule} fi done # Add the closing tags cat <<EOF >> ${jdbcDriverModule} </resources> <dependencies> <module name="javaee.api"/> <module name="sun.jdk"/> <module name="ibm.jdk"/> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module> EOF chmod 644 $jdbcDriverModule sudo mv $jdbcDriverModule $jdbcDriverModuleDirectory/$jdbcDriverModule
使用以下命令将 JDBC 驱动程序复制到主机控制器:
scp -rp $EAP_HOME/wildfly/modules/com/postgresql azureuser@mspvm1:/tmp/ ssh azureuser@mspvm1 "sudo mkdir -p $EAP_HOME/wildfly/modules/com/postgresql && sudo cp -rp /tmp/postgresql/* $EAP_HOME/wildfly/modules/com/postgresql && sudo rm -rf /tmp/postgresql" scp -rp $EAP_HOME/wildfly/modules/com/postgresql azureuser@mspvm2:/tmp/ ssh azureuser@mspvm2 "sudo mkdir -p $EAP_HOME/wildfly/modules/com/postgresql && sudo cp -rp /tmp/postgresql/* $EAP_HOME/wildfly/modules/com/postgresql && sudo rm -rf /tmp/postgresql"
服务器日志位于
mspVM1
和/var/opt/rh/eap7/lib/wildfly/domain/servers/mspvm1-server0/log/server.log
上的mspVM2
。 如果部署失败,请检查此日志文件并解决问题,然后再继续。
使用以下命令注册 JDBC 驱动程序:
# Register JDBC driver sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \ "/profile=ha/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=com.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)"
为 Red Hat JBoss EAP 群集配置数据库连接
你已启动数据库服务器,获取了所需的资源 ID,并安装了 JDBC 驱动程序。 接下来,本节中的步骤说明如何使用 JBoss CLI 配置与之前创建的 PostgreSQL 实例的数据源连接。
使用以下命令打开终端,并通过 SSH 连接到
adminVM
:ssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP
使用以下命令创建数据源:
# Replace the following values with your own export DATA_SOURCE_CONNECTION_STRING="jdbc:postgresql://<database-fully-qualified-domain-name>:5432/testdb?sslmode=require&user=passwordless-managed-identity&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin" export JDBC_DATA_SOURCE_NAME=dataSource-postgresql export JDBC_JNDI_NAME=java:jboss/datasources/JavaEECafeDB sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \ "data-source add --driver-name=postgresql --profile=ha --name=${JDBC_DATA_SOURCE_NAME} --jndi-name=${JDBC_JNDI_NAME} --connection-url=${DATA_SOURCE_CONNECTION_STRING} "
你已成功配置名为 java:jboss/datasources/JavaEECafeDB
的数据源。
部署 Java EE Cafe 示例应用程序
使用以下步骤将 Java EE Cafe 示例应用程序部署到 Red Hat JBoss EAP 群集:
使用以下步骤构建 Java EE Cafe。 以下步骤假设你有一个安装了 Git 和 Maven 的本地环境:
使用以下命令从 GitHub 克隆源代码:
git clone https://github.com/Azure/rhel-jboss-templates.git --branch 20240904 --single-branch
运行以下命令以生成源代码:
mvn clean install --file rhel-jboss-templates/eap-coffee-app/pom.xml
此命令创建文件 eap-coffee-app/target/javaee-cafe.war。 在下一步上传此文件。
打开 Web 浏览器,转到
http://<adminVM-public-IP>:9990
处的管理控制台,然后使用用户名jbossadmin
和密码Secret123456
登录。使用以下步骤将 javaee-cafe.war 上传到内容存储库:
使用以下步骤将应用程序部署到
main-server-group
:
测试 Red Hat JBoss EAP 群集配置
你配置了 JBoss EAP 群集,并向其部署了应用程序。 使用以下步骤访问应用程序,以验证所有设置:
使用以下命令获取 Azure 应用程序网关的公共 IP 地址:
az network public-ip show \ --resource-group $RESOURCE_GROUP_NAME \ --name myAGPublicIPAddress \ --query '[ipAddress]' \ --output tsv
打开 Web 浏览器。
使用 URL
http://<gateway-public-ip-address>/javaee-cafe/
导航到应用程序。 别忘了后面的斜杠。尝试添加和删除 coffee。
清理资源
若要避免 Azure 费用,应清除不需要的资源。 当你不再需要在 Azure VM 上部署的 Red Hat JBoss EAP 群集时,请注销 Red Hat JBoss EAP 服务器并删除 Azure 资源。
使用以下命令从 Red Hat 订阅管理中注销 Red Hat JBoss EAP 服务器和 VM:
# Unregister domain controller
az vm run-command invoke \
--resource-group $RESOURCE_GROUP_NAME \
--name adminVM \
--command-id RunShellScript \
--scripts "sudo subscription-manager unregister"
# Unregister host controllers
az vm run-command invoke \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM1 \
--command-id RunShellScript \
--scripts "sudo subscription-manager unregister"
az vm run-command invoke \
--resource-group $RESOURCE_GROUP_NAME \
--name mspVM2 \
--command-id RunShellScript \
--scripts "sudo subscription-manager unregister"
使用以下命令删除资源组 $RESOURCE_GROUP_NAME
:
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
后续步骤
继续了解在 Azure 上运行 JBoss EAP 的选项。