ansibleのlineinfile での落とし穴

bindの社内DNSのゾーン設定をansibleで自動化しようとしていたところ、


下記の記述だと、resolver 1のタスク しかincludeステートメントが追加されていなかった。

  - name: resolver 1
    lineinfile: dest={{namedconf}} insertafter="^###localhost_resolver" line='include "/etc/named.{{domain}}.zone";' state=present

  - name: resolver 2
    lineinfile: dest={{namedconf}} insertafter="^###internal_resolver" line='include "/etc/named.{{domain}}.zone";' state=present

どうも、lineinfileだと、lineの中身が同一だと、insertafterのマッチ文字列が異なっていても、そこにすでに、行がpresentなものとされ
二つ目は追加されないようです。


2つ目のline=includeの後ろにもう一個半角スペースを入れることで、二つとも追記できるようになりました。

line='include "/etc/named.{{domain}}.zone";'line='include "/etc/named.{{domain}}.zone"; ' ← これで1回目の文字列と異なるものとしてansibleに認識される

社内ファイルサーバ検討(その3)〜純正ツールaws clientに落ち着いた〜

goofys でマウントした領域にrsyncをかけてバックップするという仕組みは原因不明で
実現できませんでしたが、
amazonの純正ツールで sync コマンドを発見。
aws コマンドでs3のバケットと同期できるようです。


exclude オプションなどもあり、rsync的な使い方ができます。
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


さっそくawsコマンドラインツールをインストールします。
pythonで書かれているので、pip からインストールしました。


コマンドはこんな感じで実行します。

$ /usr/bin/aws s3 sync ${SRC} ${TARGET} ${OPTION_EXCLUDE}


ここで1点問題が発生。
AWSAPIでのアクセスはAWS側のサーバ時間とクライアント側の時刻がずれていないことが必須です。


VirtualBoxのゲストOSで動作させているため、時間が遅れていくという事象が発生し、
Additional Packageをインストールすれば大丈夫みたいなのがあったのですが、
私の環境だとうまくいきませんでした。


ちなみにntpdデーモンで同期しようとしてもうまく動かなかったため、
ntpdデーモンを停止した上で、むりくりntpdateコマンドで強制的にcronで時刻同期するようにしました。

/usr/sbin/ntpdate ntp.nict.jp && /usr/bin/time /usr/bin/aws s3 sync ${SRC} ${TARGET} ${OPTION_EXCLUDE}


syncには時間がかかることが予想されるので、timeコマンドで実行時間もわかるようにしました。
700GBのディスクスペースを同期精査するのに1時間半ほどかかりました。
(アップするファイルがある場合はもっと時間がかかります)


思ったよりも早かったので、夜中に実行しておけば問題はなさそうです。
実行時間もとってメールするようにしてあるので、遅くなった時は気づけるしね。


ちなみに、goofysでせっかくs3バケットをマウントできているので、
こちらのファイルマネージャを使って、どんなファイルがバックアップされるか参照できるようにしました。
検索ができるので便利だし、ファイルの操作やフォルダの作成機能も無効にできるので、
バックアップ領域の参照目的としてはパーフェクトです。

https://github.com/leefish/filethingie


本家サイトがなくなっているぽいですが、とても便利ですよ!
しばらくこんな構成で運用してみたいと思います。

社内ファイルサーバ検討(その2)

社内ファイルサーバ検討(その1)で


いろいろと今のNASからの代替案をあげましたが、
個々の代替案を検討したプロセスについてお話ししたいと思います。


パブリッククラウド

まずだれもが思いつくのがパブリッククラウドです。


Google Driveだと、G suite basicを使っているので、+600円/ユーザ/月 で無制限で使えるようになります。
本来はこれがファイルサーバの代替になると一番うれしかったのですが、

  • ファイルが特定のユーザに紐づく
  • ネットワークドライブとして利用できない
  • 既存の2TBのファイルをどうやって移行しようか・・
  • 2TBをクライアントで同期するのはナンセンスなので、基本ブラウザベースでの操作になりそう


