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

インフラSE日記

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

SIerという業界について

最近全く日記を書いていないことに気づきましたので、久々に日記を書こうと思います。

 

技術系の記事じゃなく、今回の記事は「SIer」という日本独自の発達した謎の業界について思ったことを正直に書こうと思います。

他の方も同じような内容を書いていらっしゃいますが、それでも僕は自分が思ったこととして書こうと思います。

もちろん、全てのSIerに当てはまることはないと思います。

SIerに勤めているSEの中には真のエンジニアの方もいらっしゃると思います。

 

思ったことは4つ。

1. システムエンジニアはエンジニアではない

2. 保守・運用はできるだけ自動化すべき

3. 工数という奴隷制

4. Office3種の神器(ExcelPowerPoint、Word)の害悪さ

 

一つずつ書いていきます。

 

1. システムエンジニアはエンジニアではない

 僕は、ITの分野では「技術」は以下の二種類あると思っています。

 ①既存のものを組み合わせる

 ②新しいものを生み出す

SIerは①が得意です。多くのベンダが提供している製品の「仕様」を知っているので、それらを組み合わせて顧客の望むシステムを構築します。

あくまで知っているのは「仕様」だけです。「実装」なんて多分知りませんし、知ろうともしていなんじゃないかと思います。

プロプライエタリなソフトウェアは逆アセンブルでもしないと仕様を知ることはできませんが。。

他人の褌で相撲を取っている状態ですね。

製品の仕様についてわからないことは「問い合わせ」という魔法の言葉を使ってベンダに丸投げです。

確かに、「システム」という新しいものを生み出しているという点では②も当てはまるのかもしれませんが、社内や顧客の中だけで使われるシステムにすぎず、一般のベンダやエンジニアが使う製品やシステムは生み出していないわけです。

(これは多分自分がB2BというよりB2B2Cを強く意識しているからかもしれません)

プログラミングできるSEなんてほとんどいません。

 

「ビジネスなのだから、ただプログラミングができるだけではダメで、プログラミングすることによってビジネス(ひいては利益)につながることをすべきである。だからSEはプログラミングができるできないの議論はズレている」という意見ももちろんあります。私も一部ではその通りだと思います。企業は慈善事業じゃないですから、株主のために利益を出す必要があります。ビジネスモデルの中での話ではなく、あくまでエンジニアとしての話をすると、プログラミングできないSEなんて価値がないです。

プログラミングして製品を生み出して利益を出すという話ではありません。プログラミングができないとOS、仮想化、ネットワークなどの技術を真に理解できないからだと思っているからです。これではエンジニアなどと到底呼べません。

 

ついで言うとSIerは「実績」にやたらこだわります。「実績」というのはつまり「過去にやったことがあるかどうか」です。「実績」がないものはやたら使いたがりません。

理由は単純で「わからない」からです。いつになったら新しいものを使うんでしょうか。ずっと同じものを使い続けるんでしょうか。

 

結論:システムエンジニアはエンジニアではない。(プログラミングを学ぶべき)

 

2. 保守・運用はできるだけ自動化すべき

構築・開発したら終わりというシステムはこの世に存在しません。必ずシステムを利用するユーザーがいます。そしてシステムが正常に動いているかを確認したり、ユーザーからの追加の要望やシステムの設定変更などをする必要があります。

保守・運用は人間が作業する箇所を徹底的に減らし、自動化した方が絶対いいです。

ミスも減りますし、人件費も減ります。もちろん、全てを自動化できるわけではありませんので、必ずどこかで人間が介入しなければなりません。設定変更する必要があるかどうかなどの「判断」を人間がして、設定変更などはスクリプトなどで自動で設定できるようにすればいいのです。

 

結論:保守・運用はできるだけ自動化する

 

3. 工数という奴隷制

SIerの多くは「工数」「人月」という単位で予算を作成します。

他の方も同じ表現をされていましたが、現代に蘇った奴隷制度です。

