如何在不使用SDK的情况下查询NetAPP ONTAP API?

我有一堆NetApp文件pipe理器,我一直通过ssh访问公钥和私钥对。

我想扩展我正在做的事情 – 我们反复地遇到了一些限制,例如ssh没有完成命令(在执行之前断开连接),并且我们运行的命令的输出格式是“人类可读的”,这意味着它很烦人机器parsing。

所以我想查询这个API,出于各种各样的原因,我想使用CPAN中的“现货”模块,而不是NetApp SDK。

可以做到这一点,如果是的话如何?

(我曾经思考过这是否更适合堆栈溢出,但得出的结论是,这可能与系统pipe理员比perl脚本更相关)。

基础很简单 – 有两件事需要复制:

  • XML
  • HTTP(S)

从CPAN,有各种模块可以做到这一点。 我喜欢LWPXML::Twig

它有点像这样:

 #!/usr/local/bin/perl use strict; use warnings; use XML::Twig; use LWP::UserAgent; my $filer = 'filername'; my $vfiler = 'vfilername'; my $user = 'api-user'; my $pass = 'api-pass'; my $api_call = 'volume-list-info'; my %api_param = ( volume => 'vfiler_vol0' ); my $API = '/servlets/netapp.servlets.admin.XMLrequest_filer'; my $url = "https://$filer/$API"; my $xml_request = XML::Twig->new(); $xml_request->set_root( XML::Twig::Elt->new( 'netapp', { version => '1.7', vfiler => $vfiler, xmlns => 'http://www.netapp.com/filer/admin' }, ) ); my $req = $xml_request->root->insert_new_elt($api_call); foreach my $key ( keys %api_param ) { $req->insert_new_elt( $key, $api_param{$key} ); } $xml_request->set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"'); $xml_request->set_xml_version('1.0'); $xml_request->set_encoding('utf-8'); my $agent = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0, SSL_version => 'SSLv3' } ); my $request = HTTP::Request->new( POST => $url ); $request->content( $xml_request->sprint ); $request->authorization_basic( $user, $pass ); my $results = $agent->request($request); if ( $results->is_success ) { #do nothing yet } else { print "Request error:", $results->status_line; die; } my $results_twig = XML::Twig->new( pretty_print => 'indented' ); $results_twig->parse( $results->content ); #dump the whole thing $results_twig->print; print some values selectively. foreach my $vol ( $results_twig -> root -> children('volume-info') ) { print $vol -> first_child_text('name'), " "; print $vol -> first_child_text('state'),"\n"; }