Uso de Azure SDK para crear y eliminar una máquina virtual
Use Azure SDK para crear y eliminar una máquina virtual de Azure.
Configurado su entorno de desarrollo
- Una cuenta de usuario de Azure con una suscripción activa. cree una de forma gratuita.
- Node.js LTS con NPM, el administrador de paquetes de Node.js, instalados en el equipo local.
- Visual Studio Code instalado en la máquina local.
- Cree una entidad de servicio y copie los valores de
Tenant Id
,Client ID
yClient secret
. - Use la página de la suscripción de Azure Portal para buscar el identificador de suscripción y copie ese valor para usarlo en estos scripts.
Máquinas virtuales de Azure
Una máquina virtual de Azure requiere varios recursos para admitir la máquina virtual. La mejor manera de administrar esos recursos es crear todos los recursos en un único grupo de recursos. El script crea el grupo de recursos y anexa un número aleatorio para asegurarse de que el grupo de recursos sea único, independientemente de cuántas veces se use el script.
Los recursos creados en estos scripts incluyen:
- Resource group
- Máquinas virtuales
- Storage
- Red virtual
Crear una máquina virtual
Cree un archivo llamado
create-vm.js
o copie el archivo desde GitHub.const util = require("util"); const { ClientSecretCredential, DefaultAzureCredential, } = require("@azure/identity"); const { ComputeManagementClient } = require("@azure/arm-compute"); const { ResourceManagementClient } = require("@azure/arm-resources"); const { StorageManagementClient } = require("@azure/arm-storage"); const { NetworkManagementClient } = require("@azure/arm-network"); // Store function output to be used elsewhere let randomIds = {}; let subnetInfo = null; let publicIPInfo = null; let vmImageInfo = null; let nicInfo = null; // CHANGE THIS - used as prefix for naming resources const yourAlias = "diberry"; // CHANGE THIS - used to add tags to resources const projectName = "azure-samples-create-vm"; // Resource configs const location = "eastus"; const accType = "Standard_LRS"; // Ubuntu config for VM const publisher = "Canonical"; const offer = "UbuntuServer"; const sku = "14.04.3-LTS"; const adminUsername = "notadmin"; const adminPassword = "Pa$$w0rd92"; // Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID"; let credentials = null; if (process.env.production) { // production credentials = new DefaultAzureCredential(); } else { // development credentials = new ClientSecretCredential(tenantId, clientId, secret); console.log("development"); } // Azure services const resourceClient = new ResourceManagementClient( credentials, subscriptionId ); const computeClient = new ComputeManagementClient(credentials, subscriptionId); const storageClient = new StorageManagementClient(credentials, subscriptionId); const networkClient = new NetworkManagementClient(credentials, subscriptionId); // Create resources then manage them (on/off) async function createResources() { try { result = await createResourceGroup(); accountInfo = await createStorageAccount(); vnetInfo = await createVnet(); subnetInfo = await getSubnetInfo(); publicIPInfo = await createPublicIP(); nicInfo = await createNIC(subnetInfo, publicIPInfo); vmImageInfo = await findVMImage(); nicResult = await getNICInfo(); vmInfo = await createVirtualMachine(nicInfo.id, vmImageInfo[0].name); return; } catch (err) { console.log(err); } } async function createResourceGroup() { console.log("\n1.Creating resource group: " + resourceGroupName); const groupParameters = { location: location, tags: { project: projectName }, }; const resCreate = await resourceClient.resourceGroups.createOrUpdate( resourceGroupName, groupParameters ); return resCreate; } async function createStorageAccount() { console.log("\n2.Creating storage account: " + storageAccountName); const createParameters = { location: location, sku: { name: accType, }, kind: "Storage", tags: { project: projectName, }, }; return await storageClient.storageAccounts.beginCreateAndWait( resourceGroupName, storageAccountName, createParameters ); } async function createVnet() { console.log("\n3.Creating vnet: " + vnetName); const vnetParameters = { location: location, addressSpace: { addressPrefixes: ["10.0.0.0/16"], }, dhcpOptions: { dnsServers: ["10.1.1.1", "10.1.2.4"], }, subnets: [{ name: subnetName, addressPrefix: "10.0.0.0/24" }], }; return await networkClient.virtualNetworks.beginCreateOrUpdateAndWait( resourceGroupName, vnetName, vnetParameters ); } async function getSubnetInfo() { console.log("\nGetting subnet info for: " + subnetName); const getResult = await networkClient.subnets.get( resourceGroupName, vnetName, subnetName ); return getResult; } async function createPublicIP() { console.log("\n4.Creating public IP: " + publicIPName); const publicIPParameters = { location: location, publicIPAllocationMethod: "Dynamic", dnsSettings: { domainNameLabel: domainNameLabel, }, }; return await networkClient.publicIPAddresses.beginCreateOrUpdateAndWait( resourceGroupName, publicIPName, publicIPParameters ); } async function createNIC(subnetInfo, publicIPInfo) { console.log("\n5.Creating Network Interface: " + networkInterfaceName); const nicParameters = { location: location, ipConfigurations: [ { name: ipConfigName, privateIPAllocationMethod: "Dynamic", subnet: subnetInfo, publicIPAddress: publicIPInfo, }, ], }; return await networkClient.networkInterfaces.beginCreateOrUpdateAndWait( resourceGroupName, networkInterfaceName, nicParameters ); } async function findVMImage() { console.log( util.format( "\nFinding a VM Image for location %s from " + "publisher %s with offer %s and sku %s", location, publisher, offer, sku ) ); const listResult = new Array(); for await (const item of computeClient.virtualMachineImages.list( location, publisher, offer, sku )) { listResult.push(item); } return listResult; } async function getNICInfo() { return await networkClient.networkInterfaces.get( resourceGroupName, networkInterfaceName ); } async function createVirtualMachine() { const vmParameters = { location: location, osProfile: { computerName: vmName, adminUsername: adminUsername, adminPassword: adminPassword, }, hardwareProfile: { vmSize: "Standard_B1ls", }, storageProfile: { imageReference: { publisher: publisher, offer: offer, sku: sku, version: vmImageVersionNumber, }, osDisk: { name: osDiskName, caching: "None", createOption: "fromImage", vhd: { uri: "https://" + storageAccountName + ".blob.core.windows.net/nodejscontainer/osnodejslinux.vhd", }, }, }, networkProfile: { networkInterfaces: [ { id: nicId, primary: true, }, ], }, }; console.log("6.Creating Virtual Machine: " + vmName); console.log( " VM create parameters: " + util.inspect(vmParameters, { depth: null }) ); const resCreate = await computeClient.virtualMachines.beginCreateOrUpdateAndWait( resourceGroupName, vmName, vmParameters ); return await computeClient.virtualMachines.get( resourceGroupName, vmName ); } const _generateRandomId = (prefix, existIds) => { var newNumber; while (true) { newNumber = prefix + Math.floor(Math.random() * 10000); if (!existIds || !(newNumber in existIds)) { break; } } return newNumber; }; //Random number generator for service names and settings const resourceGroupName = _generateRandomId(`${yourAlias}-testrg`, randomIds); const vmName = _generateRandomId(`${yourAlias}vm`, randomIds); const storageAccountName = _generateRandomId(`${yourAlias}ac`, randomIds); const vnetName = _generateRandomId(`${yourAlias}vnet`, randomIds); const subnetName = _generateRandomId(`${yourAlias}subnet`, randomIds); const publicIPName = _generateRandomId(`${yourAlias}pip`, randomIds); const networkInterfaceName = _generateRandomId(`${yourAlias}nic`, randomIds); const ipConfigName = _generateRandomId(`${yourAlias}crpip`, randomIds); const domainNameLabel = _generateRandomId(`${yourAlias}domainname`, randomIds); const osDiskName = _generateRandomId(`${yourAlias}osdisk`, randomIds); async function main() { await createResources(); } main() .then(() => { console.log( `success - resource group name: ${resourceGroupName}, vm resource name: ${vmName}` ); }) .catch((err) => { console.log(err); });
Los métodos del SDK que se usan en este script incluyen:
- Grupos de recursos
- Storage
- Redes
- Vms
Instale los paquetes npm usados en el trabajo de Azure:
npm init -y && install @azure/identity @azure/arm-compute @azure/arm-network @azure/arm-resources @azure/arm-storage
Para el desarrollo local, cambie las variables del archivo para la autenticación:
// Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
Cambio de variables para la nomenclatura de recursos:
// CHANGE THIS - used as prefix for naming resources const yourAlias = "johnsmith"; // CHANGE THIS - used to add tags to resources const projectName = "azure-samples-create-vm"
Ejecute el código para crear una máquina virtual:
node create-vm.js
La salida incluye el nombre del grupo de recursos:
success - resource group name: johnsmith-testrg1689
Limpieza de recursos
Cuando haya terminado con la máquina virtual, elimine el grupo de recursos.
Cree un archivo llamado
delete-resources.js
o copie el archivo desde GitHub.const { ClientSecretCredential, DefaultAzureCredential, } = require("@azure/identity"); const { ResourceManagementClient } = require("@azure/arm-resources"); // Azure authentication in environment variables for DefaultAzureCredential let credentials = null; const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID"; const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME"; if (process.env.production) { // production credentials = new DefaultAzureCredential(); } else { // development credentials = new ClientSecretCredential(tenantId, clientId, secret); console.log("development"); } async function deleteResourceGroup() { // Create Azure SDK client for Resource Management such as resource groups const resourceClient = new ResourceManagementClient( credentials, subscriptionId ); const result = await resourceClient.resourceGroups.deleteMethod( resourceGroupName ); console.log(JSON.stringify(result)); } deleteResourceGroup() .then((result) => { console.log(result); }) .catch((ex) => { console.log(ex); });
Para el desarrollo local, cambie las variables del archivo para la autenticación:
// Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
Obtenga el nombre del grupo de recursos, que se devolvió como la última línea del script de creación y cambie la variable en el script de eliminación:
const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
Ejecute el código para crear una máquina virtual:
node delete-resources.js
La eliminación puede tardar unos minutos.
Los métodos del SDK que se usan en este script incluyen:
- Grupos de recursos: resourceClient.resourcegroups.delete
Pasos siguientes
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de