一人一ヶ月働いたら◯円で計算します。ここに効率化なんて概念はありません。

構築・開発に10ヶ月かかるシステムを新たな技術を取り入れることによって5ヶ月にすることに成功したSEは給料が半分になるのでしょうか?

さらに言えば、人月や工数が妥当かどうかどうやって判断しているのでしょうか?

効率化すればするほど利益が減る、そんな素敵なシステムなのです。

 

結論:SIer奴隷制度を容認している

 

4. Office3種の神器(ExcelPowerPoint、Word)の害悪さ

仕様書などのドキュメントはMicrosoftが提供しているOfficeで作成することが多いです。というか、SEの大半の仕事はExcelとWordとにらめっこすることです。

本来記述している内容が最も大切なはずなのに、体裁やフォーマットなどにこだわって無駄な時間をかけていると感じました。

HTMLとCSSの分離と同じで「書く内容」と「文字などの装飾」は分離する必要があると思います。(極端なことを言うとドキュメントなんてテキストエディタでもよいかもしれない)

 

更に言うとExcelをデータベース代わりに使っていることが多いです。

エンジニアとしてあるまじき行為だと思います。

もしExcelのファイルが壊れたら? 誰かが悪意を持って改ざんしたら? いつ誰が、何から何に更新したか管理できるか? バージョン管理はできるのか?(デグレが起きたらどう対応するのか?) などなど。

 

Excelデータベースは止めて、MySQLOracleなどのDBを使って管理するべきだと思います。費用面・管理のしやすさという点ではExcelのほうがいいかもしれませんけど。。

本来最も大切な内容が、体裁・フォーマットなどによって情報量が落ち、品質が低下シている気がします。

 

結論:すべてのドキュメントをOffice、PowerPoint、Wordで書くのは止めるべき

 

 

以上です。

次はずっと考えている数学の問題について書きたいと思います。

 

 

そんな感じです。

chroot/jailは仮想化技術なのか

chrootとは

chrootは実行するプロセスのルートディレクトリを変更するシステムコールである。

chrootによって実行されたプロセスは、指定されたディレクトリを"/"だと思い込んで実行するため、それ以上の階層のディレクトリにアクセスすることはできない。これは"chroot監獄"などと呼ばれる。

chroot実行

実行環境:Ubuntu 12.04 64bit

実行コマンド:chroot /myroot ls

ディレクトリ構成

/myroot

 |_bin/bash

   |_bin/ls

   |_lib/ld-2.19.so

   |_lib64/ld-linux-x86-64.so.2

 

実行できませんでした。下記のエラーメッセージが出力された。

chroot: failed to run command ‘/bin/bash’: No such file or directory

 

今回の記事の目的はchrootを実行することじゃないから原因究明については

後ほど。でもこれなんかモヤモヤする。早く解消したい。

 

chroot/jailは仮想化技術なのか

前々からchroot/jailは仮想化じゃないと思ってました。その理由を述べます。

その前に、仮想化ってなんでしょうか。みんな当たり前に使っていて、実はよくわかっていないバズワードになっているのではと感じています。

wikipediaによると、「リソースの抽象化」って書いてますが、僕は仮想化とは「物理的な実体を論理的に一つのもの、または複数に見せかける」ことだと思っています。

そうすると、ハードディスクに書き込まれた0/1列を1つのファイルに見せるファイルシステムも仮想化ってことになるけど、これはどうなるんだろう…。OSもマルチプロセスも仮想化ってことになりますね。仮想化の技術の1つとしてマルチプロセス(物理CPUのリソースを分割するタイムシェアリング)があるのか…。卵が先か鶏が先かみたいな話になってしまいました。話を戻します。

 

chroot/jailは最上位のディレクトリをホストOSのルートディレクトリ以外のディレクトリにすることによって、ファイルシステムが複数あるように見せかけています。サンドボックスの役割を果たしています。

 

