PowerShellから直接ssh接続でNetAppにログインして設定情報を取得してCSV化するスクリプト


先日「NetAppの設定内容をcsvファイルに出力したい」という記事で手動でやる手法について記載した。

最近のWindowsだと直接sshコマンドが実行できるようになっているので、NetApp側に公開鍵を登録して、パスワードなしでアクセスできるように設定した上で、PowerShellスクリプトを実行することで、設定をスクリプト化できないかを実施してみた。

とりあえず全項目とればいいか、と「-showallfields true」設定でやっているが、下記スクリプトはONTAP 9.10.1の場合のもので、バージョンが異なると全部の項目数が変わる可能性があるので、一度手動で「set -privilege admin -rows 0 -units GB -showallfields true ; vserver cifs share show”」を実行し、出力される項目名を確認しておくこと

# タブ区切りのため `t を指定
$count=0
$flag=0
$results=@()

$results=cmd /c ssh.exe -l admin NetAppクラスタ "set -privilege admin -rows 0 -showseparator `t -units GB -showallfields true ; vserver cifs share show" | ForEach-Object {
    $line=$_.split("`t")
    if(($line[0] -eq "vserver") -and ($flag -eq 0)){
        $flag=1
        $titlecount=$count
    }
    if(($flag -eq 1) -and ($count -gt ($titlecount+1))){
        $output = New-Object -TypeName psobject
        $output | Add-Member -MemberType NoteProperty -Name "vserver" -Value $line[0]
        $output | Add-Member -MemberType NoteProperty -Name "share-name" -Value $line[1]
        $output | Add-Member -MemberType NoteProperty -Name "cifs-server" -Value $line[2]
        $output | Add-Member -MemberType NoteProperty -Name "path" -Value $line[3]
        $output | Add-Member -MemberType NoteProperty -Name "share-properties" -Value $line[4]
        $output | Add-Member -MemberType NoteProperty -Name "symlink-properties" -Value $line[5]
        $output | Add-Member -MemberType NoteProperty -Name "file-umask" -Value $line[6]
        $output | Add-Member -MemberType NoteProperty -Name "dir-umask" -Value $line[7]
        $output | Add-Member -MemberType NoteProperty -Name "comment" -Value $line[8]
        $output | Add-Member -MemberType NoteProperty -Name "acl" -Value $line[9]
        $output | Add-Member -MemberType NoteProperty -Name "attribute-cache-ttl" -Value $line[10]
        $output | Add-Member -MemberType NoteProperty -Name "volume" -Value $line[11]
        $output | Add-Member -MemberType NoteProperty -Name "offline-file" -Value $line[12]
        $output | Add-Member -MemberType NoteProperty -Name "vscan-fileop-profile" -Value $line[13]
        $output | Add-Member -MemberType NoteProperty -Name "max-connections-per-share" -Value $line[14]
        $output | Add-Member -MemberType NoteProperty -Name "force-group-for-create" -Value $line[15]
        $output
    }
    $count++
}

$results | Export-Csv test.csv -Encoding UTF8 -NoTypeInformation  -NoClobber

ONTAPのCIFSファイルサーバで複数のホスト名でアクセスできるようにしたい


ONTAPでCIFSファイルサーバを作る時、本来のホスト名とは違うホスト名でもアクセスできるようにしておきたい、ということがある。

(サーバ統合で2台が1台になるけど、どちらでも使える様にした、など)

NetAppの標準設定では、SVMをActive Directoryに参加させる際に指定したNetBIOS名とIPアドレスでのアクセス以外は受け付けないようになっている。

例えば、下記の様に「システムエラー 59」「予期しないネットワーク エラーが発生しました。」といったエラーが出力される。

C:\Users\Administrator>net use \\winserver\testvol
\\winserver\testvol のパスワードが無効です。

'winserver' のユーザー名を入力してください: ADOSAKANA\testuser1
winserver のパスワードを入力してください:
システム エラー 59 が発生しました。

