问题描述
希望通过 Python 批量创建 ARM 虚拟机,并且在虚拟机命名时加入固定 IP 信息,方便管理维护。
问题分析
在创建 ARM 虚拟机之前,先创建固定 IP,然后获取固定 IP 地址,创建虚拟机时通过该 IP 地址格式化虚拟机名称。然后将固定 IP 配置到网络接口,基于该网络接口配置创建 ARM 虚拟机。
解决方法
模块安装
本文在 Windows Python 环境下进行测试,环境及模块依赖如下:
官网下载 msi 安装包,管理员命令行执行以下安装脚本
复制
msiexec /package python-xxx.msi
使用 PIP 安装 Azure(需要 pip 9+ 支持,Python 2.7 环境已内置 pip 9+ 版本,不需更新)
复制
pip install azure
安装程序依赖的模块
复制
pip install azure-mgmt-network==0.30.0rc6
pip install azure-mgmt-compute==0.30.0rc6
pip install azure-mgmt-resource==0.30.2
如何查看模块的版本
复制
pip install azure-mgmt-network==
Collecting azure-mgmt-network==
Could not find a version that satisfies the requirement azure-mgmt-network==
from versions: 0.20.0rc1, 0.20.0rc2, 0.20.0, 0.20.1, 0.30.0a1, 0.30.0rc1, 0.30.
rc2, 0.30.0rc3, 0.30.0rc4, 0.30.0rc5, 0.30.0rc6, 0.30.0)
No matching distribution found for azure-mgmt-network==
代码实现
复制
from azure import *
from azure.mgmt.compute import ComputeManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.resource import ResourceManagementClient
from azure.common.credentials import UserPassCredentials
from azure.mgmt.compute.models import *
from msrest.serialization import *
credentials = UserPassCredentials(
"订阅账户",
"账户密码",
china=True
)
resource_client = ResourceManagementClient(
credentials,
'订阅 ID',
base_url = 'https://management.chinacloudapi.cn'
)
resource_client.providers.register('Microsoft.Compute')
resource_client.providers.register('Microsoft.Network')
compute_client = ComputeManagementClient(
credentials,
'订阅 ID',
base_url = 'https://management.chinacloudapi.cn'
)
network_client = NetworkManagementClient(
credentials,
'订阅 ID',
base_url = 'https://management.chinacloudapi.cn'
)
# Create Public IP
# result = network_client.public_ip_addresses.create_or_update(
# 'geogroup', #group_name
# 'geo-ip-01', #ip_name
# PublicIPAddress(
# location='China North',
# public_ip_allocation_method=IPAllocationMethod.static,
# idle_timeout_in_minutes=4,
# ),
# )
# result.wait()
public_ip_addresses = 'public_ip_name'
group_name = ''public_ip_group'
result = network_client.public_ip_addresses.get(group_name,public_ip_addresses)
print result.__dict__.items()
print result.ip_address
print result.ip_address.replace(".","-")
storageName = "storage account name"
vmName = "geovm-"+result.ip_address.replace(".","-")
print vmName
location = "chinanorth"
print location
os_profile = OSProfile(
computer_name= vmName,
admin_username='username',
admin_password='password,
)
print os_profile
hardware_profile = HardwareProfile(
vm_size=VirtualMachineSizeTypes.standard_a0
)
print hardware_profile
storage_profile = StorageProfile(
os_disk=OSDisk(
caching=CachingTypes.none,
create_option=DiskCreateOptionTypes.from_image,
name=vmName,
vhd=VirtualHardDisk(
uri='https://'+storageName+'.blob.core.chinacloudapi.cn/vhds/'+vmName+'.vhd',
),
),
)
storage_profile.image_reference = ImageReference(
publisher='Canonical',
offer='UbuntuServer',
sku='16.04.0-LTS',
version='latest'
)
print storage_profile
network_profile = NetworkProfile(
network_interfaces=[
NetworkInterfaceReference(
id="在新门户,网络接口-属性中获取资源 ID,该网络接口需要配置固定 IP",
),
],
)
print network_profile
params_create = VirtualMachine(
location=location,
os_profile=os_profile,
hardware_profile=hardware_profile,
network_profile=network_profile,
storage_profile=storage_profile,
)
print params_create
result_create = compute_client.virtual_machines.create_or_update(
group_name,
vmName,
params_create
)
result_create.wait()
print 'ok'
立即访问http://market.azure.cn