読者です 読者をやめる 読者になる 読者になる

cannot obtain data from proxy "プロキシ名": ZBX_TCP_READ() failed: [104] Connection reset by peer

Zabbix Proxyサーバを通した監視を行っている状態で
Zabbix Serverを別のハード機器に移行した(IPは移行前と同じ)

Zabbix Serverでプロキシを認識できず、データ取得ができなくった。

Zabbix Serverのログ

cannot obtain data from proxy "プロキシ名": ZBX_TCP_READ() failed: [104] Connection reset by peer

解決

zabbix-proxyのサービス再起動では解決せず・・
Zabbix ProxyサーバのOSを再起動したら解決。


シェルスクリプトでYAMAHAルータ RTX系のNAT変換セッショ数を取得

概要

YAMAHAルータ RTX系のNAT変換セッショ値を
Linuxサーバからcronでシェルスクリプト回して5分ごとの値を取得する。

シェルスクリプトの内容

・expectコマンド(対話型)を使ってルータにアクセスし、必要情報を取得
・取得したテキストを加工して、セッション値、日付等を取り出し。

準備

・expectコマンドのインストール
 yum install expect

・ルータ内のコマンド
 NATの動作状態確認
 show nat descriptor address all
 
 ルータ環境確認
 show enviroment

サンプル

※cronで回すので、シェルは絶対パスで書く。

ルータにアクセスして必要情報を取得するシェル(rtxnat.sh)

参考:
expectコマンドの使い方 – No:158 – Linuxで自宅サーバ構築(新森からの雑記)

#!/bin/sh

#----config
RTXIP=ルータIP
PASS=ルータパスワード

#----command
EXPECT=/usr/bin/expect


#----EXEC
${EXPECT} -c"
spawn telnet ${RTXIP}
expect \"Password:\"
send \"${PASS}\r\"
expect \">\"
send \"show nat descriptor address all\r\"
expect \">\"
send \"show environment\r\"
expect \">\"
send \"exit\r\"
close
"
テキスト加工し、セッション値、日付等を取得するシェル(rtxnat_edit.sh)

参考:
sed コマンド | コマンドの使い方(Linux) | hydroculのメモ
正規表現は出力されるデータに併せて変更してください。
 汎用的に記載できず、力不足です。

#!/bin/sh

#----config
RTXSHE=/home/user/rtxnat.sh
RTXTXT=/home/user/rtxnat_data.txt
NEWTXT=/home/user/rtxnat_session.txt

#----command
SEDEXE=/bin/sed

#----EXEC
${RTXSHE} > ${RTXTXT}

${SEDEXE} -n -e 's/.*\(2016[0-9\/]\{6\}\)\s\([0-9:]\{8\}\).*/\1\t\2/gp' ${RTXTXT} |tr '\n' '\t'  >> ${NEWTXT}
${SEDEXE} -n -e 's/^.*44096-49151 *\([0-9]*\).*/\1/gp' ${RTXTXT} >> ${NEWTXT}
cronでまわす

5分おきにプログラムの実行

*/5 * * * * /home/user/rtxnat_session.sh > /dev/null 2>&1

参考:
crontabの書き方 | server-memo.net
※クローンの標準・標準エラーを出力する(デバック)
 シェル > output.txt 2> output.txt
 標準出力:output.txt、標準エラー出力:output.txt
※ リダイレクト、ファイル・ディスクリプタについて
[Bash]標準出力・標準エラー出力の全て(1>&2とか)まとめ | Coffee Breakにプログラミング備忘録

出力結果(例:rtxnat_session.txt)
2016/01/25	07:44:55	583
2016/01/25	07:49:54	579
2016/01/25	07:54:55	579
・・・

今後

・シェル2つにわけっちゃったけど、1つにまとめてもいいかな。
・グラフにするのはテキストからExcellでグラフ作成してますが・・。
・Zabbixのグラフに反映させたいな・・。ZabbixのDBとかいじるのかな・・。

