戦場のプログラマー

名前は誰も知らない。

otto dev コマンドを使ってみた

新年一発目。 HashiCorp の集大成とも言えるべき Otto をインストールしてみた。

Otto とは

若干ググラビリティが低いのが難点。
これはすごく乱暴に言ってしまえば Vagrant の後継となるソフトウェアである。
Vagrant やら Consul やら Vault やら AWS やら GCP といったいろいろなものをシームレスに連携して統一世界を作るためのものらしい。
Mitchell Hashimoto 氏がここまで予見して Consul や Vault といったプロダクトをリリースしていたとしたら脱帽せざるを得ない。

otto 全般について触ってみた結果を載せられたらいいんだけど、何分時間も頭も足りないので全部は解説できない。
なので otto dev サブコマンドで起動、停止するだけの簡単なものを記録として残す。

さて、 otto dev サブコマンドは結論からいうと今のところ Vagrant なしには動かない。
バックエンドで Vagrant を使っている。
今後は Vagrant 自身も必要なくなって otto だけで動くようになってくれるのかな。
そうすると Vagrant の遅さを考えなくて良くなるのだろうか。

プロジェクトの作成

otto のプロジェクトを立ち上げるためには既存のソースだけ使うか、それとも Appfile という JSON 形式のファイルでどのような言語を使うかを指定してやることになる。
私はものぐさなので前者。
おそらく Vagrantfile に記述していたような複数VMを構成したり、秘伝のタレめいたシェルプロビジョニングを使いたい場合は Appfile に記述したのだろう。

ソースの用意

私は次のようなソースを用意した。

<?php
phpinfo();

otto compile

そしてそのディレクトリで otto compile する。
Appfile が見つからなければソースの内容をみてどの言語のプロジェクトか判断してくれるようだ。
この場合、リリースするインフラストラクチャは AWS が選択された。

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ otto compile
==> Loading Appfile...
==> No Appfile found! Detecting project information...
    No Appfile was found. If there is no Appfile, Otto will do its best
    to detect the type of application this is and set reasonable defaults.
    This is a good way to get started with Otto, but over time we recommend
    writing a real Appfile since this will allow more complex customizations,
    the ability to reference dependencies, versioning, and more.
==> Fetching all Appfile dependencies...
==> Compiling...
    Application:    otto-php (php)
    Project:        otto-php
    Infrastructure: aws (simple)

    Compiling infra...
    Compiling foundation: consul
==> Compiling main application...
==> Compilation success!
    This means that Otto is now ready to start a development environment,
    deploy this application, build the supporting infrastructure, and
    more. See the help for more information.

    Supporting files to enable Otto to manage your application from
    development to deployment have been placed in the output directory.
    These files can be manually inspected to determine what Otto will do.

ローカル開発環境の立ち上げ

otto dev

満を持して vagrant up に相当するコマンドを叩く。

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ otto dev
Would you like Otto to install Vagrant?
  Otto requires vagrant to be installed, but it couldn't be found on your
  system. Otto can install the latest version of vagrant for you. vagrant
  will be installed system-wide since it uses system-specific installers.
  Would you like Otto to install vagrant for you? Alternatively, you may install
  this on your own.

  If you answer yes, Otto will install vagrant version 1.8.1.

  Please enter 'yes' to continue. Any other value will exit.

  Enter a value:

Error building dev environment: Installation cancelled

otto dev は vagrant がインストールされていないと動かないらしい、もしくは otto 全体でそうなんだろうか。
あなたがお望みなら自動でシステムワイドでインストールしてやるぜ?といっているが、ここは yes 以外の適当なキーを押して抜けて自力で Vagrant をインストールする。

また vagrant を Web サイトからいちいちダウンロードするのは果てしなくだるいので、 otto にまかせてしまってもいいのかもしれない。
Mac の場合は Homebrew Cask がインストールされていればコマンド一発でインストールできる。
まあ、 sudo 権限が必要なのでパスワードは要求されるが・・・。

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ brew cask install vagrant
==> Downloading https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask vagrant
==> Running installer for vagrant; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are i
Password:
==> installer: Package name is Vagrant
==> installer: Installing at base path /
==> installer: The install was successful.
?  vagrant staged at '/opt/homebrew-cask/Caskroom/vagrant/1.8.1' (6 files, 85M)

仕切り直して改めて otto dev

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ otto dev
==> Creating local development environment with Vagrant if it doesn't exist...
    Raw Vagrant output will begin streaming in below. Otto does
    not create this output. It is mirrored directly from Vagrant
    while the development environment is being created.

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise64'
    default: URL: https://atlas.hashicorp.com/hashicorp/precise64
