[Amazon FSx for NetApp ONTAP] NetApp.ONTAP PowerShell Toolkitで複数のファイル共有の設定を移行してみた

ONTAP REST APIとのスクリプトを組み合わせたい時に
2022.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon FSx for NetApp ONTAP上に大量のファイル共有の設定を移行したい

こんにちは、のんピ(@non____97)です。

皆さんはAmazon FSx for NetApp ONTAP(以降FSx for ONTAP)上に大量のファイル共有の設定を移行したいなと思ったことはありますか? 私はあります。

FSx for ONTAPへの移行でパッと思いつくのはDataSyncだと思います。しかし、以下記事の通り、DataSyncはファイル共有同士のファイル・フォルダの移行であり、ファイル共有自体の設定は移行してくれません。

他にも思いつくのはDataSyncでファイルやフォルダ、メタデータを同期後に、Get-SmbShareGet-SmbShareAccessで現行ファイルサーバーの共有設定を取得して、New-SmbShareGrant-SmbShareAccessで移行先に同じ共有設定をしてあげるような形かと思います。

しかし、FSx for ONTAPではWinRMのポート(tcp/5985)が開いていないため、上述の手法ではファイル共有を作成することはできません。

ちなみに、FSx for Windows File Serverではファイル共有の設定をPowerShellで移行できます。

FSx for ONTAPだとWinRMで使えないのであれば... となればONTAP REST APIの出番ですね。ONTAP REST APIを使うことによってONTAP CLIを使わずとも外部からファイル共有の作成ができます。

ただし、REST APIに慣れていないとスクリプトを書くのもなかなか大変です。

そんな救世主として NetApp.ONTAP PowerShell Toolkit なるPowerShellのモジュールが公開されています。

NetApp.ONTAP PowerShell Toolkitを使って、現行ファイルサーバー上の複数のファイル共有をFSx for ONTAP上に作成してみました。

いきなりまとめ

  • NetApp.ONTAP PowerShell Toolkitを使ったスクリプトにより、現行ファイルサーバーのファイル共有の設定と(ほぼ)同じ設定のファイル共有をFSx for ONTAP上に作成することができる
    • 細かいACLの設定にONTAP REST APIがサポートしていないことがあるので注意

NetApp.ONTAP PowerShell Toolkit とは

NetApp.ONTAP PowerShell ToolkitとはONTAP REST APIをラッピングしたPowerShellのモジュールです。

こちらのモジュールをインポートすることにより、ONTAP REST APIに対応したPowerShellのコマンドレットを実行することができるようになります。

以前の記事で紹介したNetApp ONTAP Python client libraryのPowerShell版です。

現在のバージョンは9.11.1.2208で、ONTAPのバージョンに対応しています。

モジュールはWindows、Ubuntu、RHEL、および macOSにインポートすることが可能です。2022/12/5時点の最新のバージョンである9.11.1.2208のインストール要件は以下の通りです。

  • Windows
ソフトウェア バージョン
Microsoft Windows PowerShell 5.1 or 7.0.3 or later
Microsoft .NET Framework .NET Framework 4.7.2
Microsoft Windows 8.1,10, Server 2012 R2, 2016, 2019
  • RHEL
ソフトウェア バージョン
Microsoft Windows PowerShell 7.0.3 or later
RHEL 7
  • Ubuntu
ソフトウェア バージョン
Microsoft Windows PowerShell 7.0.3 or later
Ubuntu 18.0.4
  • macOS
ソフトウェア バージョン
Microsoft Windows PowerShell 7.0.3 or later
Apple MacOS 10.13 and later

Netapp PowerShell Toolkit Best Practices Guideなるベストプラクティスガイドも試す場合は目を通しておきましょう。

また、NetApp.ONTAP PowerShell Toolkitはコミュニティサポートです。NetAppのサポート窓口ではサポートされないので注意しましょう。

検証環境

検証環境は以下の通りです。

Windows Serverを現行ファイルサーバーと見立てて複数のファイル共有を作成します。

NetApp.ONTAP PowerShell Toolkitで複数のファイル共有の設定を移行してみた検証環境構成図

AD DCにNetApp.ONTAP PowerShell Toolkitを使ったスクリプトを実行し、現行ファイルサーバーのファイル共有と同じ設定のファイル共有をFSx for ONTAP上に作成します。

AD DCについては以下記事の検証で使用したものを流用します。

ファイル共有の作成

現行ファイルサーバーに見立てたWindows Server上にファイル共有を作成します。

