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

インフラSE日記

OSS、仮想化、金融工学、ゲーム、ときどきラーメン

Nutanix CEその3

ncliコマンドとacliコマンド

Nutanixには管理用のコマンドとしてncliとacliがあります。

それぞれの役割は以下のとおり。

ncli: クラスタ構成などNutanixに関する管理

acli: 仮想マシンの作成・破棄、VLAN、スナップショットなどAHVに関する管理

 

今回はacliをいじって、仮想マシンの情報を取得するコマンドを調べてたいと思います。

 

acli

acliにはわかりやすい名前空間が設定されており、目的に応じたコマンドを使います。

全部のコマンドは紹介せず、よく使いそうなコマンドだけ列挙します。

 

■core 

 AHV自体の設定を行うコマンドです。

 ・設定情報取得

  core.get

 ・設定

  JSONファイルを出力するか、DNSを使うかどうかなど設定可能です。

  core.set

 

■host

 ホストに関するコマンドです。

 ・設定情報取得

  CVMおよびホストのメモリサイズ、CPU数などが取得できます。

  host.get <ホストのIPアドレス>

  ・一覧

  host.list

 ・指定したホスト上で実行されているVM一覧

  host.list_vms <ホスト名またはIPアドレス>

■net 

 VLANに関する設定を行うコマンドです。

 ・作成

  net.create <VLAN名> vlan=<VLAN ID>  

  ・削除

  net.delete <VLAN名>

 ・一覧

  net.list

 ・詳細

  指定したVLANの情報を出力します

  net.get <VLAN名>

 ・指定したVLANが設定されているVM一覧

  net.list_vms 

 

■image

 Image Configurationに関する設定を行うコマンドです。

 ・情報取得

  指定したイメージの情報を出力します

  image.get <イメージ名>

 ・一覧

  イメージの一覧を出力します

  image.list

 