==> default: Adding box 'hashicorp/precise64' (v1.1.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/boxes/precise64/versions/1.1.0/providers/virtualbox.box
==> default: Successfully added box 'hashicorp/precise64' (v1.1.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise64' is up to date...
==> default: Setting the name of the VM: dev_default_1451618455051_6865
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 5.0
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/wnoguchi/Documents/pjt/otto/otto-php
    default: /otto/foundation-1 => /Users/wnoguchi/Documents/pjt/otto/otto-php/.otto/compiled/app/foundation-consul/app-dev
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: [otto] Installing Consul...
==> default: [otto] Installing dnsmasq for Consul...
==> default: [otto] Configuring consul service: otto-php
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: [otto] Adding apt repositories and updating...
==> default: [otto] Installing PHP and supporting packages...
==> default: [otto] Installing Composer...
==> default: #!/usr/bin/env php
==> default: All settings correct for using Composer
==> default: Downloading...
==> default:
==> default: Composer successfully installed to: /tmp/composer.phar
==> default:
==> default: Use it: php composer.phar

==> Caching SSH credentials from Vagrant...
==> Development environment successfully created!
    IP address: 100.79.109.82

    A development environment has been created for writing a PHP app.

    Edit files locally on your machine, the file changes will be synced
    to the development environment automatically.

    To run and view your application, run 'otto dev ssh' to enter the
    development environment. You'll be placed directly into the working
    directory where you can run "composer", "php", etc.

    You can access the environment from this machine using the IP address above.
    For example, if you start your app with 'php -S 0.0.0.0:5000', then you can
    access it using the above IP at port 5000.

このログメッセージを見ればわかるが、 Consul もインストールされ、PHP ではもはや必須となった Composer までよろしくインストールしてくれている。
composer.json まで入れたらいい感じにインストールしてくれるんだろうか。
仮想マシンUbuntu の precise64 が選択されている。
ここも詳細に指定したいな。

開発環境として 100.79.109.82 という IP が与えられたので、さっそくホスト OS からブラウザでアクセスしてみる。
「データを受信していません」となった。どうも環境の AP サーバは自力で開発環境に入り、立ち上げてやる必要があるらしい。

いつものくせで vagrant ssh としてしまったら

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ vagrant ssh
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.

vagrant init せえよアホンダラア!!って怒られてしまった。 およそ otto dev ssh とでもするんだろう。

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ otto dev ssh
==> Executing SSH. This may take a few seconds...
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
New release '14.04.3 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:/vagrant$ cd /vagrant/
vagrant@precise64:/vagrant$ ls
phpinfo.php

入れた。

vagrant@precise64:/vagrant$ php -S 0.0.0.0:5000
PHP 5.6.16-2+deb.sury.org~precise+1 Development Server started at Fri Jan  1 03:27:21 2016
Listening on http://0.0.0.0:5000
Document root is /vagrant
Press Ctrl-C to quit.
[Fri Jan  1 03:27:40 2016] 100.79.109.1:51305 [200]: /phpinfo.php
[Fri Jan  1 03:27:41 2016] 100.79.109.1:51306 [404]: /favicon.ico - No such file or directory

そしてブラウザから 5000 番ポートを叩く。

f:id:wnoguchi0727:20160101132031p:plain

見れた。

さらにアクセス元のリモートIPアドレスを取得するサンプルも書いてみた。
開発環境にはすぐに同期される。

<?php
echo $_SERVER['REMOTE_ADDR'];

そしてブラウザで見る。

f:id:wnoguchi0727:20160101133202p:plain

見れた。

じゃあシャットダウン。これもサブコマンドで otto dev halt だろうと予想がつく。

noguchiwataru-no-MacBook-Air:otto-php wnoguchi$ otto dev halt
==> Halting the the local development environment...
==> default: Attempting graceful shutdown of VM...

==> Development environment halted!

シャットダウンできた。

知らない IP アドレスだ...

ipduh によるとこの IP アドレスは

http://ipduh.com/ip/?100.79.109.82

100.79.109.82 is in the 100.64.0.0/10 block which is reserved to be used as Shared Address Space to accomodate the need of Carrier-Grade NAT (CGN) devices. It is anticipated that Service Providers will use this Shared Address Space to number the interfaces that connect CGN devices to Customer Premises Equipment (CPE). [ RFC 6598 ]

Integer: 1682926930

のように Carrier-Grade NAT デバイスが Customer Premises Equipment(CPE) に接続するための共有アドレス空間として 100.64.0.0/10 は予約されているらしい。
グローバル IP アドレス空間をむやみに汚染しているわけではないらしい。

これを見る限り CGN はグローバル IPv4 アドレス枯渇問題をとりあえず回避するために ISP が共有NATアドレス空間を定義したことがことの始まりであり、この RFC 定義空間をよろしく使っているのが otto dev になるようだ。

References

  1. Hashicorp Ottoを読む | SOTA
  2. HashiCorpの新プロダクトNomadとOttoを触ってみた | Developers.IO
  3. Hashicorp社の新しい仮想開発環境"Otto"でAppfileを記述してみた - FPGA開発日記