まず、Windows Serverをドメイン参加させます。ホスト名はFILE-SHAREとします。

> Get-WMIObject Win32_ComputerSystem


Domain              : corp.non-97.net
Manufacturer        : Amazon EC2
Model               : t3.micro
Name                : FILE-SHARE
PrimaryOwnerName    : EC2
TotalPhysicalMemory : 1043886080

ドメイン参加後、Cドライブ配下にdataというフォルダを作成します。そしてdata配下にファイル共有用のフォルダを作成し、共有設定を行います。

AD DCから現行ファイルサーバーに接続して、ファイル共有一覧と、ファイル共有のACLを確認します。

# CIM セッションを作成
$src_cim = New-CimSession -ComputerName FILE-SHARE.corp.non-97.net

# ファイル共有一覧を確認
> Get-SmbShare -CimSession $src_cim -Special $false

Name   ScopeName Path                         Description PSComputerName
----   --------- ----                         ----------- --------------
share1 *         C:\data\share1                           FILE-SHARE.corp.non-97.net
share2 *         C:\data\share2                           FILE-SHARE.corp.non-97.net
share3 *         C:\data\share1\share3                    FILE-SHARE.corp.non-97.net
share4 *         C:\data\share2\folder\share4             FILE-SHARE.corp.non-97.net

# 各ファイル共有のACLを確認
> Get-SmbShareAccess -CimSession $src_cim -Name @("share1", "share2", "share3", "share4")

Name   ScopeName AccountName            AccessControlType AccessRight PSComputerName
----   --------- -----------            ----------------- ----------- --------------
share1 *         BUILTIN\Administrators Allow             Full        FILE-SHARE.corp.non-97.net
share1 *         Everyone               Allow             Full        FILE-SHARE.corp.non-97.net
share2 *         BUILTIN\Administrators Allow             Full        FILE-SHARE.corp.non-97.net
share3 *         Everyone               Allow             Read        FILE-SHARE.corp.non-97.net
share3 *         CORP\FSxAdmin          Allow             Full        FILE-SHARE.corp.non-97.net
share4 *         CORP\user01            Deny              Full        FILE-SHARE.corp.non-97.net
share4 *         Everyone               Allow             Read        FILE-SHARE.corp.non-97.net
share4 *         CORP\FSxAdmin          Allow             Change      FILE-SHARE.corp.non-97.net
share4 *         CORP\FSxAdminGroup     Allow             Read        FILE-SHARE.corp.non-97.net

FSx for ONTAPのボリュームの準備

次に、FSx for ONTAPのボリュームの準備を行います。

ボリュームのジャンクションパスは現行ファイルサーバーのdata配下のフォルダと同じような構成になるよう設定します。

作成したFSx for ONTAPファイルシステムとSVM、ボリュームは以下の通りです。

# FSx for ONTAPファイルシステム
$ aws fsx describe-file-systems
{
    "FileSystems": [
        {
            "OwnerId": "<AWSアカウントID>",
            "CreationTime": "2022-12-05T01:04:35.935000+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "FileSystemType": "ONTAP",
            "Lifecycle": "AVAILABLE",
            "StorageCapacity": 1024,
            "StorageType": "SSD",
            "VpcId": "vpc-08b84da1f793ed513",
            "SubnetIds": [
                "subnet-08dc789896a48a3b4"
            ],
            "NetworkInterfaceIds": [
                "eni-02474777797d74791",
                "eni-0ef77474295f9589d"
            ],
            "KmsKeyId": "arn:aws:kms:us-east-1:<AWSアカウントID>:key/365ae19c-8016-4963-9afd-05f703509254",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:file-system/fs-00f3521e554119927",
            "Tags": [
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "FsxnStack"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "FSxforONTAPfilesystem"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:us-east-1:<AWSアカウントID>:stack/FsxnStack/78cdb890-5423-11ed-81fb-0eac30df53d1"
                },
                {
                    "Key": "Name",
                    "Value": "fsx-for-ontap-file-system"
                }
            ],
            "OntapConfiguration": {
                "AutomaticBackupRetentionDays": 7,
                "DailyAutomaticBackupStartTime": "16:00",
                "DeploymentType": "SINGLE_AZ_1",
                "Endpoints": {
                    "Intercluster": {
                        "DNSName": "intercluster.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.101",
                            "10.0.1.125"
                        ]
                    },
                    "Management": {
                        "DNSName": "management.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.126"
                        ]
                    }
                },
                "DiskIopsConfiguration": {
                    "Mode": "AUTOMATIC",
                    "Iops": 3072
                },
                "PreferredSubnetId": "subnet-08dc789896a48a3b4",
                "ThroughputCapacity": 128,
                "WeeklyMaintenanceStartTime": "6:17:00"
            }
        }
    ]
}