という理由から、今回は見送りとしました。


MicrosoftのOne driveもOfficeライセンスが一緒なので、
結構魅力的だったのですが、やはりファイルサーバとしての用途はGoogleDriveと同様なので、見送り。
DropBoxなども1ユーザあたり月額1000円を超えるし、あまりメリットを感じず、といったところです。


Google Appsのビジネス版でファイルサーバみたいなのを用意すると売れる気がします。

ASPクラウド ファイルサーバ

今回検討したのは、Fusion Secure Drive Plusというサービスです。


ネットワークドライブにもなるし、IP制限でアクセス制限もかけられる
と、機能的には現在のNASの代わりを十分に果たしてくれそうです。


うちの会社だと月額4万程度の見積もり試算でした。
とはいえ、年間50万弱の経費は小さな会社にはインパクトがあります。

S3バケットをマウントし、Windows ネットワークから参照する方法

3つのアプリケーションを検証しました。


ExpanDrive
ローカルの各端末にインストールして使うぶんには一番安定していました。
ただ、マウントしたS3のバケットをネットワークドライブとしてネットワーク経由でアクセスができません。
つまりはすべての端末にクライアントをインストールする必要があり、AWSへの認証情報も
各端末で設定する必要があり、運用管理上見送りです。


TntDrive
Windowsのみです。S3バケットをマウントし、ネットワークドライブとして利用でき、LAN内の端末からアクセス可能です。
ソフトウェア費用もたった数千円ですみ、社内のWindowsマシンにマウントしておけば、いまのNASと同様に使える。


しかもS3バケットなので、容量はほぼ無制限!


なーんていう夢ものがたりを描いたのですが、
大量のファイルをアップしたり、参照したりすると結構不安定で、エラーが頻発。
別のソフトウェアを探すことにしました。


Cloudberry Drive
AWSのマーケットプレースにも製品を掲載しているソフトウェア会社の製品です。
試したところ、S3バケットのマウントはできたのですが、ネットワーク経由でのアクセスができませんでした。


Windows Server OSだとネットワーク経由でのアクセスができるらしいです。
サポートに連絡して、普通のWindowsでも動くようにお試しビルドまでしてもらったのですが、
ネットワークドライブへのアクセスが拒否されうまく動作しませんでした。


あまり時間をかけたくもなかったので、これも諦めることにしました。
andyいろいろとありがとうよ・・・


こうして、たった数十ドルのソフトウェアでS3という巨大ストレージを使い倒す、という淡い思いは儚く散っていきました。


大きなNASサーバに買い換える。

12TB のNASサーバが約20万で買えます。

RAID5して、8TBが利用可能ですので、まあコスト的にはわるくはなさそうだったのですが、

  • 停電とか心配するのやだな
  • ディスクは壊れるし
  • なんだかんだ電気代もバカにできないぞ!
  • ファイルがどんどん増えるときりがない・・

ということで、積極的な採用理由がありません。


S3バケットをバックアップ領域として利用する


このあたりから、小さな制作会社が、無限のストレージをファイルサーバとして安価に利用するなんてことは難しい、
ということにウスウス気がづいてきました。


そこで今使っているNASサーバを使いつつ、
既存のファイルを削除しやすく、
容量を増やさない工夫ができないかといった、
考え方にシフトし始めます。


普段の生活でも捨てられない人はたくさんいると思います。


「いつか使うかも・・」
「なんかあった時に使うかも・・」


で、結局何年も放置。それと一緒です。


削除しやすい仕組みを作ることがやっぱり大事なんじゃないかと思いました。
なくなった(削除した)時の不安を払拭することで気軽に捨てる(削除)してもらうことを目指します。

goofys を利用してうまいことNASサーバのデータをS3バケットと同期すれば?と考えました。