phpフォームからスプレッドシートに書込み

Google Apps Script(以下、GAS)を使ってPOSTでデータを受取る

概要

WEBフォームからデータを送信し、スプレッドシートに登録する

  1. フォームからPOSTでGASにデータを送る
  2. GASからスプレッドシートにデータ書込み・メール配信
  3. フォームは送信と同時にiFrameを使って完了画面を表示する


スプレッドシートとGASの作成

スプレッドシートの作成

スプレッドシートを作成したら
一行目に「timestamp」と「<input>のname属性」を記入する。
f:id:meikotan:20160128112141j:plain

GASの作成

スクリプト エディタ画面を開く
「ツール」→「スクリプト エディタ」を選択
f:id:meikotan:20160112220433j:plain

Main Script(コード.gs)
function doPost(e) {
 // スプレッドシート読込
 var ss = SpreadsheetApp.openById(ScriptProperties.getProperty('active'));
 var sheet = ss.getSheetByName("【要変更】シート名");
 var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; //headder取得
 var last_row = sheet.getLastRow(); //最終行を取得
  
 // スプレッドシートにフォームのデータを挿入
 for(var key in e.parameter){
  for(var i = 0; i < headers.length; i++){
   // 「timestamp」列に時刻を挿入
   if(headers[i] === 'timestamp'){
    sheet.getRange(last_row + 1, i + 1).setValue(new Date())
    break
   }
   if(headers[i] === key){
    // ヘッダーとkeyが一致した時、その列の最終行にデータを挿入
    sheet.getRange(last_row + 1, i + 1).setValue(e.parameter[key])
    break
   } else if(headers.length === i + 1){
    // ヘッダーとkeyが一致しなかった時、そのkeyを新しいヘッダーとして追加しデータを挿入
    var new_column = sheet.getLastColumn() + 1
    sheet.getRange(1, new_column).setValue(key)
    sheet.getRange(last_row + 1, new_column).setValue(e.parameter[key])
   }
  }
 }

 // メールアドレスへ送信
 if(e.parameter.mail){
  send_mail(e.parameter.mail, headers, e.parameter)
 }
  
 //デバック用
 var app = UiApp.createApplication();
 var panel = app.createVerticalPanel();
 for( p in e.parameters){
  panel.add(app.createLabel(p +" "+e.parameters[p]));
 }
 app.add(panel);
 return app; 
}

 //セットアップ用
 function setUp() {
  var scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.setProperty('active', SpreadsheetApp.getActiveSpreadsheet().getId());
 }

 function send_mail(mail_address, headers, form_data){
  var text_mail = HtmlService.createTemplateFromFile('mail_data')
  text_mail.headers = headers
  text_mail.form_data = form_data
  
  // メール送る際のオプションを設定する
  var options = {}
  options.noReply = true
  options.from = '【要変更】メールアドレス'
  options.name = '【要変更】受信者表示名'

  try{
   // テキストメールとオプションを設定してメールを送信。
   GmailApp.sendEmail(mail_address, '【要変更】メールタイトル',text_mail.evaluate().getContent(), options)
  }catch(e){
   // エラー発生時は管理者メールアドレスにエラー内容を通知する
   MailApp.sendEmail('管理者メールアドレス', '【要変更】メールタイトル', text_mail.evaluate().getContent(), options);
  }
}


メール本文(mail_data.html)

スクリプトエディタでhtmlを新規作成する。
f:id:meikotan:20160112221219j:plain

<?= form_data.name ?> 様

登録ありがとうございます。
Sampleのメールを送信します。


ソースのセットアップ

「実行」→「setUp」を選択し、「承認」を選択
f:id:meikotan:20160128113953j:plain

GASを公開

「公開」→「ウェブ アプリケーションとして導入」を選択
f:id:meikotan:20160128114959j:plain
※公開した後の「現在のウェブ アプリケーションのURL」をメモ( ..)φメモ

