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

日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

otto 入門記 その1

実際に otto を動かしながら入門してみたいと思います。

教材はこれ

ottoproject.io

インストール

Otto はバイナリが配られているので、Mac / Linux では zip を展開して出来る otto ファイルを適当なパスの通っている場所に置くだけ。

El Capitan の場合は /usr などに書けないので今回は $HOME/opt/bin に配置してみた。

初期のコマンド実行からサンプルアプリの起動

getting start 用の GitHub リポジトリがあり、それを clone して使う模様。

$ git clone git@github.com:hashicorp/otto-getting-started.git

続いて、ディレクトリを変えて otto compile。ちなみに何が行われているかは良くわからず。

$ cd otto-getting-started/
$ 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-getting-started (ruby)
    Project:        otto-getting-started
    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 infastructure, 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.

ログを見ると ruby のアプリケーションで otto-getting-started というプロジェクトが作られ、インフラは aws となった模様。 Access Key とか用意してないけど入門できるんだろうか…。

続いて、環境を起動だと思われる…。

$ otto dev

Would you like Otto to install Vagrant?
  An older version of vagrant was found installed (1.7.2). Otto requires
  version 1.7.4 or higher. Otto can install the latest version of vagrant
  for you (1.7.4). Would you like Otto to update vagrant for you?
  
  Please enter 'yes' to continue. Any other value will exit.

  Enter a value: yes

==> Downloading Vagrant v1.7.4...
    URL: https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4.dmg

    85.3 MB/85.3 MB