vm

 仮想マシンに関する設定を行うコマンドです

 ・作成

  VMを新規作成します。VM名以外を省略したときは

  memory=2G, num_cores_per_vcpu=1, num_vcpus=1

  で設定されます。

  vm.create <VM名> [memory=<メモリサイズ> \

  num_cores_per_vcpu=<vCPUあたりのコア数> num_vcpus=<vCPU数>

   

  ところで、vCPU当たりのコア数って逆じゃないかなぁと思ったりしてます。

  コアあたりのvCPU数なんじゃ……?

 

 ・一覧

  vm.list

 

 ・設定情報

  vm.get

 

 ・電源ON/OFF

  vm.on <仮想マシン名>/vm.off <仮想マシン名>

 

 ・VMに紐付いているNICの情報

  vm.nic_get

 

  見た感じ、各VMの実行状態(running, stop, suspendなど)の一覧を出力する

  コマンドはないみたいです。ちょっと不便。

 

とりあえずこれくらいですかね。本当はコマンドを使って仮想マシンを作成してOSインストールまでやりたかったんですが、思ったよりリソースが足りなくてNutanix上で仮想マシンを立ち上げることができなさそうです。CVMが結構メモリをもりもり食ってるので、CVMのメモリ割り当てとか変更する方法を調べないといけないです。

 

Future Work

  1. acliコマンドのみで仮想マシン・VLAN・イメージを作成する
  2. Prism以外のコンポーネントの働きを理解する

 

そんな感じです。

 

Ansible始めました①

Ansibleとは

Ansibleは構成管理ツールの1つです。Infrastructure as a Codeという言葉があるように、コードによってサーバ構成を制御・管理しようという発想です。イマドキのインフラ系SEはコーディングくらいできないといけない、ということですね。

 

Ansibleを使うと以下のことが出来ます。

  1. サーバ構成(状態)をコードによって管理できる
  2. アプリケーションをインストールして設定し使用できるようにする(デプロイ)

 

Ansibleというツール1つで全てのサーバ構成を管理し、アプリケーションをデプロイすることができるのです。すごい!

 

話はそれますが……

SEはよくパラメータシートという不思議なドキュメントを書きます。

サーバに設定するべきパラメータ名と値の組を書いたドキュメントです。

一旦このパラメータシートを作成し、パラメータシートに書かれている通りに手動で設定し、パラメータシートに書かれている値通りに設定されているか手動でテストします。個人的にこの作業、すごい無駄だと思っています。手動で設定するとミスは増えるし(人間は必ずミスする生き物)、テストもエビデンスを取得するとはいえ人間が行う以上やはりミスはつきものです。

そしてパラメータシートはエクセルで作成されることが多いのですが、データとデザインが一体化していて非常にめんどくさいです。HTMLとCSSが分離した理由も個々にあると思ってますが、データとデザイン(レイアウト)は本質的に全く別のものです。

 

何が言いたいかというとAnsibleを使うと煩雑なドキュメント作成から開放されて、コードで一貫したサーバ構成・管理ができるのです。gitを使えばバージョン管理もできますからね。

インフラ系SEも積極的にAnsibleを使って行くべきだし、使えないとこれから淘汰されていく時代なのかもしれません。

 

実行環境

実行環境は以下のとおり。

 

OS: Ubuntu 14.04 64bit(仮想マシンESXiサーバ上の仮想化マシン)

CPU: 2 vCPU

メモリ:4GB

ホスト名: ansible.localdomain

 

Ansibleのインストール

Ubuntu 14.04にAnsibleをインストールする手順を示します。

他のバージョンのUbuntuや、違うディストリビューションだと手順が異なることもありますので、ご注意ください。

  1. Pythonパッケージのインストール
    sudo apt-get install python-software-properties
  2. レポジトリの追加
    sudo add-apt-repository ppa:ansible/ansible
    ユーザ名: ansible
    PPA名: ansible
  3. 登録されているサーバからパッケージリストを取得する
    sudo apt-get update
  4. Ansibleインストール
    sudo apt-get install ansible
  5. Ansibleバージョン確認
    ansible --version

 

 以下のようになれば成功。

 

f:id:chemicallogical:20160619132503j:plain

 

 次回からはもう少し本格的にAnsibleを使っていこうと思います。

 

 

 

そんな感じです。

 

 

git

git

恥ずかしながら今までgitをめんどくさがって覚えてこなかったのですが、Ansibleとか勉強しようと思ったら避けて通れないと思ったので覚えようと思いました。

もうgitの説明は特に書きません。

使い方とか基本的な考え方を自分の備忘のために書きます^^

 

それとやっぱり実際に知識だけでわかった気になるのではなく、アウトプット(ブログに書くとか使わ)しないと本当に理解したかわからないですよね。

もう一個、どれだけの方が自分のアホみたいな技術(?)ブログ見てるかわからないですが、公開することによって間違ってるところを指摘してくれる機会が増えることもいいかなと思います。

 

前置きが長くなりました。

 

gitの基本的な用語

gitで重要な単語は以下の3つ。

  1. 作業ディレクトリ(ワークツリー)
    現在作業しているディレクトリのこと。このディレクトリに存在するファイルとかを一生懸命修正したりする。
  2. ステージングエリア(インデックス)
    まだコミットされていないけど、コミットされる予定のファイル群。gitはコミットする前に必ずステージングエリアに上げる必要がある。(バッファ的な使い方をしている?)
  3. リポジトリ
    過去のコミットの履歴をすべてに渡って保存しているもの。

 

gitの簡単な使い方

・初期化する

  git init 

 

・ステージングする

  git add <ファイル名>

 <ファイル名>はワイルドカードも使える。

 "."を指定するとすべてのファイルをステージングする

 

・コミットする

  git commit または git commit -m <コミット時のコメント>

・作業ディレクトリ内の差分を取る

  git diff

 

・作業ディレクトリとステージングエリアとの差分

  git diff --cached

 

ロールバック

  git reset --hard <ロールバックするコミットID、またはHEADなどで指定>

 

・ブランチ一覧

  git branch

 

・ブランチ作成/削除

  git branch <ブランチ名>

  git branch -d <ブランチ名>

 

これだけ覚えていればgitの基本は押さえられたと思います。

後はさらに知識を吸収しつつ、何も考えずに猿のようにコマンドを叩けるようにならないといけないかな。

ファイルの状態、コンフリクトの解消方法、リモートリポジトリなどまだまだ覚えることはあります。

 

 

そんな感じです。

 

Nutanix CEその2

Nutanixが対応しているハイパーバイ

Nutanixは以下のハイパーバイザに対応しています。

 

本番環境だとやはり実績が多いESXが多いと思います。VMware強し。

CitrixのXenServerは現在対応していませんが、今後対応するかもみたいな記事をどこかで見ました(曖昧ですみません><)。

AWSだってXenベースなんだし、Citrixにはもうちょっと頑張ってほしいなと思います。

 

閑話休題

Nutanix CEはAcropolis Hypervisor(以下AHVと表記する)しか対応していません。

なので、コマンドもKVMが使えます(はず)。

 

Acropolis Hypervisor

KVMベースのNutanix独自のカスタマイズハイパーバイザ。AHVについては勉強不足が否めないので、Nutanixの公式ドキュメントを参照して勉強します。

 

AHVでの仮想マシンの作成手順

大雑把な流れは次の通り。

  1. 「Image configuration」からisoイメージをコンテナに配置
  2. 「Network Config」から仮想マシンに接続させるVLANタグを設定
  3. 「Create VM」から仮想マシンを作成
  4. 「Power On」で仮想マシンを起動

 

1については事前に設定しちゃったので、以降2から画像を使って説明します。

①Home画面を表示

 

f:id:chemicallogical:20160613230519j:plain

 Home画面です。間違っても「Nothing to Do?」をクリックしてはいけません。

 

②Network設定の追加

 事前にNetwork設定を済ませていればこの手順は不要です。今回は初めてなので、作成します。

 Network設定と言ってもESXみたいに仮想スイッチなどの複雑な設定ではなく、ただのVLANの設定です。

「Network Config」をクリックして、設定画面を開きます。

 

f:id:chemicallogical:20160613231135j:plain

VLANタグ名はvlan.41、VLAN IDは41です。

「ENABLE IP ADDRESS MANAGEMENT」をクリックするとネットワークアドレスとデフォルトゲートウェイIPアドレスが入力できるようになります。

今回はネットワークアドレス:192.168.41.0/24、デフォルトゲートウェイIPアドレス:192.168.41.2を入力します。ドメイン設定は使用しないため「CONFIGURE DOMAIN SETTINGS」はチェックしません。

VM作成

「+Create VM」からVMを作成します。

f:id:chemicallogical:20160613231412j:plain

VM名:test、vCPU:1、コア数/vCPU:1、メモリ:2GBというしょぼい仮想マシンを作ります。

その後、「Add Disk」をクリックします。(スクリーンショット忘れた^^)

そうすると、以下のウィンドウが表示されます。

今回はImage Configurationでコンテナに配置したisoファイルからブートしますので、

TYPE:DISK、OPERATION:CLONE FROM IMAGE SERVICEを選択します。

IMAGEにはImage Configurationで設定したイメージ名を選択します。今回は「test_image」。SIZEは適当。

ちなみにtest_imageはUbuntu 14.04です。

 

f:id:chemicallogical:20160613231759j:plain

 

f:id:chemicallogical:20160613231921j:plain

 起動用のディスクのために、もう一個ディスクを追加します。

その後「Save」をクリック。

④結果確認

 TableにVMが表示されるので、確認します。

f:id:chemicallogical:20160613232143j:plain

 Power Onして、コンソールにUbuntuのインストール画面が表示されています。これでVMの作成手順は終わります。

 

Ubuntuインストール

結論から言うと、Ubuntuのインストールに失敗しました。今のところ原因不明なので調査します。ブートローダをインストールできなかった旨のメッセージが表示されていたので、ストレージが壊れてるか、容量が足りないかかな…。

 

Future Work

  1. Ubuntuをインストール完了する
  2. acliコマンドを使ってVMを管理する

 

そんな感じです。

 

 

 

 

 

 

 

 

 

 

 

 

 

nginxソースコードリーディング ver0.1

nginx起動

main()関数から読んでいきます。

エラーハンドリングのif文は重要なもの以外は省きます。

コメントは僕が書いたもので、実際のソースコードには書かれていません。

また、書きやすいように一部コードを変更することもありますが、

処理内容が変わらないように注意しています。

 

core/nginx.c

int ngx_cdecl

main(int argc, char *const *argv)

{

 変数宣言

 ︙

 ngx_strerror_init();

 ngx_get_options(argc, argv);

 if (ngx_show_version) {

  ngx_show_version_info();

 }

 ngx_time_init();

 ngx_pid = ngx_getpid();

 

}

 

とりあえずここまで。

最初は初期化処理が多いですね。

 

core/ngx_errono.c

エラーに関する初期化処理。

ngx_int_t

ngx_sterror_init(void)

{

 len = NGX_SYS_NERR * sizeof(ngx_str_t);

 ngx_sys_errlist = malloc(len);

 // エラー番号0からNGX_SYS_NERR-1までの文字列をngx_sys_errlistに格納

 for (err = 0; err < NGX_SYS_NERR; err++) {

  ︙

  msg = strerror(err);

  len =  ngx_strlen(msg);  //実際はただのstrlen(mgs)

  p = malloc(len);

  ngx_memcpy(p, msg, len); //実際はただのmemcpy(p, msg, len)

  ngx_sys_errlist[err].len = len;

  ngx_sys_errlist[err].data = p;

 } 

}

エラーメッセージのリストを作ってエラー番号0からエラー番号NGX_SYS_NERR-1に対応するエラーメッセージを格納しているだけですね。

簡単な処理ならわざわざソースコード書かなくてもいいかな…?

 

core/nginx.c

 

引数の処理。

static ngx_int_t

ngx_get_options(int argc, char *const *argv);

オプション(引数)の処理をしているだけなので省きます。

nginxってロングオプション(--versionみたいなやつ)に対応してないんですね。

 

core/ngx_times.c

 

時間に関する初期化処理です。

void

ngx_time_init(void)

{

 文字列の長さを格納

 ︙

 ngx_cached_time = &cached_time[0];

 ngx_time_update();
}

 

void

ngx_time_update(void)

{

 ① ngx_trylock(&ngx_time_lock);

 ② ngx_gettimeofday(&tv);

 ③ 各ログの時間をログの時間を表す構造体のデータに格納

}

 

① 時間処理を行うため、最初にロックをとっています。

② 現在の時刻を取得

 

って感じですかね。

最初は簡単ですね、これから難しくなる感じでしょうか。

 

 

そんな感じです。

nginxソースコードリーディング ver0.0

nginxとは

C言語で記述されたHTTPサーバです。

nginxの特徴は以下の点。

・処理性能の高さ

・高い並列処理能力

・メモリ使用量の少なさ

・リバースプロキシ機能

・ロードバランサ機能

・HTTPキャッシュ

 

他に有名なHTTPサーバといえばご存知Apache HTTP ServerやMicrosoft IISなどがありますね。

nginxのソースコードを読んでいきたいと思います。

nginxのソースコードリーディングについて書いていた記事がQiitaにあったのですが、

現在更新されていないようです。なら僕が勉強も兼ねて(?)やってみようと思った次第です。そんなソースコードを読む能力なんてないですけどね。まぁ、のび太くんの「上手くなってから練習する」だといつまで経っても伸びないと思うので、アレな感じでもやってみるところから始めていきます。

nginxの設計思想

Igor SysoevがC10問題を解決しようとHTTPサーバを開発したことがきっかけだそうです。Apache HTTPサーバが1つのリクエストに対してプロセスまたはスレッドで処理するのに対して、nginxは非同期のイベント駆動で処理をしています。

 

かっこよく書いたのはいいけど、正直非同期のイベント駆動をよく理解していません。

完全に勉強不足です。

 

nginxのバージョン

ソースコードのバージョンは1.10.0を使います。この記事を書いている時点では最新です。

 

nginxソースコードディレクトリ構成

  • core
    エントリポイント、ハッシュ、配列、バッファ、ログ処理、文字列処理など
  • event
    イベントの処理
  • http
    HTTPリクエスト処理、
  • mail
    メール機能
  • misc
    よくわかりません^^;
  • os
    OSごとのモジュール。現在はunixというディレクトリのみ存在。
  • stream

    ストリーム処理。これもよくわかってry

 

nginxのソースコードリーディングの方針

エントリポイントから読んでいくのか、各ソースコードについて読んでいくのかどっちがいいのだろう……。

とりあえずエントリポイントから読んでいこうと思います。

 

 

 

Vagrantを使ってみた感想

Vagrant

Vagrantは仮想環境構築ソフトウェア。

Rubyで書かれています。

 

Vagrantで実現したいこと

 個人的にVagrantでやりたいことは以下の3点だと思ってます。

  1. 仮想の開発環境・検証環境をすぐに構築・破棄したい
  2. Virtual Box、VMware Workstation、Amazon EC2などの様々な
    仮想化ソフトウェアを統一したコマンドで管理したい
  3. 環境構築を自動化したい

 

 順番に見ていきましょう。

1はVagrantに限らず他のツールでも同じだと思います。

必要になったときにパッと仮想マシンを作成し、起動できる。

不要になったときに破棄できる。

僕は主にホストのUbuntu仮想マシンを汚したくないけどテストしたいというときに

使っています。

 

2についてですが、僕はVagrantのバックエンドの仮想化ソフトウェア(Vagrantではプロバイダーと呼ばれます)はVirtual Box以外使ったことがないため、他の仮想化ソフトウェアについてはわかりません。それぞれの仮想化ソフトウェアは仮想マシンの作成・破棄の手順、設定方法などが異なるので、他の仮想化ソフトウェアを使うとなったらいちいち覚え直さないといけません。VagrantならVagrantのコマンドを覚えるだけで統一したコマンドで仮想マシンが管理できます。

 

最後の3は自動構成ツール、いわゆるプロビジョニングツールと組み合わせて使うことです。昔はChefが流行ってたイメージでしたが、今はAnsibleの方が流行っているような気がします。

 

Vagrantを使った仮想マシンの作成手順

自分が忘れそうなので書いてみます。

Vagrant仮想マシンを作成するときの手順は大雑把に次の通り。

  1. Boxの入手

    BoxとはAWSでいうところのAMIに相当します。
    Vagrantbox.esVagrant Cloudで入手します。昔はvagrantbox.esからダウンロードすることが多かったのですが、今はvagrant cloudからダウンロードするのが流行りみたいですね。結構ダウンロードするのに時間がかかります。

    コマンドは以下の通り。
    vagrant box add <BoxのURL> -name <Box名>
  2. ディレクトリの作成
    1で指定したBox名と同じディレクトリ名のディレクトリを作成します。
  3. Vagrantの初期化
    2で作成したディレクトリにて以下のコマンドでVagrantを初期化します。
    vagrant init

    そのディレクトリにVagrantfileと呼ばれるVagrantの設定ファイルが作成されます。Vagrantのバージョンによって若干差異があったりします。
  4. 仮想マシンの起動
    以下のコマンドで仮想マシンを起動します。
    vagrant up

    ちなみに、vagrant statusでその仮想マシンが起動しているか、サスペンドしているか、停止しているかなどがわかります。
  5. 仮想マシンにログイン
    以下のコマンドで仮想マシンにログインします。
    vagrant ssh

    もちろん、TeraTermなどを使ってsshログインしてもいいと思いますが、
    sshの設定が少しめんどうなのでこのコマンドでいいと思います。

 

Vagrantを使ってみた感想

やはり、開発・検証環境をすぐに構築したい!という人向けだと思います。

本番環境を構築するときにわざわざvagrantを使うメリットが見いだせませんでした。

仮想マシンの構築は本当にすぐなので、ちょっと試してみたいという分には便利かもしれません。

 

今後について

まだまだ使い込みが甘いので、Vagrantをどんどん使って行って様々な機能を使ってみたいです。その過程で新しいVagrantのメリットや面白さがわかってくるのかもしれません。

恥ずかしながらAnsibleもChefも使ったことがないのでvagrantと組み合わせて自動的に構築してみたいです。

 

 

 

そんな感じです。