予期しないネットワーク エラーが発生しました。


C:\Users\Administrator>

SVMの設定を確認すると下記の様になっている。

netapp9101::> vserver cifs show -ins
                                          Vserver: svm0
                         CIFS Server NetBIOS Name: SVM0
                    NetBIOS Domain/Workgroup Name: ADOSAKANA
                      Fully Qualified Domain Name: ADOSAKANA.LOCAL
                              Organizational Unit: CN=Computers
Default Site Used by LIFs Without Site Membership:
                                   Workgroup Name: -
                             Authentication Style: domain
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: -
 netapp9101::>

上記の場合、「svm0」とIPアドレス指定でのアクセス以外は受け付けない。

他のホスト名でもアクセスできるようにするにはNetBIOS Aliasを追加する必要がある。

(なお、別途、標準では無効となっているNetBIOSを有効にする必要がある。ただし、これを有効にした場合、NetApp SVM名と同じNetBIOS名の告知も始めてしまうので注意)

netapp9101::> vserver cifs add-netbios-aliases -netbios-aliases WINSERVER -vserver svm0
netapp9101::> vserver cifs show -ins
                                          Vserver: svm0
                         CIFS Server NetBIOS Name: SVM0
                    NetBIOS Domain/Workgroup Name: ADOSAKANA
                      Fully Qualified Domain Name: ADOSAKANA.LOCAL
                              Organizational Unit: CN=Computers
Default Site Used by LIFs Without Site Membership:
                                   Workgroup Name: -
                             Authentication Style: domain
                CIFS Server Administrative Status: up
                          CIFS Server Description:
                          List of NetBIOS Aliases: WINSERVER
 netapp9101::>

さて、これでアクセスできるようになったかな?と試してみるが、同じエラーが継続

C:\Users\Administrator>net use \\winserver\testvol
\\winserver\testvol のパスワードが無効です。

'winserver' のユーザー名を入力してください: ADOSAKANA\testuser1
winserver のパスワードを入力してください:
システム エラー 59 が発生しました。

予期しないネットワーク エラーが発生しました。


C:\Users\Administrator>

NetApp KB:Access by NETBIOS Alias fails に該当する問題だった。

今回のADOSAKANAドメインには、既に「WINSERVER」としてコンピュータアカウントがあった。

これが残っていると問題が発生するらしい。

まず、Windows上からコンピュータアカウントWINSERVERに関する情報をsetspn -lコマンドで確認すると下記の様な内容で登録されていた。

C:\Users\Administrator>setspn -l winserver
次の項目に登録されている CN=WINSERVER,CN=Computers,DC=ADOSAKANA,DC=LOCAL:
        HOST/winserver.adosakana.local
        RestrictedKrbHost/winserver.adosakana.local
        HOST/WINSERVER
        RestrictedKrbHost/WINSERVER
        WSMAN/winserver.adosakana.local
        WSMAN/WINSERVER
        TERMSRV/winserver.adosakana.local
        TERMSRV/WINSERVER

C:\Users\Administrator>

次に、NetApp SVMとして登録されているsvm0について確認してみると、だいぶ少ない内容で登録されていた。

C:\Users\Administrator>setspn -l svm0
次の項目に登録されている CN=SVM0,CN=Computers,DC=ADOSAKANA,DC=LOCAL:
        HOST/SVM0
        HOST/svm0.adosakana.local

C:\Users\Administrator>

まず、WindowsのActive Directgory側でコンピュータアカウント「WINSERVER」を削除。

続いてNetApp KBにあるようにsetspn -aコマンドでWINSERVERをsvm0に追加する形で登録

C:\Users\Administrator>setspn -a HOST/WINSERVER svm0
ドメイン DC=ADOSAKANA,DC=local を確認しています

CN=SVM0,CN=Computers,DC=ADOSAKANA,DC=LOCAL の ServicePrincipalNames を登録しています
        HOST/WINSERVER
更新されたオブジェクト

C:\Users\Administrator>