[otto] Attaching Vagrant disk image...
[otto] Starting Vagrant installer...
Password:
installer: Package name is Vagrant
installer: Upgrading at base path /
installer: The upgrade was successful.
[otto] Vagrant installed. Cleaning up...
==> Vagrant installed successfully!
==> 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_1444888978943_95248
==> 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 => 2222 (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: Warning: Connection timeout. Retrying...
    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: 4.3
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/takeshi/workspace/otto/otto-getting-started
    default: /otto/foundation-1 => /Users/takeshi/workspace/otto/otto-getting-started/.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-getting-started
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: [otto] Adding apt repositories and updating...
==> default: [otto] Installing Ruby 2.2 and supporting packages...
==> default: [otto] Installing Bundler...
==> default: [otto] Configuring Git to use SSH instead of HTTP so we can agent-forward private repo auth...

==> Caching SSH credentials from Vagrant...
==> Development environment successfully created!
    IP address: 172.16.1.6
    
    A development environment has been created for writing a generic
    Ruby-based app.
    
    Ruby is pre-installed. To work on your project, edit files locally on your
    own machine. The file changes will be synced to the development environment.
    
    When you're ready to build your project, run 'otto dev ssh' to enter
    the development environment. You'll be placed directly into the working
    directory where you can run 'bundle' and 'ruby' as you normally would.
    
    You can access any running web application using the IP above.

起動直後にインストールされている Vagrant が古いバージョンだったため、インストールするか聞かれて、 "yes" と入力しただけで、ほかは実行が終わるのを待つのみでした。(割と10分弱は待たされる感じ)

コマンドの実行が終わったら、これで開発環境の準備が終わったことになるらしい。 ssh でログインしてみます。

$ 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$

仮想マシンに入れた!∩(´∀`)∩

続いて、 bundle と rackup で ruby アプリケーションの準備をするらしい。

vagrant@precise64:/vagrant$ bundle && rackup --host 0.0.0.0

Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Installing rack 1.6.4
Installing rack-protection 1.5.3
Installing tilt 2.0.1
Installing sinatra 1.4.6
Using bundler 1.10.6
Bundle complete! 1 Gemfile dependency, 5 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
[2015-10-15 06:21:27] INFO  WEBrick 1.3.1
[2015-10-15 06:21:27] INFO  ruby 2.2.3 (2015-08-18) [x86_64-linux-gnu]
[2015-10-15 06:21:27] INFO  WEBrick::HTTPServer#start: pid=7188 port=9292

これで WEBrick も起動できたようだ。続いて Web ブラウザで動作確認するわけですが、otto で起動した環境の IP アドレスが分からなくなってしまったときは

$ otto dev address
172.16.1.6

とすると、動いている環境の IP アドレスが表示されます。

ブラウザで http://172.16.1.6:9292/ にアクセスすると…

画面出た! ∩(´∀`)∩

名前を入力して submit すると、次画面で Hello <入力値> と挨拶するアプリケーションのようです。

ここまで実施した内容を振り返り、何が行われたかの確認に入ります。

コンパイル

最初に実行した

$ otto compile

このコマンドは、Otto の鍵となる魔法のステップだそうです。

Otto はあなたの設定と環境を調べて、開発やデプロイに使用する数ダースのファイルを出力します。

このサンプルにおいて、"otto compile" はアプリケーションで ruby が使われていると自動的に判断して、その他はデフォルトを使用しました。今後のステップでは、使用する言語などを appfile に記述し otto に正確に伝えます。

otto が出力したファイルは .otto ディレクトリに配置されます。中を見ると以下のような感じ。(ドキュメントよりコピペです)

$ tree .otto
.otto
├── appfile
│   ├── Appfile.compiled
│   └── version
├── compiled
│   ├── app
│   │   ├── build
│   │   │   ├── build-ruby.sh
│   │   │   └── template.json
│   │   ├── deploy
│   │   │   └── main.tf
│   │   ├── dev
│   │   │   └── Vagrantfile
...

24 directories, 41 files

このようにゼロコンフィギュレーションで、開発に必要なファイルを生成し環境を構築して、サーバを起動して、アプリをデプロイして、他にも色々…。Otto はあなたが何もしなくても全てのソフトウェアを自動的に管理して、協調させます。

これが Otto の美しいところです:簡単な入力とワークフローで、業界標準のベストプラクティスに基づいてアプリケーションの開発と配置を管理します。あなたは otto を学べば、他のことは otto がやってくれます。

コンパイルの詳細は Appfile Compilation - Otto by HashiCorp を参照してください。

開発環境の構築

一度コンパイルした後は、 "otto dev" で開発環境を起動します。

これはローカルの仮想マシンに環境を構築して、アプリケーションを共有し、アクセスできるように IP アドレスを構成しました。

Otto によってアプリケーションに ruby が使われていると判断され、Ruby のアプリケーションで必要とされる、Ruby と bundler が自動的にインストールされてます。今後のステップでは、Rubyはインストールされているものとして設定方法を解説していきます。(ドキュメント上は)

"otto dev" の終わりに、正常な開発環境の設定を出力します。これらはアプリケーションの定義に沿って出力され、PHP や Node に合わせた出力もできます。

otto はこれらのことを設定なしにコマンド一つで行っています。

SSH と共有ファイル

"otto dev ssh" で開発環境の仮想マシンSSH でログインできます。

"otto dev" を実行したディレクトリと "otto dev ssh" でログインした仮想マシンのホームディレクトリは同期されて同じデータが見えます。

"ls" を実行すると

$ ls
Gemfile     Gemfile.lock    README.md   app.rb      config.ru   views

リポジトリのファイルが見えます。 ローカルで変更されたファイルがすぐに反映されるので、素早く開発を行えます。

(この辺りは、Vagrant を使っている人にはすぐ分かりますね)

Application-Specific Software

Otto が自動的に ruby と bundler をインストールしてくれるので、続いてはアプリケーションの依存性解決 (bundler) とアプリケーションを開始 (rackup) を行います。

$ bundle && rackup --host 0.0.0.0
Using rack 1.6.4
Using rack-protection 1.5.3
Using tilt 2.0.1
Using sinatra 1.4.6
Using bundler 1.7.6
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
[2042-01-01 12:55:28] INFO  WEBrick 1.3.1
[2042-01-01 12:55:28] INFO  WEBrick::HTTPServer#start: pid=12965 port=9292

実行するとこんな感じですね。(ドキュメントからのコピペ)

Otto はアプリケーションが PHP を使うときは PHP をインストールし、Node の場合は Node と NPM をインストールして、自動的に開発環境を構築します。

開発環境のアドレス

開発環境が作られる時にアドレスを割り当てします。そのアドレスを調べる時は以下の様にします。

$ otto dev address
172.16.1.137

もしかしたら、違うアドレスが表示されることがあるかもしれません。

また、Webサーバが動いているポート番号は 9292 が使われ、これはデフォルトです。

その他のコマンド

"otto dev" は様々なサブコマンドがあって "otto dev help" で確認できます。

このコマンドはアプリケーションの種別毎に切り替えることがあります。将来的に ruby コンソールを開くようなコマンドが otto に将来的に追加されることも考えられます。

続いて

Otto がゼロ設定で開発環境の構築とアプリケーションのセットアップが出来てしまうことが理解できたと思います。次はインフラを構築してアプリケーションをデプロイするプロセスを始めます。

最後、意訳になっちゃったのが不覚ですが、今回はここまで。Getting Started も良い感じに分かれているので回数は稼げる感じ。