# SVM
$ aws fsx describe-storage-virtual-machines 
{
    "StorageVirtualMachines": [
        {
            "ActiveDirectoryConfiguration": {
                "NetBiosName": "SVM",
                "SelfManagedActiveDirectoryConfiguration": {
                    "DomainName": "corp.non-97.net",
                    "OrganizationalUnitDistinguishedName": "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net",
                    "UserName": "FSxServiceAccount",
                    "DnsIps": [
                        "10.0.1.10"
                    ]
                }
            },
            "CreationTime": "2022-12-05T01:09:30.133000+00:00",
            "Endpoints": {
                "Iscsi": {
                    "DNSName": "iscsi.svm-06ea202c6382a01e2.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.104",
                        "10.0.1.68"
                    ]
                },
                "Management": {
                    "DNSName": "svm-06ea202c6382a01e2.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.90"
                    ]
                },
                "Nfs": {
                    "DNSName": "svm-06ea202c6382a01e2.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.90"
                    ]
                },
                "Smb": {
                    "DNSName": "SVM.corp.non-97.net",
                    "IpAddresses": [
                        "10.0.1.90"
                    ]
                }
            },
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "SVM",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:storage-virtual-machine/fs-00f3521e554119927/svm-06ea202c6382a01e2",
            "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
            "Subtype": "DEFAULT",
            "UUID": "7d313a57-7439-11ed-acaf-79eab5a2c0a3"
        }
    ]
}

# ボリューム
$ aws fsx describe-volumes 
{
    "Volumes": [
        {
            "CreationTime": "2022-12-05T01:09:43+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "SVM_root",
            "OntapConfiguration": {
                "FlexCacheEndpointType": "NONE",
                "JunctionPath": "/",
                "SecurityStyle": "NTFS",
                "SizeInMegabytes": 1024,
                "StorageEfficiencyEnabled": false,
                "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
                "StorageVirtualMachineRoot": true,
                "TieringPolicy": {
                    "Name": "NONE"
                },
                "UUID": "80376ed4-7439-11ed-acaf-79eab5a2c0a3",
                "OntapVolumeType": "RW"
            },
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:volume/fs-00f3521e554119927/fsvol-050f8213db813435a",
            "VolumeId": "fsvol-050f8213db813435a",
            "VolumeType": "ONTAP"
        },
        {
            "CreationTime": "2022-12-05T01:25:50.618000+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "vol1",
            "OntapConfiguration": {
                "FlexCacheEndpointType": "NONE",
                "JunctionPath": "/share1",
                "SizeInMegabytes": 1024,
                "StorageEfficiencyEnabled": false,
                "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
                "StorageVirtualMachineRoot": false,
                "TieringPolicy": {
                    "Name": "NONE"
                },
                "UUID": "cb013ef3-743b-11ed-acaf-79eab5a2c0a3",
                "OntapVolumeType": "RW"
            },
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:volume/fs-00f3521e554119927/fsvol-0b8c831fe3e882f08",
            "VolumeId": "fsvol-0b8c831fe3e882f08",
            "VolumeType": "ONTAP"
        },
        {
            "CreationTime": "2022-12-05T01:26:05.844000+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "vol2",
            "OntapConfiguration": {
                "FlexCacheEndpointType": "NONE",
                "JunctionPath": "/share2",
                "SizeInMegabytes": 1024,
                "StorageEfficiencyEnabled": false,
                "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
                "StorageVirtualMachineRoot": false,
                "TieringPolicy": {
                    "Name": "NONE"
                },
                "UUID": "d77f0041-743b-11ed-acaf-79eab5a2c0a3",
                "OntapVolumeType": "RW"
            },
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:volume/fs-00f3521e554119927/fsvol-0e8e324f3ef670639",
            "VolumeId": "fsvol-0e8e324f3ef670639",
            "VolumeType": "ONTAP"
        },
        {
            "CreationTime": "2022-12-05T01:26:24.767000+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "vol3",
            "OntapConfiguration": {
                "FlexCacheEndpointType": "NONE",
                "JunctionPath": "/share1/share3",
                "SizeInMegabytes": 1024,
                "StorageEfficiencyEnabled": false,
                "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
                "StorageVirtualMachineRoot": false,
                "TieringPolicy": {
                    "Name": "NONE"
                },
                "UUID": "e39612a2-743b-11ed-acaf-79eab5a2c0a3",
                "OntapVolumeType": "RW"
            },
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:volume/fs-00f3521e554119927/fsvol-0f61ae8d485189939",
            "VolumeId": "fsvol-0f61ae8d485189939",
            "VolumeType": "ONTAP"
        },
        {
            "CreationTime": "2022-12-05T01:27:31.886000+00:00",
            "FileSystemId": "fs-00f3521e554119927",
            "Lifecycle": "CREATED",
            "Name": "vol4",
            "OntapConfiguration": {
                "FlexCacheEndpointType": "NONE",
                "JunctionPath": "/share2/folder/share4",
                "SizeInMegabytes": 1024,
                "StorageEfficiencyEnabled": false,
                "StorageVirtualMachineId": "svm-06ea202c6382a01e2",
                "StorageVirtualMachineRoot": false,
                "TieringPolicy": {
                    "Name": "NONE"
                },
                "UUID": "0865444f-743c-11ed-acaf-79eab5a2c0a3",
                "OntapVolumeType": "RW"
            },
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:volume/fs-00f3521e554119927/fsvol-0e82b245a30602da9",
            "VolumeId": "fsvol-0e82b245a30602da9",
            "VolumeType": "ONTAP"
        }
    ]
}

