ようへいの日々精進XP

よかろうもん

PowerShell で操作する Azure メモ(2)

ども、かっぱです。

tl;dr

引続き、PowerShell で Azure を操作するメモ。

操作する環境は以下の通り。

PS C:\Users\Administrator\Downloads> [System.Environment]::OSVersion

                          Platform ServicePack                        Version                            VersionString
                          -------- -----------                        -------                            -------------
                           Win32NT                                    6.3.9600.0                         Microsoft Windows NT 6.3.9600.0

PS C:\Users\Administrator\Downloads> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

参考

仮想ネットワークを作って、その中に仮想マシンを作る

要件

  • 仮想ネットワーク(クラシック)を作成(サブネットは 2 つ)
  • パラメータを指定して仮想マシンを作成する(OS は Windows Server 2012 R2)
  • 仮想マシン(クラシック)は New-AzureVM コマンドを利用して作成する
  • 作成した VM にアクセスしてみる

仮想ネットワークの作成

  • 既存の設定を書き出す(事前に仮想ネットワークを 1 つ作っておく)
Get-AzureVNetConfig -ExportToFile C:\Users\Administrator\Documents\NetworkConfig.xml
  • ouput
XMLConfiguration              OperationDescription          OperationId                   OperationStatus
----------------              --------------------          -----------                   ---------------
<?xml version="1.0" encodi... Get-AzureVNetConfig           xxxxxxxx-xxxx-xxxx-xxxx-a2... Succeeded
  • 確認
PS C:\Users\Administrator\Documents> cat NetworkConfig.xml
<?xml version="1.0" encoding="utf-8"?>
<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
  <VirtualNetworkConfiguration>
    <Dns />
    <VirtualNetworkSites>
      <VirtualNetworkSite name="Group your-service01 TestVNet01" Location="Japan West">
        <AddressSpace>
          <AddressPrefix>192.168.0.0/16</AddressPrefix>
        </AddressSpace>
        <Subnets>
          <Subnet name="FrontEnd">
            <AddressPrefix>192.168.1.0/24</AddressPrefix>
          </Subnet>
        </Subnets>
      </VirtualNetworkSite>
    </VirtualNetworkSites>
  </VirtualNetworkConfiguration>
</NetworkConfiguration>
  • 編集、確認(サブネット BackendEnd を一つ追加してみた)
PS C:\Users\Administrator\Documents> cat NetworkConfig.xml
<?xml version="1.0" encoding="utf-8"?>
<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
  <VirtualNetworkConfiguration>
    <Dns />
    <VirtualNetworkSites>
      <VirtualNetworkSite name="Group your-service01 TestVNet01" Location="Japan West">
        <AddressSpace>
          <AddressPrefix>192.168.0.0/16</AddressPrefix>
        </AddressSpace>
        <Subnets>
          <Subnet name="FrontEnd">
            <AddressPrefix>192.168.1.0/24</AddressPrefix>
          </Subnet>
          <Subnet name="BackendEnd">
            <AddressPrefix>192.168.2.0/24</AddressPrefix>
          </Subnet>
        </Subnets>
      </VirtualNetworkSite>
    </VirtualNetworkSites>
  </VirtualNetworkConfiguration>
</NetworkConfiguration>
  • 適用
Set-AzureVNetConfig -ConfigurationPath C:\Users\Administrator\Documents\NetworkConfig.xml
  • ouput
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Set-AzureVNetConfig                     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    Succeeded
  • 確認
Get-AzureVNetSite -VNetName "Group your-service01 TestVNet01"
  • ouput
AddressSpacePrefixes : {192.168.0.0/16}
Location             : Japan West
AffinityGroup        :
DnsServers           : {}
GatewayProfile       :
GatewaySites         :
Id                   : 123456789-1234-5678-9000-12345678912
InUse                : False
Label                :
MigrationState       :
Name                 : Group your-service01 TestVNet01
State                : Created
Subnets              : {FrontEnd, BackendEnd}
OperationDescription : Get-AzureVNetSite
OperationId          : xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
OperationStatus      : Succeeded

VM 作成

  • New-AzureVMConfigVM の設定を定義して New-AzureVMVM を作成