僕がchroot/jailを仮想化技術じゃないと思う理由は次の通り(というより、chroot/jailが仮想化技術と呼ばれていることへの個人的な不満になりますw)

1. カーネルが共通である

2. 囚人の見せかけられたファイルシステムは看守からアクセスできる

3. 囚人のプロセスは看守から見ることができる(killも可能)

 

 つまり、リソースの観点からは本当に閉じていないのです。

だから、chroot/jailを仮想化技術と呼ぶことに対して心理的な抵抗があります。

似たようなことを他の方もおっしゃっていました。ちなみにその方は「半仮想化」って読んでいましたね。なるほど!

 

ちなみに、抽象化は「対象から詳細を捨象し、考えるべき要素・概念を減らすこと」です。端的に言えば「こまけぇことはいいんだよ!」です。

 

最後に

他にも似たような技術にLXC/Dockerがありますね。ここらへんは全く知識がないので、ぜひ勉強していきたい分野です。

なんかただの愚痴?みたいになってしまいました。まだまだ未熟なのでさらに仮想化について学んでいきたいです。

VMware Workstationの仮想アダプタのIPアドレスが勝手に変更されていた件

ある日突然、VMware WorkstationのNAT用のアダプタvmnet08のIPアドレスが勝手に変更されていました。構成ファイルも変更した記憶もないし、NATサービスを再起動した記憶もないです。(そもそも仮想アダプタの構成ファイルを変更していないからNATサービスを再起動したとしても変更されないはず)

 

構成ファイルvmnetdhcp.confとvmnetnat.confを確認すると、確かにvmnet08の設定が変更されていました。

もしかすると自分で気づかないうちに何か処理をして変更してしまっているのかもしれません。わざわざ家の環境でログ監視なんてする気になれなかったので、一個一個ログを追わないといけないからめんどくさいと思ってしまっている…

 

仮想マシンIPアドレスが変更されて、以下行ったこと。

①hostsの書き換え

 DNSサーバ構築すればいいんですけどね、よくしらないからhostsに

 頼っていました。

 これを期にDNSサーバ構築してみようかな、、

②Nutanix再構築

 僕の技術力不足であることは確実ですが、Nutanixの基盤とCVMのIPアドレスの変更

 方法がわからなかったので、最初から構築しなおしました。

 1~2時間位はかかりますね。

 

めんどくさいから、IPアドレスが変わった原因については放置かも。

DNSサーバは学習する価値ありですね。やっぱりBindですかね、、

 

 

ニセコイが終わって少し哀しいです。

そんな感じです。

エクセルの関数についての疑問

最近仕事が忙しくて全く書いていないことを思い出しました。

いやすみませんずっとゲームやってました。

魔女と百騎兵

攻略しました。

 

結構長かったですね。

でも面白かったです。

(ところどころゲームバランスとかシステムへの不満が多少あるのを除いて)

 

さて、エクセルの関数を覚えるの避けてたんですが、「仕事が遅い!」

と怒られてしまってエクセルの関数をマスターしようと思って

エクセルについて勉強中です。

 

以下、エクセルの関数の疑問。

・VLOOKUP関数は何故検索する列を指定できないのか

 というより、何故こんな仕様にしたのかっていう疑問です。

 左端だけってお前…って感じです。

 RDB的な使い方を想定しているだと思います。

 主キーは常に左端にあるとは限らないのでは…?と

 

巷では「エクセルはク◯」ってなってますが、僕は胸を張ってこれを言えるほどエクセルを触っていないと思うので、言えるかどうか判断できるようになるまでエクセルを触ってみたいと思います。

 

vCenterサーバも構築したし次はもっと仮想よりの話がしたいですね。

LVSとかHAproxyのようなLPIC3のこともやっていきたいです。

 

 

 

 

そんな感じです。

 

 

 

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の基本は押さえられたと思います。

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

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

 

 

そんな感じです。