具体的には、linux サーバにマウントしたNASサーバの領域をlsync & rsyncでs3にバックアップするというものです。


しかしいざやってみると、rsyncでなぜかgoofysの領域にファイルコピーが失敗します。
いろいろ調べたのですが、よくわからず。。。



直接goofysでマウントした領域に、 mkdir や touch などはできるのですが、なぜかrsyncを使って
ファイルコピーができませんでした。


posix-ish なので、完全準拠していないせいでしょうか。


うーんと悩みながら、いろいろと調べていると、
s3 sync というものがあるというのを発見しました。


次回はこの一筋の光明を追いかける話をしたいと思います。

社内ファイルサーバの検討(その1)

会社の代表から、社内共有サーバなんとかなんない?
というお題をいただいたので、ちょっと本腰を入れて検討しました。

背景

現在総容量 2TB のNASサーバを社内で利用していますが、
ファイルが溜まりに溜まって、現在97%容量を占拠している状態です。


制作会社となると、デザインファイルや元素材の画像データがかなりの部分を占め、動画もとなると、
それはそれは多くの容量が必要になりがちです。


そうなってしまう原因の一つとして、
「どのファイルが必要か、不必要かを判断して整理する時間がかかる」
というのがあります。


どっしりと構える長期間のシステム開発プロジェクトとかだと、そういう時間も
とれるし、とらされるってもんですが、ウェブ制作は短期間でぐるぐる回すものが多いです。
運用も入って来たりしていて当事者としても要不要の判断は難しいと思います。


その結果、5年以上前のデータが参照もされずに、ひっそりと共有サーバに溜まっていくという事態が起きるというわけです。


ただ、このまま目を瞑っているわけにもいかないので、

  • 容量が拡張でき、ファイルを極力削除しなくてもよいこと
  • コストが安いこと
  • 現在のNASの使い勝手を損ねないこと


という条件を目標に最適なソリューションを考えてみました。

検討したソリューションたち

1. パブリッククラウド

Google Drive / OneDrive / Dropbox は月額数百円〜無制限に近いストレージが手に入ります。

2. ASPクラウド ファイルサーバ

VPNなどで接続してセキュアにクラウド上のストレージを利用するケースです。
今回検討したのは、Fusion Secure Drive Plusというサービスです。

3. S3バケットをマウントし、Windows ネットワークから参照する方法

3つのアプリケーションを検証しました。
ExpanDrive
TntDrive
Cloudberry Drive

4. S3バケットを直接利用する

s3fsやgoofys を利用してうまいことできないかな?の試行錯誤ケースです。

5. 大きなNASサーバに買い換える。

もっとも打算的な案。
比較として一応は検討しました。


とまあ、背景などを一通りお話させていただきました。

次回からそれぞれのソリューションの検討プロセスについてお話できればと思います!

Jenkinsを使って社内テスト環境作成を自動化してみました。

ちっちゃなウェブ制作会社には、社内IT部門などはなく、たいてい何でも屋として

  • 新入り社員のパソコンセットアップやアカウント管理
  • 社内/社外サーバの管理
  • プロジェクト管理ツールの管理
  • テスト環境の作成

などを行なっています。

その中で、「テスト環境の作成」を今回は取り上げたいと思います。
これは基本的には似たような反復作業で、結果としてLAMP環境とftpアカウントが作れればよいので、
ずっと自動化したいなーっと思っていました。


通常、案件を受注したらウェブディレクター主導で案件を進めます。
その後制作に入ると、社外パートナーや、クライアント確認用にテストサイトが必要になります。
そういった時に、「いついつまでにテストサイトが欲しい」という依頼が舞い込むのが通例です。


pleskサーバなので、そんなに大変ではないのですが、
ドメイン作って、データベース作って、FTPユーザつくって・・・
あ、basic認証もかけておいて。