どのような登録になったのかを確認してみると、svm0の出力にwinserverが追加されており、winserverというエントリは無くなったことが分かる。

C:\Users\Administrator>setspn -l svm0
次の項目に登録されている CN=SVM0,CN=Computers,DC=adosakana,DC=local:
        HOST/SVM0
        HOST/svm0.adosakana.local
        HOST/WINSERVER

C:\Users\Administrator>setspn -l winserver
FindDomainForAccount: DsGetDcNameWithAccountW への呼び出しが失敗し、戻り値 0x00000525 が返されました
アカウント winserver は見つかりませんでした

C:\Users\Administrator>

この状態で先ほどエラーになったnet useコマンドを実行すると、正常に実行ができる。

C:\Users\Administrator>net use \\winserver\testvol
\\winserver\testvol のパスワードが無効です。

'winserver' のユーザー名を入力してください: adosakana\testuser1
winserver のパスワードを入力してください:
コマンドは正常に終了しました。


C:\Users\Administrator>

ONTAP Antivirus Connector の接続ステータス確認方法


ONTAP Antivirus Connector でONTAPとアンチウイルスソフトを連携させる場合に、ONTAPからの接続ステータス確認手法がいまいちよく分からなかったのでメモ書き。

基本的な接続状況確認コマンド

「vserver vscan connection-status show-all」で確認する。

netappcluster::> vserver vscan connection-status show-all
                                              Connection
Vserver     Node              Server          Status         Disconnect Reason
----------- ----------------- --------------- -------------- -----------------
svm0        netapp01         192.168.10.110   disconnected   remote-closed
svm0        netapp01         192.168.10.111   connected      na
svm0        netapp01         192.168.10.112   connected      na
svm0        netapp01         192.168.10.113   connected      na
svm0        netapp02         192.168.10.110   disconnected   -
svm0        netapp02         192.168.10.111   disconnected   -
svm0        netapp02         192.168.10.112   disconnected   -
svm0        netapp02         192.168.10.113   disconnected   -
8 entries were displayed.

netappcluster::>

上記の場合、ONTAP Antivirus Connectorがインストールされていて、接続設定されているのは、「192.168.10.110~192.168.10.113」の4台あって、そのうち、192.168.10.110の1台だけ接続できてない、という状態となっている。

「Disconnect Reason」に「remote-closed」とあるため、NetAppと192.168.10.110間の通信は行えるものの192.168.10.110側で接続を切断している、という意味合いとなるようだ。

詳細ログ確認

上記の「remote-closed」だけだと詳細が分からない。

詳細ログはadvanced権限でみれるようになっているため、権限切り替えした上で「vserver vscan show-events」を実行する。

なお、「rows 0」を実行して24行で止める設定を解除している場合、その時に出ているイベントが全件強制表示されてしまうため「rows 24」などで画面を止めるように設定しておくことを推奨。

netappcluster::> set adv

Warning: These advanced commands are potentially dangerous; use them only when
         directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

netappcluster::*>

netappcluster::*> vserver vscan show-events

Vserver     Node            Server          Event Type        Event Time
----------- --------------- --------------- ----------------- -----------------
svm0        netapp01        192.168.10.110  scanner-          1/31/2023
                                            disconnected      18:05:37
svm0        netapp01        192.168.10.110  scanner-connected 1/31/2023
                                                              18:01:45
<略>

上記では簡単な理由しかわからないので「-ins」オプションを付けて実行

ossv0059::*> vserver vscan show-events -ins

                           Node: netapp01
                 Event Log Time: 1/31/2023 18:05:37
                         Server: 192.168.10.110
                     Event Type: scanner-disconnected
                      File Path: -
                Vscanner Vendor: -
               Vscanner Version: -
       Server Disconnect Reason: remote-closed
Vserver LIF Used for Connection: 192.168.10.10

                           Node: netapp01
                 Event Log Time: 1/31/2023 18:01:45
                         Server: 192.168.10.110
                     Event Type: scanner-connected
                      File Path: -
                Vscanner Vendor: vendor not registered
               Vscanner Version: 0.0
       Server Disconnect Reason: -