フォームの作成

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
 <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta charset="UTF-8" />
  <title>テストフォームだよ</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
 </head>
 <script>
 <!--
  function validateForm(){
   if(document.getElementById("name_input").value==""){
    alert("なんか書いてくださいよ!");
    return false;
   }else{
    document.getElementById("formID").submit();
    document.getElementById("thankyou").style.display="";
    document.getElementById("thankyou").innerHTML="<center>ありがとう</center>";
    document.getElementById("thanks_none").style.display="none";
   }
  }
 -->
 </script>
 <body>
  <div style="display:none;" id="thankyou"></div>
  <iframe src="#" id="fake-target" name="fake-target" style="width:0px; height:0px; border:0px;"></iframe>
  <div id="thanks_none">
   <form id="formID" action="【要変更】現在のウェブ アプリケーションの URL" method="post" target="fake-target">
    ご氏名<input id="name_input" name="name" type="text" style="ime-mode:active"/><br />
    メール<input name="mail" type="text" style="ime-mode:inactive"/>
    <button onClick="javascript:validateForm();">送信</button>
   </form>
  </div>
 </body>
</html>

※nameに入力がないと、ポップアップのアラートがなります。

送信元メールアドレスの設定

送信元メールアドレスをスプレッドシートを作成したアカウントとは
別のメールアドレスを指定する場合はエイリアスの設定を行います。
[gmail][設定] → [アカウント] → [名前:メールアドレスの追加]
※参考
メール エイリアス アドレスの追加と削除 - G Suite 管理者 ヘルプ

スプレッドシートをDBにする利点

  • 登録されたデータを誰でも簡単に見る・消すことが出来るから
  • 登録者数がExcel上で一覧表示しても苦痛じゃない数なら便利だと思う
  • 共有も簡単
  • Excelなのですぐに集計、データ加工ができる(別でプログラムを書く必要がない)


次回挑戦したいこと

Google App Engine for PHPを使ってみたい
→GASとの違いを明確にしたいな。

ESXi 踏み台接続 PuTTyでSSHトンネル・ポート転送設定

要望

・vSpherClientからESXiに接続するのに踏み台サーバを使用する

概要

  1. PuTTySSHトンネル・ポート転送を設定
  2. クライアントPCのhostsファイルを更新
  3. vSpherClientから、hostsで設定した名前(127.0.0.1)へアクセスする
  4. 踏み台サーバへのSSHトンネルを通り、踏み台サーバから接続先ESXiへポートを転送する

ターミナルソフトとは?

絵とか入ってたので、リンクはるよ。例:PuTTyTeratermとか
http://wa3.i-3-i.info/word12678.html:plain

SSHトンネル・ポートフォワーディングとは?

わかりやすいので、リンクはるよ。
PuTTY を用いた SSH ポート転送の手順

PuTTyの場合

<例>
踏み台サーバ → 1.1.1.1
接続先ESXi → 2.2.2.2

接続先ホスト名に踏み台サーバIP「1.1.1.1」の記入

f:id:meikotan:20160114095218j:plain

左側のCategory欄:Connection → SSH → Tunnels を選択

※転送ポート
○ 443 通信用のデフォルト ポート
○ 902 VMのコンソール用

Source port:localhost:443
Destination:接続先ESXiIP:443
※902ポートも同様に設定

f:id:meikotan:20160114095214j:plain

hostsファイルの更新

127.0.0.1 esxi

vSpherClientから接続確認

IPアドレス/名前 にはhostsファイルで設定した127.0.0.1の名前を記入する。
f:id:meikotan:20160114094852j:plain


jQueryプラグイン[select2] セレクトボックスの拡張(検索)

要望

セレクトボックス上でデータを検索(絞込み)できるように

概要

jQuery プラグイン「Select2」を使用する。

プログラム