みたいな話だと、いちいちパスワード作るのも面倒だし、
疎通確認するのも面倒だし、コピペでアカウント名とか作ると、ミスも起きるし、
なんとかしたいなと思っていました。

最初のアイデア | DigitalOcean上にディレクターが自由に環境を作成する

DigitalOcean に自由にテストサイトを構築できたらなんか今風でカッコいいよね!
という単なる技術的好奇心から出てきた案です。


DigitalOceanについてはこちらの記事でも紹介しましたのでご参考にしてください。
id:go_nash:20140925
技術的なところでいうと、前の記事と同様に、ansibleを使ってDigitalOcean上にサーバを構築するというのは変わりません。
ただ今回は、ウェブディレクターが環境を構築するというところを鑑みて、Jenkinsでそれを行うという絵を書きました。


メリットとデメリットを書き出してみました。

メリット
  • 各テストサイトで独立していて安心。例えば、本番はPHP5.3 なんでちょっと古いけど、それで検証したい場合とか。
  • Digital Oceanのスナップショット機能を使えばバックアップが自動でできる。なんてすばらしい。
デメリット
  • なんだかんだ、サーバの作成からミドルのインストールまでするので、作成するまで30分ぐらいかかる。
  • ドメインどうしよう?(API使えばドメイン登録も自動化できますが)
  • 継続案件や、運用に入るケースも多々あるので、せっかくdisposableなのに結局そのまま残すことが多くなりそう(お金がかかる)。
  • もし、テストサイトを案件が終わるごとに消していく場合、制作物をどう残して管理していくかという問題もはらむ。


うちの会社だと、なんだかデメリットの方が多い気がしてきました。
ということで、実際に自動化した内容はこちら

Pleskコマンドラインツールを使って、自動化する

実はPleskにはCLIが付いているんですね。
サーバ管理をGUIで行うためのツールなんだけど、コマンドラインが使える。なんだか逆説的だけど。

http://docs.plesk.com/en-US/12.5/cli-linux/using-command-line-utilities.40984/


これを使ってサブドメインの作成を自動化しました。
順を追って手順をみていきましょう!


あらかじめパスワードを作成しておきます。

PASS=`mkpasswd -s 0 `;


PHPとSSIを有効にしてサブドメインを作成します

$ sudo plesk bin subdomain --create ${YOUR_SUBDOMAIN} -domain ${YOUR_DOMAIN} -www-root /subdomains/${YOUR_SUBDOMAIN} -ssi true -php true


FTPアカウントを作成します。

$ sudo plesk bin ftpsubaccount --create ${YOUR_SUBDOMAIN} -domain  ${YOUR_DOMAIN} -passwd $PASS -home /subdomains/${YOUR_SUBDOMAIN}


データベースを使用しないサイトも珍しくなりました。
なので、DBとユーザを作成します。
サブドメインと同じ名称のユーザを作り、データベース名は"サブドメイン名_db"とします。

sudo plesk bin database --create ${YOUR_SUBDOMAIN}_db -domain ${YOUR_DOMAIN} -type mysql -add_user ${YOUR_SUBDOMAIN} -passwd $PASS


最後に.htaccess を設置します。

#パスワードファイルを作成
htpasswd -c -b ./subdomains/{YOUR_SUBDOMAIN}/.htpasswd {YOUR_SUBDOMAIN} $PASS
#.htaccessの雛形ファイルを用意しておき、作成したサブドメイン配下にコピーします。
cp dot.htaccess ./subdomains/{YOUR_SUBDOMAIN}/.htaccess
# パスを置換
sed -i -e "s/{{YOUR_SUBDOMAIN}}/${YOUR_SUBDOMAIN}/g" ./subdomains/${YOUR_SUBDOMAIN}/.htaccess

これらをjenkinsさんに実行させればOKです。
ちなみに、サブドメインを削除するコマンドもあり、ジョブを作成しようとしたのですが、
Pleskのバージョンが古いからかうまく動作しませんでした。。