Vserver LIF Used for Connection: 192.168.10.10
<略>

remote-closedとなる前に「scanner-connected」の時に、「Vscanner Vendor: vendor not registered」という怪しげなステータスとなっている。

じゃあ、各サーバとの接続状態でこの「Vscanner Vendor」の情報を確認する手法はあるか確認するとvscan connection-status で取得出来る情報の中にあった。

「vserver vscan connection-status show-all -fields version,vendor,server-status,connected-since」を実行する

netappcluster::> vserver vscan connection-status show-all -fields version,vendor,server-status,connected-since
node     vserver  server         server-status vendor                     version     connected-since
-------- -------- -------------- ------------- -------------------------- ----------- ------------------
svm0     netapp01 192.168.10.110 disconnected  vendor not registered      0.0         -
svm0     netapp01 192.168.10.111 connected     symantec protection engine 20230130.19 1/31/2023 17:34:33
svm0     netapp01 192.168.10.112 connected     symantec protection engine 20230130.19 1/31/2023 17:35:20
svm0     netapp01 192.168.10.113 connected     symantec protection engine 20230130.19 1/31/2023 17:35:25
svm0     netapp02 192.168.10.110 disconnected  -                          -           -
svm0     netapp02 192.168.10.111 disconnected  -                          -           -
svm0     netapp02 192.168.10.112 disconnected  -                          -           -
svm0     netapp02 192.168.10.113 disconnected  -                          -           -
8 entries were displayed.

netappcluster::>

remote-closedとなっているサーバ以外は正常な製品名と、おそらくパターンファイルのバージョンっぽいのが表示されている。

disconnectedとなっている 192.168.10.110サーバ上で動作しているONTAP Antivirus connectorとアンチウイルスソフト間の通信に問題があり、ONTAP Antivirus connector側で情報がきちんと取得されていないために発生している、ということのようだった。


NetApp KBのメモ

ONTAP Vscan(ウィルス対策)およびAntivirus Connector(AVConnector)解決ガイド
 antivirus connectorの問題に関するリンク集

ONTAP Antivirus Connector ロギングを有効にする方法
 Windows上で動作するAntivirus Connectorのログを取るためにはレジストリ設定変更が必要
 標準ではログ取らない。保存先ログファイル名もレジストリで明示的に設定する

FAQ :アンチウイルスコネクタのコマンドラインスイッチとして使用できるオプションは何ですか
 Windows上で動作するAntivirus Connectorで以下の設定を変更することができる
  AVコネクタ動作時にDNS逆引きを行う(デフォルト)のを行わない様に変更する
   「net start ontapavc /ipaddrtodns:false」
  AVコネクタはhttps(port 443)を使用するが、他のポートを使う場合に変更できる
   「net start ontapavc /transport:http /port:80」(http で port 80)
   「net start ontapavc /transport:https /port:443」(https で port 443)

・「Vscan サーバが ONTAP に接続できません スキャナプールの設定が正しくない
 ONTAPに登録するprivileged userと、Windowsサーバ上のONTAP AVconnectorとアンチウイルスエンジンの動作ユーザが同じであることを確認
 ONTAPに登録するスキャンサーバをホスト名登録した場合、ホスト名と名前解決したIPアドレスが一致すること(一致しない場合接続を拒否=DNSラウンドロビン不可)
 特権ユーザの指定は「ドメイン名\ユーザ名」形式で行う(ユーザ名@ドメイン名は使えない)

・「AVコネクタに401 Unauthorizedと表示されます
 Windowsサーバ上のONTAP AVconnectorからONTAPにアクセスする際は、httpアプリケーションとしてアクセスされるので、使用するONTAPのユーザに「-application http」を追加する
 また、別資料を見ると「指定したユーザに対して「 ontapi 」アプリケーションが有効になっていません」とか「AV コネクタが https 接続をネゴシエートできない(セキュアでない http を使用して正常に動作する)」という記述もあるため、https,ontapi に関する設定も確認する