$_locationName  = "Japan West"
$_vmName        = "vm01"
#
# Get-AzureVMImage を実行して Windows Server 2012 R2 datacenter の VM イメージの ImageName を取得
# 
$_imageName     = @(Get-AzureVMImage | ? {$_.OS -eq "Windows" -and $_.ImageFamily -eq "Windows Server 2012 R2 datacenter"} ` | Sort-Object PublishedDate –Descending | Select-Object -First 1 ).ImageName
$_adminUser     = "oreadmin"
$_adminPassword = "YourPassword!01"
$_cloudService  = "your-service01"
#
# Get-AzureVNetSite を実行して仮想ネットワーク名を取得
#
$_vnetName      = @(Get-AzureVNetSite -VNetName "Group your-service01 TestVNet01").Name
$_subNet        = "FrontEnd"

#
# New-AzureVMConfig ...インスタンスサイズ、イメージ名等を設定
# Add-AzureProvisioningConfig ... ログインユーザー名、パスワード等の OS より上のレイヤーを設定(-EnableWinRMHttp で HTTP 経由での WinRM の操作を有効にしている)
# Set-AzureVMBGInfoExtension ... VM エージェントをインストールする
# Set-AzureSubnet ... 仮想ネットワーク内に作成したサブネットを設定
#
$_vmConfig = `
New-AzureVMConfig -Name $_vmName -InstanceSize Small -ImageName $_imageName `
| Add-AzureProvisioningConfig -Windows -AdminUsername $_adminUser -Password $_adminPassword -EnableWinRMHttp `
| Set-AzureVMBGInfoExtension `
| Set-AzureSubnet -SubnetNames $_subNet `
| New-AzureVM -ServiceName "your-service01" -VNetName $_vnetName -Location "Japan West" -WaitForBoot

VM にアクセスする為に必要な情報を確認する

  • Get-AzureEndpoint を実行して Virtual IP とポート等を確認する
Get-AzureVM -ServiceName $_cloudService -Name $_vmName  | Get-AzureEndpoint | Select Name,Port,Vip
  • output
Name                                                                       Port Vip
----                                                                       ---- ---
PowerShell                                                                63829 xxx.xxx.xxx.xxx
RemoteDesktop                                                             50698 xxx.xxx.xxx.xxx

幾つかの方法で VM にアクセスする

$_username      = "oreadmin"
$_passwd        = "YourPassword!01"
$_secure_string = ConvertTo-SecureString $_passwd -AsPlainText -Force
$_pscredential  = New-Object System.Management.Automation.PsCredential($_username, $_secure_string)
$_cloudService  = "your-service01"
$_vmName        = "vm01"
$_uri = Get-AzureWinRMUri -ServiceName $_cloudService -Name $_vmName

#
# Enter-PSSession でインタラクティブに WinRM にアクセス
#
PS C:\Users\Administrator> Enter-PSSession -ConnectionUri $_uri -Credential $_pscredential -SessionOption (New-PSSessionOption -SkipCACheck)
[your-service01.cloudapp.net]: PS C:\Users\oreadmin\Documents> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2


[your-service01.cloudapp.net]: PS C:\Users\oreadmin\Documents>

こちらの記事を参考にさせて頂いた。有難うございました。

#
# PowerShell を使って WinRM のエンドポイントを確認
# 
PS C:\Users\Administrator> Get-AzureWinRMUri -ServiceName $_cloudService -Name $_vmName  | select AbsoluteUri

AbsoluteUri
-----------
https://your-service01.cloudapp.net:63829/

AbsoluteUri を控えておいて...(事前に pip install pywinrm しておく必要がある)

$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import winrm
>>> s = winrm.Session('https://your-service01.cloudapp.net:63829/wsman', auth=('oreadmin', 'YourPassword!01'), server_cert_validation='ignore', transport='ntlm')
>>> r = s.run_cmd('ipconfig', ['/all'])
>>> r.status_code
0
>>> r = s.run_cmd('powershell -Command $PSVersionTable')
>>> r.status_code
0

WinRM 経由で ifconfig /allpowershell -Command $PSVersionTable を実行している。

後片付け

Remove-AzureVM -ServiceName your-service01 -Name vm01
  • output
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Remove-AzureVM                          xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    Succeeded
  • リソースグループの削除
#
# リソースグループ名を確認
#
Get-AzureRmResourceGroup | select ResourceGroupName
  • output
ResourceGroupName
-----------------
Default-Storage-JapanWest
your-service01
TestRG
  • your-service01 グループを削除
#
# your-service01 グループを削除
#
Remove-AzureRmResourceGroup -Name your-service01
  • output
確認
Are you sure you want to remove resource group 'your-service01'
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

(...暫く時間を置いて...)

True

リソースグループの削除に合わせて仮想ネットワークも削除される。

以上

メモでした。