まあ、削除だけは怖いことは怖いので、マニュアル対応としました。
次は社内共有ファイルサーバについてお話しようかと思います。

Mac OSにmxnet-ssdをインストールして、ディープラーニングに触ってみた

学生の頃によくブログを読んでいたshi3zさんが、いまは人工知能に注力している模様。
下記の記事に触発されて、手元のMBPで試してみました。
http://ch.nicovideo.jp/akiba-cyberspacecowboys/blomaga

環境

最近アップデートしたMacOS Sierraです。

shi3zさんのページではさらっとしか書かれていないのですが、
私のMacは環境とか整っていないので、いろいろと入れるものもありました。

#mac デフォルトのpythonだとうまくいかなかったので、brew でインストールする。
$ brew install python
$ brew linkapps python
$ brew link --overwrite python

#opencv をインストール
$ brew tap homebrew/science
$ brew install openblas
$ brew install opencv --HEAD #いらないのかも
$ brew unlink numpy
$ brew link --overwrite numpy
$ hash -r python

#描画ツールが入ってないと怒られたのでインストール
$ pip install matplotlib

#肝心のmxnet-ssdをclone
$ git clone --recursive https://github.com/zhreshold/mxnet-ssd.git
$ cd mxnet-ssd/mxnet
$ cp make/config.mk ./config.mk

#configを変えないとコンパイルできなかったので、下記のように変更
$ vi config.mk
~
# whether use opencv during compilation
# you can disable it, however, you will not able to use
# imbin iterator
#ココを0に変更
USE_OPENCV = 0

# use openmp for parallelization
#ココも0に変更
USE_OPENMP = 0

# choose the version of blas you want to use
# can be: mkl, blas, atlas, openblas
# in default use atlas for linux while apple for osx
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
USE_BLAS = apple
#LDパスを指定
ADD_LDFLAGS = -I/usr/local/opt/openblas/lib
ADD_CFLAGS =  -I/usr/local/opt/openblas/include
else
USE_BLAS = atlas
endif
~
#makeする
$ make -j$(sysctl -n hw.ncpu)
#デモを走らせる(cpuオプションをつけないとgpuで処理しようとしてエラーになる)
$ python demo.py --epoch 0 --images ./data/demo/dog.jpg --thresh 0.5 --cpu

息子が公園行った時の写真で試した。

ちゃんと息子は人として、ポニーは馬として認識されました。



新婚旅行で撮った象は残念ながらcowと認識 w


多分色々と学習さえさせれば認識できるようになるんだろうけど、
高スペックなGPU積んだマシンでデータを用意してゴリゴリ学習させるのが一番大変らしい。。


ただ今回試して見て、ちゃんと学習させれば機械が色々なものを認識できるようになるというのは肌で感じ取ることができました。

動物学習データモデル
物体学習データモデル
人間学習データモデル


とかとかいろんな訓練モデルを用意することで、その場に適した使い方ができるようになったりするのでしょうか。
ロボットも近い将来、カセットみたいに知能モデルをガッシャン切り替えられたりして。


まだディープラーニングの畳み込みとか理論的な背景はなんとなくしか理解できていませんが、
遠い昔、学習心理学を専攻していた自分にとって、人工知能は興味の近いところにあってとても面白いです。

iOS10 と Mac OSX Sierra ではPPTPが使えないだけでなく、テザリングしたPCもPPTP使えないという話

最近 iOS10に何気なくアップデート

最近Mac OS Sierraに何気なくアップデート

特に両方とも快適に使えてるなぁ〜と思っていたら、



Mac SierraではPPTPでのVPNが使えなくなってた。
iPhoneの OS10もPPTPでのVPNが使えなくなってた。
テザリングした上でのPCからのVPN PPTP(Shimo)も使えなくなってた。



まだまだPPTPでの接続が多いだけに不便だ・・・