Mac で ansible 基礎設定やってみた。
Ansible のことをちまちまやったので、その件メモ。
ネカフェでやってるんだけど、近くのネカフェは速度が遅すぎてこれ以上はちょっと厳しかった。
Install
と言ってもこれだけ。
$ brew install ansible
ちなみにバージョンは
$ ansible --version ansible 1.9.2 configured module search path = None
セットアップ先環境
テストだから Vagrant で環境作った。
自分の環境は 1.7.1 で、バージョンアップしたらコマンド変わってるかもわからん。
あと、VirtualBox4.3.30 とちょっと古め。新しいやつ推奨かな。
環境もかなり適当に Cent6 を A list of base boxes for Vagrant - Vagrantbox.es から拾ってきた。
vagrant box add cent6.6 [https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box] vagrant init centos6.6
成功したら、Vagrantfile というファイルが出来上がるので、ssh 用の設定を追加。
# Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a private network, which allows host-only access to the machine # using a specific IP. # ここの設定を有効化。サンプルでは下記のIP config.vm.network "private_network", ip: "192.168.33.10"
最後に vagrant up
で起動する。
Ansible hosts 設定
ansible は基本的に専用の hosts ファイルで接続先を設定する。
mac で、Homebrew 経由の場合、/usr/local/etc/ansible/hosts
に書いてある。
なんか指定しないと怒られる雰囲気だったので、下記のように指定。
[servers] 192.168.33.10
ここまできたら、まずは vagrant up
を実行し、起動後に vagrant ssh-config --host vagrant >> ~/.ssh/config
で ssh 設定を設定ファイルに流し込んでおく。
その後、~/.ssh/config
を開くと、下記のような設定ができている。
Host vagrant HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /Users/hoge/Documents/projects/play_2.4_activerecord/ansibles/.vagrant/machines/default/virtualbox/private_key IdentitiesOnly yes LogLevel FATAL
重要なのは「IdentityFile」で、これを元に、下記のような定義を作っておく。
Host 192.168.33.* IdentityFile /Users/hoge/Documents/projects/play_2.4_activerecord/ansibles/.vagrant/machines/default/virtualbox/private_key User vagrant PasswordAuthentication no
これで設定完了。
一応 ssh 192.168.33.10
が通るかだけ確認しておくと良い。
フォームヘルパーをタグ調整する(Play 2.4.x) with マルチセレクトチェックボックス
Playframework 2.4 において、フィールドコンストラクタの仕様も変わったので、対応したチェックボックスを作ってみる。
Custom Field Constructors
これがなんなのかというと、input とかの helpers の外枠の事。
いつぞや Bootstrap 対応した フォームヘルパーをタグ調整する(Play 2.3.x) - 謎言語使いの徒然 を焼き直す。
Bootstrap インストール
まずは、いろいろやるのが面倒なので、build.sbt
に下記を用意する。
libraryDependencies ++= Seq( "com.github.aselab" %% "scala-activerecord" % "0.3.1", "com.h2database" % "h2" % "1.4.185" % "test", "mysql" % "mysql-connector-java" % "5.1.34", // この下 3 行を追加 "org.webjars" %% "webjars-play" % "2.4.0-1", "org.webjars" % "jquery" % "1.11.3", "org.webjars" % "bootstrap" % "3.3.5", evolutions, jdbc, cache, ws, specs2 % Test ) // あとから書くのも面倒なので追加。 TwirlKeys.templateImports += "views.html.commons._"
そしたら、conf/routes
に下記を追記
GET /webjars/*file controllers.WebJarAssets.at(file)
app/view/main.scala.html
も Bootstrap 取り込み。
@(title: String)(content: Html) <!DOCTYPE html> <html lang="en"> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")"> <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")"> <!-- custom for bootstrap --> <link rel='stylesheet' href='@routes.WebJarAssets.at(WebJarAssets.locate("css/bootstrap.min.css"))'> <script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))'></script> <script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.locate("js/bootstrap.min.js"))'></script> </head> <body> <!-- Wrap bootstrap container --> <div class="container-fluid">@content</div> </body> </html>
跡はTodoリストでも勝手に書いて。
ちなみに、Bootstrap の入力フォームは、各 input タグに class="form-control"
入れないとデザイン整わないので注意。
カスタムフィールドコンストラクタの作成
と言っても言うほどの事もないか?
app/views/commons/bootstrapFields.scala.html
作って、下記を置く。
@(elements: helper.FieldElements) <div class="form-group @if(elements.hasErrors){has-error}"> <label for="@elements.id" class="col-sm-2 control-label">@elements.label</label> <div class="col-sm-10"> @elements.input </div> @if(!elements.infos.isEmpty){ <div class="col-sm-10 col-sm-offset-2"> <span class="help-inline"> @for(info <- elements.infos){ <span class="label label-warning">@info</span> } </span> </div> } @if(elements.hasErrors) { <div class="col-sm-12"> <div class="alert alert-danger"> <ul> @for(msg <- elements.errors){ <li>@msg</li> } </ul> </div> </div> } </div>
そして、パッケージオブジェクトを作成する。
package views.html package object commons { import views.html.helper.FieldConstructor implicit val bootStrapFieldConstructor = FieldConstructor(bootstrapFields.f) }
import 設定は、build.sbt に入れてあるので、後は普通に helpers.input とか使うだけ。
マルチセレクトチェックボックス
デフォルトのヘルパーにいないので、頑張って作ってみた。
え?頑張ってないじゃないかって?実は問題が一つあるんだけど、後で話そう。
@(field: play.api.data.Field, keyValues: Map[String, String])(implicit messages: play.api.i18n.Messages) @helper.input(field) { (id, name, value, htmlArgs) => @defining(keyValues.toList.zipWithIndex){ results => @for(kv_i <- results){ <label class="checkbox-inline"> <input id="@{id}_@{kv_i._2}" name="@{name}[@{kv_i._2}]" type="checkbox" value="@{kv_i._1._2}" @if(value.exists(v => {keyValues.exists(_._2 == v)})){selected}> @kv_i._1._1 </label> } } }
使い方的には、フォームを下記の定義にして
val checkBoxes = { import play.api.data.Forms._ Form(single("multiSelect" -> list(longNumber))) }
テンプレート上でこう
@multipleCheckBox(checkBoxes("multiSelect"), Map("first" -> "1", "second" -> "2", "third" -> "3"))
そして、問題はなんなのかというと、バインドしたフォームを指定してもチェックが付かないという事。
解決しようと 3 時間くらい粘ったけど、結局未解決。
追記。
上記リンク先で、無事解決しました。
kawty さんありがとうございます。