・「ONTAP AV コネクタが Vserver のデータインターフェイスに接続できません
 ONTAP Avconnectorの接続をデータLIFにする場合、標準設定のままでは使えない
 management-https を追加すること

Vscan サーバが「 connected 」と表示されていますが、「 vendor not registered 」がになって 表示されます
 NetApp的には「Vscan の設定が正しくありません」
 「Vscan サービスが停止しました」
 「Vscan サービスはループバックアドレス 127.0.0.1 を参照していません。」

NetAppでデータSVMにsshの管理アクセスできるようにする


NetAppでファイルサービスを提供するデータSVMにsshで管理アクセスできるようにしてくれ、という要望があった。

普通にマネージメントLIFの管理WebからデータSVMに対して、sshユーザアクセス可能なユーザを追加してみたけど、sshでアクセスできるようになるわけではなかった。

データアクセス用のLIFに対してsshサービスが許可されていないからかな?と思って network interface service-policy の下を見てみるとshowしかなく変更ができないっぽい?

netapp9101::> network interface service-policy ?
  show                        Display existing service policies

netapp9101::>

とりあえず現状のservice-policy定義を見てみる

netapp9101::> network interface service-policy show
Vserver   Policy                     Service: Allowed Addresses
--------- -------------------------- ----------------------------------------
Cluster
          default-cluster            cluster-core: 0.0.0.0/0

netapp9101
          default-intercluster       intercluster-core: 0.0.0.0/0
                                     management-https: 0.0.0.0/0
                                     backup-ndmp-control: 0.0.0.0/0

          default-management         management-core: 0.0.0.0/0
                                     management-autosupport: 0.0.0.0/0
                                     management-ssh: 0.0.0.0/0
                                     management-https: 0.0.0.0/0
                                     management-ems: 0.0.0.0/0
                                     management-ntp-client: 0.0.0.0/0
                                     management-http: 0.0.0.0/0
                                     backup-ndmp-control: 0.0.0.0/0
                                     management-snmp-server: 0.0.0.0/0
                                     management-ntp-server: 0.0.0.0/0

          default-route-announce     management-bgp: 0.0.0.0/0

svm0
          default-data-blocks        data-core: 0.0.0.0/0
                                     data-iscsi: 0.0.0.0/0

          default-data-files         data-core: 0.0.0.0/0
                                     data-nfs: 0.0.0.0/0
                                     data-cifs: 0.0.0.0/0
                                     data-flexcache: 0.0.0.0/0
                                     data-fpolicy-client: 0.0.0.0/0
                                     data-dns-server: 0.0.0.0/0

          default-data-iscsi         data-core: 0.0.0.0/0
                                     data-iscsi: 0.0.0.0/0

          default-data-nvme-tcp      data-core: 0.0.0.0/0
                                     data-nvme-tcp: 0.0.0.0/0

          default-management         data-core: 0.0.0.0/0
                                     management-ssh: 0.0.0.0/0
                                     management-https: 0.0.0.0/0
                                     data-dns-server: 0.0.0.0/0
                                     management-http: 0.0.0.0/0
                                     backup-ndmp-control: 0.0.0.0/0
                                     management-snmp-server: 0.0.0.0/0
netapp9101::>

LIF のサービスポリシーを設定」を見るとadvanced権限であれば変更できるらしい

とりあえずsvm0の「default-data-files」に「management-ssh」を追加してみた。

netapp9101::> set advanced

Warning: These advanced commands are potentially dangerous; use them only when
         directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

netapp9101::*> network interface service-policy add-service -vserver svm0 -policy default-data-files -service management-ssh

netapp9101::*> 

変更した結果が反映されているかを確認

netapp9101::*> network interface service-policy show -vserver svm0 -policy default-data-files

                   Vserver: svm0
               Policy Name: default-data-files
         Included Services: data-core, data-nfs, management-ssh,
                            data-fpolicy-client, data-dns-server