ソース

 <link rel="stylesheet" href="select2.css" type="text/css" />
 <script type="text/javascript" src="jquery-1.12.0.min.js"></script>
 <script type="text/javascript" src="select2.js"></script>
 <script type="text/javascript">
  $(document).ready(function(){
   $('.js-example-basic-single').select2();
  });
 </script>


 <select class="js-example-basic-single">
  <OPTION value="0">好きな食べ物なんですか?</OPTION>
  <OPTION value="1">りんご</OPTION>
  <OPTION value="2">バナナ</OPTION>
  <OPTION value="3">キウイ</OPTION>
 </select>

詰まった点

  • セレクトボックスが未選択の場合<option></option>の最上部データが表示される。ただ、value値を空欄にすると最上部データが表示されず空白のままになるので、value値は「0」や「スペース」を入れる。 
  • 本家サイトからダウンロードしたselect2.jsを使うと、プルダウンのスタイルがずれてしまった・・。以下、サンプルで使用されている「select2.js」を使用したら上手くいった。

Select2 | ホームページの作り方

他にも出来ること

セレクトボックス上で、複数データを選択したり、データをカテゴリごとに分けたり。

サンプル

※本家のサンプル
Examples - Select2

次回挑戦したいこと

jsonデータから、selectデータ呼び出し

無償版ESXi6.0 コンソール画面初期設定

要件

ESXiにIPアドレスでの接続を有効にする
SSH接続/SHELLを有効にする


設定変更

ログイン

f:id:meikotan:20160112180534j:plain

ESXiの管理用ネットワークのNICを設定

[Configure Management Network]→[Network Adapter]を選択
f:id:meikotan:20160112180622j:plain

IPアドレスの設定

[Configure Management Network]→[IP Configuration]を選択
※固定IPの場合:[Set Static IP address and network configuration:]を選択
f:id:meikotan:20160112181244j:plain

DNS/Hostnameの設定

[Configure Management Network]→[DNS Configuration]を選択
f:id:meikotan:20160112181313j:plain

SHELL有効化の設定

[Troubleshooting Option]→[Enable ESXi Shell]を選択
右グレー部分:[ESXi Shell is Disabled]→[ESXi Shell is Enabled]に変更される。
f:id:meikotan:20160112183038j:plain

SSH有効化の設定

[Troubleshooting Option]→[Enable SSH]を選択
右グレー部分:[SSH is Disabled]→[SSH Enabled]に変更される。
f:id:meikotan:20160112183049j:plain
※ターミナルソフトからSSHでSHELLに接続できるか確認。


無償版ESXi6.0 インストール方法

サーバ仮想化とは?

仮想化概要に加え、仮想化ソフトの違いが分かり易く整理されていたのでリンクはる。
www.infraexpert.com


要件

ハードウェア要件(ポイントのみ)

メモリ:4GB以上(本番環境では8GB以上推奨)
CPU:仮想化があるもの。(intelの場合はVT-d対応)
NICIntelが望ましい。
Realtek NICに対応させようと努力しましたが・・断念しました。)

※詳細
vmware社のドキュメント
vSphere 6.0 Documentation Center



インストール手順

インストールの開始。

f:id:meikotan:20160112111801j:plain

[Enter]キーを押して、インストーラを継続。

f:id:meikotan:20160112111803j:plain

ライセンス規約を確認し、[F11]キーで同意。

f:id:meikotan:20160112111804j:plain

ESXiをインストールするディスクを選択。

LocalのStorage Deviceを選択し、[Enter]キーを押す。
f:id:meikotan:20160112112301j:plain

[Japanese]を選択し、[Enter]キーを押す。

f:id:meikotan:20160112112326j:plain

ESXiホスト上のrootユーザのパスワードを入力し、[Enter]キーを押す。

f:id:meikotan:20160112111805j:plain

[F11]キーを押して、インストールを継続。

f:id:meikotan:20160112112024j:plain

インストールが完了したら、[Enter]キーを押す。※サーバが再起動される

f:id:meikotan:20160112112026j:plain

インストールの終了

下画面が表示されることを確認する。
f:id:meikotan:20160112112027j:plain