PowerShell でIE自動実行(その2)
前回作成したPowerShellスクリプトではエラーハンドリングをほとんどやらなかったせいか、途中でスクリプトが止まっていることがあり、大幅に見直しを実施した。
具体手的な処理の順番は変わってないが、関数化と try ・・・catch でエラーを補足するように修正。
PowerShell でIE自動実行
最近、PowerShellを使用してIEを自動実行させられることがわかったので、以前より自動化させたかったルータの再起動処理(※)をスクリプト化してみる。
(WZR-1166DHP Version 2.13で動作確認)
スクリプト化のポイント
1. スクリプトの動作は、PowerShell 4.0の実行環境で確認している。
以下2つをMicrosoftのサイトよりダウンロードしてインストールする。
・Windows Management Framework 4.0
・Microsoft .NET Framework 4.5
※Windows 7のデフォルトのPowerShell 2.0の環境でも動作しなくはないがiframeのオブジェクトなどがうまく取得できないかもしれない。少なくとも自身のPC環境では取得できなかった。
2. ネットを検索するとDOMのオブジェクトを取得し操作するには、getElementByID などのメソッドを直接呼び出せばよいと記載されている。
それには Microsoft.mshtml のアンセンブリ(DLL)が必用になる。
(Microsoft Office 2010などがインストールされている環境では普通にインストールされている)
これを回避するために以下のような InvokeMethod を使用する。
$txtuser = $doc.getElementByID("form_USERNAME") ↓ $txtuser = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "form_USERNAME" ))
3. IEがページ遷移中などでオブジェクトが取得できないことがある。
これはPC環境によっても差異があるようで随所で待ち合わせ処理を入れている。
(1秒必ず待ち合わせているが必ずしも必要ではないかも)
Start-Sleep -milliseconds 1000 While($ie.busy){Start-Sleep -milliseconds 500}
4. iframeでページ内に埋め込まれたdocumentオブジェクトの取得は、何故か1回目は失敗し、2回目で成功するため、$iframe_docがnullの場合は何回かリトライする処理を実装している。
$iframe = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "content_main" )) $iframe_doc = $iframe.contentWindow.document $counter = 1 $counter_max = 3 # 取得できるまでリトライする while ($iframe_doc -eq $null){ if($counter -gt $counter_max){ throw "ERROR: リトライ回数の上限を超えました。(上限値: $counter_max)" } $counter = $counter + 1 Start-Sleep -Milliseconds 1000 $iframe = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "content_main" )) $iframe_doc = $iframe.contentWindow.document }
以下にスクリプト全文を記載する。(先頭の変数定義は、環境に合わせて修正が必要。)
ESXiをスクリプトインストールする方法
1. インストール用の設定ファイル(ks.cfg)を用意する。
デフォルトのks.cfgファイルは、ESXiサーバの /etc/vmware/weasel/ks.cfg にある。
2. ks.cfg の起動時の読み込ませ方を検討する。
http, ftp, nfsなどが指定できる。USBデバイスも指定可能。
(ここではhttpを例に手順を記載する。)
3. 新規の仮想マシン作成し、CD-ROMから起動する。
インストールのブート画面(Loding ESXi Installer画面)が始まったら、すぐに “Shift+O” を入力する。
4. 起動オプションに以下を指定し、起動する。
ks=http://x.x.x.x/ks.cfg ksdevice=vmnic0 ip=x.x.x.x netmask=255.255.255.0
vmkernel などに設定されるIPアドレスとは別となる。
※入力が英語キーボードになるため注意。
= の入力は ^
: の入力は Shift + ;
仮想マシンコンソールでコピー&ペーストを有効化する方法
※vmware toolsがインストールされていることが前提
参考: ttp://kb.vmware.com/kb/1026437
1. 仮想マシンを右クリックし「設定の編集」画面を開く。
2. [オプション]タブの[詳細]-[全般]の[構成パラメータ]をクリックする。
以下2つのパラメータを追加する
名前: isolation.tools.copy.disable 値: false 名前: isolation.tools.paste.disable 値: false
【参考】
上記は仮想マシン単位だが、デフォルトで、そのESXi上で動いている全ての仮想マシンコンソールでクリップボード共有が可能にする場合は、ESXiホストのコンソールにログインし、/etc/vmware/config に以下を追加する。
isolation.tools.copy.disable="FALSE" isolation.tools.paste.disable="FALSE"
VMware関連メモ
vSphere Clientで自動ログイン
VpxClient.exe --server <ip address> --user <username> --password <password> --ignorecert
vSphere ClientのコンソールでVNCを使用する
.vmxファイルに以下を記述する。
RemoteDisplay.vnc.enabled = "True" RemoteDisplay.vnc.port = "5901" RemoteDisplay.vnc.password = "password"
仮想マシンでESXiを構成する(仮想マシン上でハードウェア仮想化を有効にする)
前提条件
・ESXi5.1以降
・仮想マシンのバージョンは9以上
・仮想マシンの構成
OS は”その他64ビット”
最低2コア CPU
最低4GB メモリ
最低8GB HDD
vmxファイルに記載するパラメータ
virtualHW.version = "9" featMask.vm.hv.capable = "Min:1" vhv.enable = "TRUE"
※ vSphere Web Clientを使うとGUIで設定が可能。
仮想マシンでvlanタグを使用する
仮想マシンが接続する仮想マシンネットワークのVLAN IDを 4095 に設定する。
(仮想スイッチではvlanタグを処理しなくなり、仮想マシン側で処理するようになる。)
ESXi5.x用r8168-8.037ドライバの作成(その2)
カーネルモジュールの確認
作成したモジュールを ESXi の /tmp コピーする。
ESXiのコンソールで以下のコマンドを実行。
読み込まれているドライバを削除する。
~ # vmkload_mod -u r8168 ~ # vmkload_mod /tmp/r8168
解決できないシンボルがあると出てロードに失敗する。
海外のサイトを手掛かりに解決する。
ttp://www.vm-help.com/forum/viewtopic.php?f=34&t=4365
~ # grep "r8168\|Unresolve" /scrach/log/vmkernel.log 2013-12-28T09:53:21.780Z cpu0:1097236)Loading module r8168 ... 2013-12-28T09:53:21.781Z cpu0:1097236)Elf: 1861: module r8168 has license GPL 2013-12-28T09:53:21.788Z cpu0:1097236)WARNING: Elf: 1508: Relocation of symbol <skb_checksum_help> failed: Unresolved symbol 2013-12-28T09:53:21.788Z cpu0:1097236)WARNING: Elf: 1508: Relocation of symbol <rtltool_ioctl> failed: Unresolved symbol 2013-12-28T09:53:21.788Z cpu0:1097236)WARNING: Elf: 2822: Kernel based module load of r8168 failed: Unresolved symbol <ElfRelocateFile failed>
ダメなシンボルは skb_checksum_help および rtltool_ioctl となっている。
ESXi5.x用r8168-8.037ドライバの作成
海外のサイトを参考にドライバを作成する。
ttp://www.vm-help.com/forum/viewtopic.php?f=28&t=4347
ttp://www.vm-help.com/forum/viewtopic.php?f=34&t=4350
network系ドライバの格納場所を確認する。
$ cd ~/vsphere/vmkdrivers-gpl $ ls -l vmkdrivers/src_9/drivers/net/
ディレクトリを作成しダウンロードしたドライバを展開する。
Realtekの RTL8111E 用ドライバ(r8168)を作成する。
あらかじめドライバファイル(r8168-8.037.00.tar.bz2)をダウンロードし/tmpに配置する。
すでにr8168ディレクトリがあるのでリネームする。
$ cd vmkdrivers/src_9/drivers/net/ $ mv r8168 r8168_orig $ mkdir r8168
ソースファイルを展開する。
$ cd r8168 $ bunzip2 /tmp/r8168-8.037.00.tar.bz $ tar xf /tmp/r8168-8.037.00.tar --strip-component=2 --wildcards --no-anchored 'src/*.c' 'src/*.h' $ ls -l 合計 764 -rwxrwxr-x. 1 build build 42232 8月 30 16:53 2013 r8168.h -rwxrwxr-x. 1 build build 15107 5月 27 21:24 2013 r8168_asf.c -rwxrwxr-x. 1 build build 8208 5月 27 21:24 2013 r8168_asf.h -rwxrwxr-x. 1 build build 671817 8月 30 16:53 2013 r8168_n.c -rwxrwxr-x. 1 build build 7122 5月 27 21:24 2013 rtl_eeprom.c -rwxrwxr-x. 1 build build 2196 5月 27 21:24 2013 rtl_eeprom.h -rwxrwxr-x. 1 build build 11104 4月 15 20:39 2013 rtltool.c -rwxrwxr-x. 1 build build 882 4月 15 20:39 2013 rtltool.h
ドライバを全コンパイルする。
$ cd ~/vsphere/vmkdrivers-gpl/ $ ./build-vmkdrivers.sh
ESXiカスタムドライバビルド環境作成
海外のコミュニティサイトを参考にビルド環境を作成する。
ttp://www.vm-help.com/forum/viewtopic.php?f=34&t=4340
CentOS 6.x (x86_64)環境に作成する。
コンパイル用ユーザの作成
# useradd build # passwd build
必要なパッケージのインストール
# su - # yum install ncurses-dev # yum install flex # yum install bison # exit $
特定バージョンのtexinfoをインストール
(toolchainが最新だとうまく動作しないため?)
$ mkdir /home/build/texinfo $ cd /home/build/texinfo $ wget http://ftp.gnu.org/gnu/texinfo/texinfo-4.9.tar.gz $ tar zxvf texinfo-4.9.tar.gz $ cd texinfo-4.9 $ ./configure && make $ su # make install
ディレクトリの作成
$ mkdir /home/build/vsphere $ mkdir /home/build/toolchain $ su # reboot
ブログ開設
テスト投稿
最近のコメント