Service: Allowed Addresses: data-core: 0.0.0.0/0
                            data-nfs: 0.0.0.0/0
                            management-ssh: 0.0.0.0/0
                            data-fpolicy-client: 0.0.0.0/0
                            data-dns-server: 0.0.0.0/0

netapp9101::*>

これでsvmのデータLIFにsshでログインできるようになった

NetAppのstart-time/end-time指定は役立たずなのでは?


NetAppのsnapmirror履歴を見るため「snapmirror show-history」を実行すると、長々と出力される。

調べるとsnapmirror show-historyには下記の指定ができるようだった。

[-start-time <MM/DD/YYYY HH:MM:SS>] – Start Time
Select SnapMirror operations that have a matching start time.

[-end-time <MM/DD/YYYY HH:MM:SS>] – End Time
Select SnapMirror operations that have a matching end time.

なるほどー、と思って、2022/12/21 15:00:00以降の履歴と思って実行してみると・・・

netapp9101dr::> snapmirror show-history -start-time "12/21/2022 15:00:00"
There are no entries matching your query.

netapp9101dr::>

何も無い・・・

引数無しで実行するとある

netapp9101dr::> snapmirror show-history

Destination Source                Start       End
Path        Path        Operation Time        Time        Result
----------- ----------- --------- ----------- ----------- -------
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:25:00 12/21/2022 15:25:04 success
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:15:00 12/21/2022 15:15:04 success
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:05:00 12/21/2022 15:05:04 success
<略>
netapp9101dr::>

まさかと思って、結果に表示された時刻を指定してみる・・・

netapp9101dr::> snapmirror show-history -start-time "12/21/2022 15:05:00"

Destination Source                Start       End
Path        Path        Operation Time        Time        Result
----------- ----------- --------- ----------- ----------- -------
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:05:00 12/21/2022 15:05:04 success

netapp9101dr::>

1秒でもずらすと表示されない

netapp9101dr::> snapmirror show-history -start-time "12/21/2022 15:05:01"
There are no entries matching your query.

netapp9101dr::> snapmirror show-history -start-time "12/21/2022 15:04:59"
There are no entries matching your query.

netapp9101dr::>

マニュアル記述をよく見てみると「Select SnapMirror operations that have a matching start time」とあり、一致したものという限定だった

日時を指定しないで実行出来るか試してみる・・・

netapp9101dr::> snapmirror show-history -start-time 12/21/2022 

Error: "12/21/2022" is an invalid value for field "-start-time <"MM/DD/YYYY
       HH:MM:SS">"

netapp9101dr::>

?や*で指定はできるか、も試したが駄目だった

netapp9101dr::> snapmirror show-history -start-time 12/21/2022  ?

Error: "12/21/2022" is an invalid value for field "-start-time <"MM/DD/YYYY
       HH:MM:SS">"

netapp9101dr::> snapmirror show-history -start-time 12/21/2022 *:*:*
There are no entries matching your query.

netapp9101dr::>

じゃあ、出力数を制限する他の方法はないのかなーとsnapmirror show-historyのexamplesを見たら「snapmirror show-history -max-rows-per-relationship 1」を実行すると、snapmirror関係ごとに1個だけ表示するよ、とのこと

じゃあ、最近の4件表示と実行してみたところ、目的を達成したという感じとなった。

netapp9101dr::> snapmirror show-history -max-rows-per-relationship 4

Destination Source                Start       End
Path        Path        Operation Time        Time        Result
----------- ----------- --------- ----------- ----------- -------
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:25:00 12/21/2022 15:25:04 success
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:15:00 12/21/2022 15:15:04 success
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 15:05:00 12/21/2022 15:05:04 success
svmdr:vol_shares_dest svm0:shares scheduled-update 12/21/2022 14:55:00 12/21/2022 14:55:04 success
4 entries were displayed.

netapp9101dr::>