ちょっと見づらいですね。関係あるところはボリューム周りなので、ONTAP CLIでピックアップして確認します。

# ボリューム一覧の確認
FsxId00f3521e554119927::> volume show
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
SVM       SVM_root     aggr1        online     RW          1GB    972.4MB    0%
SVM       vol1         aggr1        online     RW          1GB    972.5MB    0%
SVM       vol2         aggr1        online     RW          1GB    972.5MB    0%
SVM       vol3         aggr1        online     RW          1GB    972.5MB    0%
SVM       vol4         aggr1        online     RW          1GB    972.5MB    0%
5 entries were displayed.

# ボリュームのジャンクションパスを確認
FsxId00f3521e554119927::> volume show -fields junction-path
vserver volume   junction-path
------- -------- -------------
SVM     SVM_root /
SVM     vol1     /share1
SVM     vol2     /share2
SVM     vol3     /share1/share3
SVM     vol4     /share2/folder/share4
5 entries were displayed.

また、ファイル共有はc$ipc$のみです。

FsxId00f3521e554119927::> cifs share show
Vserver        Share         Path              Properties Comment  ACL
-------------- ------------- ----------------- ---------- -------- -----------
SVM            c$            /                 oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions
SVM            ipc$          /                 browsable  -        -
2 entries were displayed.

NetApp.ONTAP PowerShell Toolkitのインストール

次にNetApp.ONTAP PowerShell Toolkitのインストールします。

まず、前提条件を満たしているか確認します。

# .NET Frameworkのバージョンが4.7以上か
> Get-Item 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4


Name                           Property
----                           --------
Full                           CBS           : 1
                               Install       : 1
                               InstallPath   : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
                               Release       : 528449
                               Servicing     : 0
                               TargetVersion : 4.0.0
                               Version       : 4.8.04161

# PowerShellのバージョンが5.1 or 7.0.3 以上か
> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.20348.859
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.20348.859
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

# OSがWindows Server 2012以上か
> Get-WmiObject Win32_OperatingSystem


SystemDirectory : C:\Windows\system32
Organization    : Amazon.com
BuildNumber     : 20348
RegisteredUser  : EC2
SerialNumber    : 00454-60000-00001-AA267
Version         : 10.0.20348

各前提条件は満たしていますね。

それでは、NetApp.ONTAP PowerShell Toolkitのインストールを行います。

# インストール
> Install-Module -Name NetApp.ONTAP

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by
 running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install
and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y

