ansibleはどこからtemplateを探すのか?

よく j2 を付け忘れては「templateが見つからない!」と言われます。

どこからtemplate fileを探しているのか?と調べてみたけど、ネット上にあまり落ちてないのでメモ。

こんな構成の Playbook だとして

play_dir
├── hosts
├── roles
│   └── foo
│       ├── defaults
│       │   └── main.yml
│       ├── tasks
│       │   └── main.yml
│       └── templates
│           └── bar.conf.j2
├── site.yml
└── templates
    └── bar.conf.j2

foo role の中で template を配置する task があるとする

- template:
  src: bar.conf.j2
  dest: /path/to/bar.conf
# Play
$ ansible --version
ansible 2.4.3.0

$ cd play_dir
$ ansible-playbook -i hosts site.yml

エラーメッセージに search path が載っているのだけど、この場合は以下から探していた。

play_dir/roles/foo/templates/bar.conf.j2
play_dir/roles/foo/bar.conf.j2
play_dir/roles/foo/tasks/templates/bar.conf.j2
play_dir/roles/foo>/tasks/bar.conf.j2
play_dir/templates/bar.conf.j2
play_dir/bar.conf.j2

なお、Document にのせる提案はされているので、公式化を待つのがよさそう github.com

Kibana 5.X で visualize 結果から elasticsearch query を取得したい

kibana の visualize 機能で集計グラフを作成できたけど、これを Elasticsearch から直接取得したい。 Query に直さなきゃいけないんだけど、さすがに手でやるのは面倒だし…

Visualize 画面下部の矢印を押すと、spy mode になる。

  • Table (検索結果の Table view)
  • Request Body
  • Response Body
  • Statistics (クエリのレスポンスタイムなど)

これらを表示できるので、Request Body を見ればよい。

書き終わった後に気づいたよ!!

出典: github.com

Ruby 2.4 で CGI.unescape が高速化されていた

久しぶりに ruby をいじる機会があったので、備忘的に。

URL encode された文字列を decode したいのだけど、Ruby 2.1 の URI.decode だと遅すぎる!

というのをなんとか解決できないかと調べていました。

ベンチマークコード

似たようなことをやってくれるメソッドが複数あったので、とりあえずベンチとってみる。

require 'benchmark'
require 'uri'
require 'cgi'

encoded = '%7B%22hoge%22%3A%7B%22foo%22%3A%22bar%22%2C%22hoo%22%3A%22baz%22%7D%7D'
# => {"hoge":{"foo":"bar","hoo":"baz"}}

def manytimes
  100000.times { yield } if block_given?
end

Benchmark.bmbm do |bm|
  bm.report("URI.decode") {
    manytimes { URI.decode encoded }
  }
  bm.report("URI.decode_www_form_component") {
    manytimes { URI.decode_www_form_component encoded }
  }
  bm.report("CGI.unescape") {
    manytimes { CGI.unescape encoded }
  }
end
Ruby 2.1
$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-darwin15.0]

$ ruby decode_bench.rb
Rehearsal -----------------------------------------------------------------
URI.decode                      2.360000   0.020000   2.380000 (  2.404751)
URI.decode_www_form_component   1.270000   0.010000   1.280000 (  1.467851)
CGI.unescape                    1.480000   0.020000   1.500000 (  1.578028)
-------------------------------------------------------- total: 5.160000sec

                                    user     system      total        real
URI.decode                      2.570000   0.030000   2.600000 (  2.729236)
URI.decode_www_form_component   1.170000   0.010000   1.180000 (  1.189314)
CGI.unescape                    1.510000   0.010000   1.520000 (  1.577981)

遅いし obsolete だし、URI.decode はやめておいた方がよさそうだ。 singleton method URI.decode (Ruby 2.4.0)

URI.decode_www_form_component を使うのがいいのかな?

Ruby 2.4

試しに Ruby 2.4 でベンチとってみたら、思わぬ結果になった。

$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15]

$ ruby decode_bench.rb
Rehearsal -----------------------------------------------------------------
URI.decode                      2.290000   0.010000   2.300000 (  2.334818)
URI.decode_www_form_component   1.280000   0.020000   1.300000 (  1.330829)
CGI.unescape                    0.120000   0.000000   0.120000 (  0.133207)
-------------------------------------------------------- total: 3.720000sec

                                    user     system      total        real
URI.decode                      2.560000   0.030000   2.590000 (  2.859363)
URI.decode_www_form_component   1.270000   0.010000   1.280000 (  1.329829)
CGI.unescape                    0.120000   0.000000   0.120000 (  0.127875)

CGI.unescape が10倍以上速くなっている。

Ruby 2.4 から CGI モジュールのいくつかのメソッドが C拡張として実装されたらしい。

github.com

escape/unescape, escapeHTML/unescapeHTML 辺りが対象かな?

ruby/escape.c at trunk · ruby/ruby · GitHub

というわけで

URL decode したい時は Ruby 2.4 にして CGI.unescape を使うと速いよ!ということでした。

ある日から今日までの毎週日曜の日付を出したい

ひさびさなのに小ネタ。

たまに使うけど、毎回忘れては調べてるので書いておく。

Python 2.x で使う時は print のところを書き直すとよい。

$ python --version
Python 3.6.0

$ pip list | grep python-dateutil
python-dateutil 2.6.0

$ python sunday_list.py 20161226
20170101 20170108 20170115 20170122 20170129 20170205 20170212 20170219 20170226 20170305 20170312 20170319 20170326 20170402 20170409

Python3.x: Print every Sunday

ssh private key のパスフレーズを変更する

毎回忘れるのでメモ代わりに。ssh-keygen で変更できます

 

$ ssh-keygen -p -f ~/.ssh/id_rsa
Enter old passphrase: 
Key has comment '.ssh/id_rsa' 
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.