# インストールされたことを確認
> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content, Clear...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object, Convert-String...
Manifest   9.11.1.... NetApp.ONTAP                        {Add-NaAggr, Add-NaCifsShare, Add-NaCredential, Add-NaFpolicyExtensio...
Binary     1.0.0.1    PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package, Get-PackageProvider...
Script     1.0.0.1    PowerShellGet                       {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability, Fi...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKey...

インストールされましたね。

次にインストールされたコマンドレットを確認します。全部で2,340個ほどあるとのことなので、先頭10件のみ表示します。

> Get-Command -Module NetApp.ONTAP | 
    Select-Object -First 10 | 
    Format-Table -AutoSize -Wrap


CommandType Name                         Version     Source
----------- ----                         -------     ------
Alias       Add-NcHostIscsiConnection    9.11.1.2208 NetApp.ONTAP
Alias       Connect-NcHostIscsiTarget    9.11.1.2208 NetApp.ONTAP
Alias       ConvertTo-NcLun              9.11.1.2208 NetApp.ONTAP
Alias       ConvertTo-NcVhd              9.11.1.2208 NetApp.ONTAP
Alias       ConvertTo-NcVhdx             9.11.1.2208 NetApp.ONTAP
Alias       ConvertTo-NcVmdk             9.11.1.2208 NetApp.ONTAP
Alias       Copy-NcHostFile              9.11.1.2208 NetApp.ONTAP
Alias       Disconnect-NcHostIscsiTarget 9.11.1.2208 NetApp.ONTAP
Alias       Dismount-NcHostVolume        9.11.1.2208 NetApp.ONTAP
Alias       Dismount-NcVirtualDisk       9.11.1.2208 NetApp.ONTAP

コマンドレットが認識されていますね。

コマンドレットのヘルプも確認します。試しにAdd-NcHostIscsiConnectionのヘルプの確認です。

> Get-Help Add-NcHostIscsiConnection

Do you want to run Update-Help?
The Update-Help cmdlet downloads the most current Help files for Windows PowerShell modules, and installs them on your computer.
For more information about the Update-Help cmdlet, see https:/go.microsoft.com/fwlink/?LinkId=210614.
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

NAME
    Add-NaHostIscsiConnection

SYNOPSIS
    Add a connection to an existing iSCSI session.


SYNTAX
    Add-NaHostIscsiConnection [-SessionId] <String> [-TargetIp <String>] [-TargetPort <UInt16>] [-InitiatorIp <String>]
    [-HeaderDigest] [-DataDigest] [<CommonParameters>]

    Add-NaHostIscsiConnection [-SessionId] <String> [-TargetIp <String>] [-TargetPort <UInt16>] [-InitiatorIp <String>]
    [-Credential <PSCredential>] [-MutualChap] [-HeaderDigest] [-DataDigest] [-RadiusVerify] [<CommonParameters>]

    Add-NaHostIscsiConnection [-SessionId] <String> [-TargetIp <String>] [-TargetPort <UInt16>] [-InitiatorIp <String>]
    [-MutualChap] [-HeaderDigest] [-DataDigest] [-RadiusGenerate] [-RadiusVerify] [<CommonParameters>]


DESCRIPTION
    Add a connection to an existing iSCSI session.


RELATED LINKS
    Remove-NaHostIscsiConnection

REMARKS
    To see the examples, type: "get-help Add-NaHostIscsiConnection -examples".
    For more information, type: "get-help Add-NaHostIscsiConnection -detailed".
    For technical information, type: "get-help Add-NaHostIscsiConnection -full".
    For online help, type: "get-help Add-NaHostIscsiConnection -online"

ヘルプの確認もできました。例やパラメーターの詳細は末尾に-examples-detailedを付与するようです。

ブラウザで確認したいよ!! という方はC:\Program Files\WindowsPowerShell\Modules\NetApp.ONTAP\9.11.1.2208\webhelp.Cに各コマンドレットのHTMLのマニュアルがあるので、こちらからご確認ください。

> ls "C:\Program Files\WindowsPowerShell\Modules\NetApp.ONTAP\9.11.1.2208\webhelp.C" | Select-Object -First 10


    Directory: C:\Program Files\WindowsPowerShell\Modules\NetApp.ONTAP\9.11.1.2208\webhelp.C


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         5/10/2021   4:33 PM         333036 apis.html
-a----         5/10/2021   4:33 PM           8558 categories.html
-a----         5/10/2021   4:33 PM           3559 cat_active directory.html
-a----         5/10/2021   4:33 PM          12349 cat_aggr.html
-a----         5/10/2021   4:33 PM           4771 cat_antivirus.html
-a----         5/10/2021   4:33 PM           2933 cat_audit.html
-a----         5/10/2021   4:33 PM           6953 cat_autosupport.html
-a----         5/10/2021   4:33 PM           5797 cat_cf.html
-a----         5/10/2021   4:33 PM          21695 cat_cifs.html
-a----         5/10/2021   4:33 PM           2943 cat_clock.html

こちらのHTMLファイルをブラウザで開くと以下のようなります。

Add-NcCifsShareのマニュアル

NetApp.ONTAP PowerShell Toolkitを使ったFSx for ONTAPへの接続

NetApp.ONTAP PowerShell Toolkitを使ってFSx for ONTAPへ接続を行います。

接続はConnect-NcControllerを使用します。実行結果は以下の通りです。

> Connect-NcController management.fs-00f3521e554119927.fsx.us-east-1.amazonaws.com -Credential fsxadmin

Name                 Address           Vserver              Version
----                 -------           -------              -------
management.fs-00f... 10.0.1.126                             NetApp Release 9.11.1P3: Thu Sep 29 16:06:51 UTC 2022

途中認証情報を入力するためのウィンドウが表示されます。fsxadminのパスワードを入力してOKをクリックします。

認証画面

接続ができたら、CIFSサーバーとファイル共有を確認します。

# CIFSサーバーの一覧
> Get-NcCifsServer

CifsServer                AuthStyle       Domain                              OrganizationalUnit
----------                ---------       ------                              ------------------
SVM                                       CORP.NON-97.NET                     OU=FSxForONTAP,DC=corp...

# ファイル共有の一覧
> Get-NcCifsShare

CifsServer                ShareName       Path                                Comment
----------                ---------       ----                                -------
                          c$              /
                          ipc$            /

どちらも確認できました。ただ、Get-NcCifsShareCifsServerが表示されないのがちょっと気がかりです。

ファイル共有をFSx for ONTAP上に作成

本題の、FSx for ONTAP上への現行ファイルサーバーのファイル共有と同じ設定のファイル共有の作成を行います。

用意したスクリプトは以下の通りです。

# ファイル共有を作成するSVMの名前
$svm_name = "SVM"

Get-SmbShare -CimSession $src_cim -Special $false | ForEach-Object {   
    # 現行ファイルサーバーの共有情報の確認
    echo "========================================================"
    echo "[src smb share]"
    echo "-----------------------------"
    echo $_ | Format-Table -AutoSize -Wrap
    echo "-----------------------------"

    $src_smb_share = $_

    # SVM上に現行ファイルサーバーと同じ名前、パスのファイル共有を作成
    $dst_smb_share = Add-NcCifsShare `
        -Name $src_smb_share.Name `
        -Path $src_smb_share.Path.Replace("C:\data", "").Replace("\", "/") `
        -VserverContext "$svm_name"

    # デフォルトで設定される Everyone への許可を削除
    Remove-NcCifsShareAcl `
        -Share $dst_smb_share.ShareName `
        -UserOrGroup Everyone `
        -UserGroupType windows `
        -VserverContext $svm_name

    # ファイル共有のACLの設定
    $_ | Get-SmbShareAccess | ForEach-Object {
        # 現行ファイルサーバーのファイル共有のACLを確認
        echo "**********************************"
        echo "[src smb share acl]"
        echo "-----------------------------"
        echo $_ | Format-Table -AutoSize -Wrap
        echo "-----------------------------"

        # -Permission で指定する文字列を整形
        $access_right = ([string]$_.AccessRight).ToLower() 
        $permission = if ("$access_right" -eq "full") {
            Write-Output "full_control"
        } else {
            Write-Output "$access_right"
        }

        # 現行ファイルサーバーのファイル共有に合わせてACEを追加
        $dst_smb_share_acl = if ( $_.AccessControlType -eq 'Allow' ) {
            Add-NcCifsShareAcl `
                -Share $dst_smb_share.ShareName `
                -UserOrGroup $_.AccountName `
                -Permission "$permission" `
                -UserGroupType "windows" `
                -VserverContext "$svm_name"
        } else { 
            Add-NcCifsShareAcl `
                -Share $dst_smb_share.ShareName `
                -UserOrGroup $_.AccountName `
                -Permission "no_access" `
                -UserGroupType "windows" `
                -VserverContext "$svm_name"
        }

        # 追加したACEの確認
        echo "[dst smb share acl]"
        echo "-----------------------------"
        echo $dst_smb_share_acl
        echo "-----------------------------"
        echo "**********************************"
    }
    echo "========================================================"
}

処理の流れは以下の通りです。

  1. 現行ファイルサーバーのファイル共有一覧を取得
  2. 現行ファイルサーバーのファイル共有と同じ名前、パスのファイル共有をFSx for ONTAP上に作成する
  3. FSx for ONTAP上に作成されたファイル共有から Everyone への許可を削除する
  4. 現行ファイルサーバーのファイル共有に設定されているACLを取得
  5. 現行ファイルサーバーのファイル共有に設定されているACLのACEと同じユーザー名、権限でFSx for ONTAP上のファイル共有のACLにACEを追加する

こちらのスクリプトの実行結果した際の標準出力は以下の通りです。

========================================================
[src smb share]
-----------------------------

Name   ScopeName Path           Description PSComputerName
----   --------- ----           ----------- --------------
share1 *         C:\data\share1             FILE-SHARE.corp.non-97.net


-----------------------------
**********************************
[src smb share acl]
-----------------------------

Name   ScopeName AccountName            AccessControlType AccessRight
----   --------- -----------            ----------------- -----------
share1 *         BUILTIN\Administrators Allow             Full


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup            Permission
-----  -----------            ----------
share1 BUILTIN\Administrators full_control
-----------------------------
**********************************
**********************************
[src smb share acl]
-----------------------------



Name   ScopeName AccountName AccessControlType AccessRight
----   --------- ----------- ----------------- -----------
share1 *         Everyone    Allow             Full


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup Permission
-----  ----------- ----------
share1 Everyone    full_control
-----------------------------
**********************************
========================================================
========================================================
[src smb share]
-----------------------------



Name   ScopeName Path           Description PSComputerName
----   --------- ----           ----------- --------------
share2 *         C:\data\share2             FILE-SHARE.corp.non-97.net


-----------------------------
**********************************
[src smb share acl]
-----------------------------

Name   ScopeName AccountName            AccessControlType AccessRight
----   --------- -----------            ----------------- -----------
share2 *         BUILTIN\Administrators Allow             Full


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup            Permission
-----  -----------            ----------
share2 BUILTIN\Administrators full_control
-----------------------------
**********************************
========================================================
========================================================
[src smb share]
-----------------------------



Name   ScopeName Path                  Description PSComputerName
----   --------- ----                  ----------- --------------
share3 *         C:\data\share1\share3             FILE-SHARE.corp.non-97.net


-----------------------------
**********************************
[src smb share acl]
-----------------------------

Name   ScopeName AccountName AccessControlType AccessRight
----   --------- ----------- ----------------- -----------
share3 *         Everyone    Allow             Read


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup Permission
-----  ----------- ----------
share3 Everyone    read
-----------------------------
**********************************
**********************************
[src smb share acl]
-----------------------------



Name   ScopeName AccountName   AccessControlType AccessRight
----   --------- -----------   ----------------- -----------
share3 *         CORP\FSxAdmin Allow             Full


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup   Permission
-----  -----------   ----------
share3 CORP\FSxAdmin full_control
-----------------------------
**********************************
========================================================
========================================================
[src smb share]
-----------------------------



Name   ScopeName Path                         Description PSComputerName
----   --------- ----                         ----------- --------------
share4 *         C:\data\share2\folder\share4             FILE-SHARE.corp.non-97.net


-----------------------------
**********************************
[src smb share acl]
-----------------------------

Name   ScopeName AccountName AccessControlType AccessRight
----   --------- ----------- ----------------- -----------
share4 *         CORP\user01 Deny              Full


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup Permission
-----  ----------- ----------
share4 CORP\user01 no_access
-----------------------------
**********************************
**********************************
[src smb share acl]
-----------------------------



Name   ScopeName AccountName AccessControlType AccessRight
----   --------- ----------- ----------------- -----------
share4 *         Everyone    Allow             Read


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup Permission
-----  ----------- ----------
share4 Everyone    read
-----------------------------
**********************************
**********************************
[src smb share acl]
-----------------------------



Name   ScopeName AccountName   AccessControlType AccessRight
----   --------- -----------   ----------------- -----------
share4 *         CORP\FSxAdmin Allow             Change


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup   Permission
-----  -----------   ----------
share4 CORP\FSxAdmin change
-----------------------------
**********************************
**********************************
[src smb share acl]
-----------------------------



Name   ScopeName AccountName        AccessControlType AccessRight
----   --------- -----------        ----------------- -----------
share4 *         CORP\FSxAdminGroup Allow             Read


-----------------------------
[dst smb share acl]
-----------------------------

Share  UserOrGroup        Permission
-----  -----------        ----------
share4 CORP\FSxAdminGroup read
-----------------------------
**********************************
========================================================

特にエラーなく実行できていますね。

FSx for ONTAP上のファイル共有を確認してみます。

# ファイル共有の確認
FsxId00f3521e554119927::> cifs share show
Vserver        Share         Path              Properties Comment  ACL
-------------- ------------- ----------------- ---------- -------- -----------
SVM            c$            /                 oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions
SVM            ipc$          /                 browsable  -        -
SVM            share1        /share1           browsable  -        BUILTIN\Administrators / Full Control
                                               show-previous-versions
                                                                   Everyone / Full Control
SVM            share2        /share2           browsable  -        BUILTIN\Administrators / Full Control
                                               show-previous-versions
SVM            share3        /share1/share3    browsable  -        CORP\FSxAdmin / Full Control
                                               show-previous-versions
                                                                   Everyone / Read
SVM            share4        /share2/folder/   browsable  -        CORP\FSxAdmin / Change
                             share4            show-previous-versions
                                                                   CORP\FSxAdminGroup / Read
                                                                   CORP\user01 / No access
                                                                   Everyone / Read
6 entries were displayed.

# ファイル共有のACLの確認
FsxId00f3521e554119927::> cifs share access-control show
               Share       User/Group                  User/Group  Access
Vserver        Name        Name                        Type        Permission
-------------- ----------- --------------------------- ----------- -----------
SVM            c$          BUILTIN\Administrators      windows     Full_Control
SVM            share1      BUILTIN\Administrators      windows     Full_Control
SVM            share1      Everyone                    windows     Full_Control
SVM            share2      BUILTIN\Administrators      windows     Full_Control
SVM            share3      CORP\FSxAdmin               windows     Full_Control
SVM            share3      Everyone                    windows     Read
SVM            share4      CORP\FSxAdmin               windows     Change
SVM            share4      CORP\FSxAdminGroup          windows     Read
SVM            share4      CORP\user01                 windows     No_access
SVM            share4      Everyone                    windows     Read
10 entries were displayed.

FsxId00f3521e554119927::>

現行ファイルサーバー上のファイル共有と同じファイル共有、ACLが設定されていました。

NetApp.ONTAP PowerShell Toolkitから作成したファイル共有には、ONTAP CLIから作成するとデフォルトで付与されるoplockschangenotifyが付与されていなかったので手動で付与してあげます。

# oplocks と changenotify の付与
FsxId00f3521e554119927::> cifs share properties add -share-name share* -share-properties oplocks, changenotify
4 entries were acted on.

# 作成したファイル共有に oplocks と changenotify が付与されたことを確認
FsxId00f3521e554119927::> cifs share show
Vserver        Share         Path              Properties Comment  ACL
-------------- ------------- ----------------- ---------- -------- -----------
SVM            c$            /                 oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions
SVM            ipc$          /                 browsable  -        -
SVM            share1        /share1           oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable           Everyone / Full Control
                                               changenotify
                                               show-previous-versions
SVM            share2        /share2           oplocks    -        BUILTIN\Administrators / Full Control
                                               browsable
                                               changenotify
                                               show-previous-versions
SVM            share3        /share1/share3    oplocks    -        CORP\FSxAdmin / Full Control
                                               browsable           Everyone / Read
                                               changenotify
                                               show-previous-versions
SVM            share4        /share2/folder/   oplocks    -        CORP\FSxAdmin / Change
                             share4            browsable           CORP\FSxAdminGroup / Read
                                               changenotify        CORP\user01 / No access
                                               show-previous-versions
                                                                   Everyone / Read

めでたし。めでたし。

と言いたいところですが、このスクリプトではACLのFull Control以外のDenyを表現することができません。例えばReadのみのDenyを表現しようとしても必ずNo accessとなります。これはONTAP REST APIの仕様上、ファイル共有のACLのタイプは許可/拒否で分かれているのではなく、以下の4つしか選択できないためです。

  • Full_Control
  • Change
  • Read
  • No_access

もし、ReadのみのDenyがある場合は、手動で設定するのが良いでしょう。

ONTAP REST APIとのスクリプトを組み合わせたい時に

NetApp.ONTAP PowerShell Toolkitを使ったスクリプトで、現行ファイルサーバーのファイル共有の設定と(ほぼ)同じ設定のファイル共有をFSx for ONTAP上に作成してみました。

「ONTAP REST APIをそのまま触るのはちょっと辛い...」という方には特にオススメです。スクリプトで処理させたい内容に応じてNetApp.ONTAP PowerShell ToolkitかNetApp ONTAP Python client libraryを使い分けると良いでしょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!