Glide Note

glidenote's blog

Roadworkerとdirenvを使ってRoute53のDNSレコードを管理する & Roadworker用にVimプラグインとZsh補完関数も作った

TL;DR

  • Route53のDNSレコード管理にはRoadworkerとdirenvを組み合わせて使うと便利
  • Roadworkerを使いやすくするために、VimプラグインとZsh補完関数を作った

(TL;DR使ってみたかった)

経緯

会社でRoute53に移行したチームがあって、レコードの管理にRoadworkerを使ってて、 私もちょっと使ってみたんですが、コマンドラインからの使い勝手と、Routefileの編集が そのままだと不便だったので、使い勝手が良くなるようにdirenv使ったり、 Vimプラグインとzsh補完関数を作ったりした。

Macでの作業を想定してます。

Roadworkerのインストール

1
gem install roadworker

direnvのインストール

direnvはgoで書かれていてbrewコマンドで導入が可能。

1
brew install direnv

~/.zshrcに下記を追記。(もし$EDITORが設定されてない場合はそれも設定する)

1
eval "$(direnv hook zsh)"

Roadworkerとdirenvを組み合わせて使う

Routeworkerを使うときに下記のように

1
2
export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを環境変数を設定しないといけないんですが、 毎回設定するのが面倒なので、これをdirenvにやって貰う。

具体的には、Route53のドメインを管理する(Routefileを管理している)ディレクトリに移動して、 direnv経由で、.envrcを作成する

1
direnv edit .

.envrcの中身は下記のような感じ

1
2
export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'

そうすると、コマンドラインから環境変数を設定しなくても、該当ディレクトリに移動すると そのディレクトリ内だけでdirenvが.envrcを読み込んで環境変数が設定される。

あとは普通にroadworkコマンドでRoute53を操作するだけ。Roadworkerの使い方は下記が詳しいです。

roadworker.vim

RoadworkerからRoute53を操作するのに、Routefileの編集が必要なので、 Routefileの編集が楽になるようにプラグインを書いた。

下記みたいにsyntaxがきいたり、snippetを利用して簡単に編集が出来るようになります。 (左がsyntax無し、右がroadworker.vimによりsyntax有りの状態)

導入方法や使い方はREADME.mdを参照ください。

zsh補完関数

コマンドラインからも便利に使えるようにzsh補完関数を下記みたいなファイルを作成。

$fpathの中に設置すれば、下記みたいな感じで動きます。(時間があるときに体裁整えて zsh-users/zsh-completionsにPR出しておきます!)

Roadworkerを利用すれば、DNSレコードをRoutefileという形でgit管理出来るし、変更点をdry-runで事前チェックも出来る。 またテストコマンドもあるのでCI回したりして、より安全にドメイン操作が出来ると思う。(まだそこまで使いこなせてないけど!)

@deeeetさんがブログに書いてたようにDotenvより direnvの方が他のツールと組み合わせやすくて便利な気がする。

参考

peco/percolでCUIなスニペットツールを作ってみる

以前にSheetというスニペットツールを利用すると大変便利と書いた。

で、障害対応で使うコマンドとかよく忘れるコマンドを大量に登録してて、毎日使ってて重宝してるんですが、スニペットが 増えると管理が破綻する問題があって、pecopercolを使えば解決出来そうと思ってやってみた。

仕組み

  • snippets用のファイル or sheetのスニペットファイルをpeco/percolで絞りこんで、クリップボードに送ったりして簡単に利用できるようにする

よく使うコマンドのスニペットファイルを用意

sheetの資産をそのまま利用も出来るんですが、今回は下記のような感じでファイルを~/.snippetsで用意。私が使ってるやつから一部抜粋。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# apache
tail -n 5000 /usr/local/apache2/logs/access_log | awk '{print $1}'  | sort | uniq -c | sort -gr | head -n 4
tail -n 5000 /usr/local/apache2/logs/access_log | awk '{print $2}'  | sort | uniq -c | sort -gr | head -n 4
tail -n 5000 /usr/local/apache2/logs/access_log | awk '{print $12}' | sort | uniq -c | sort -gr | head -n 4
tail -n 5000 /usr/local/apache2/logs/access_log | awk '{print $13}' | sort | uniq -c | sort -gr | head -n 4

# search
netstat -ltapn | grep ESTABLISHED | more
netstat -ltan | grep ":80 " | awk '{print $5}' | awk -F : '{print $4}' | sort | uniq -c | sort -nr | head
lsof -i:80

# dstat
dstat -Tclmdrn
dstat -Tclm
dstat -Tclr
dstat -Tclnd
dstat -Tcldr
dstat --top-cpu --top-cputime
dstat --top-io --top-bio
dstat --top-io-adv --top-bio-adv

# openssl
openssl x509 -noout -modulus -in *.crt | openssl md5
openssl rsa  -noout -modulus -in *.key | openssl md5
openssl req  -noout -modulus -in *.csr | openssl md5

# find
find ./ -daystart -ctime +2
find ./ -daystart -ctime -2

# date
date +%Y%m%d

peco/percol経由で利用出来るようにする

下記のようなのを、.zshrcに記載するか、peco-snippets.zshとかでファイルを作成してsourceして読み込む

1
2
3
4
5
6
7
8
function peco-snippets() {

    local SNIPPETS=$(grep -v "^#" ~/.snippets | peco --query "$LBUFFER" | pbcopy)
    zle clear-screen
}

zle -N peco-snippets
bindkey '^x^s' peco-snippets

snippetsファイルを用意せずに、sheetの資産を生かすなら、下記みたいな感じ。

1
2
3
4
5
6
7
8
function peco-snippets() {

    local SNIPPETS=$(cat ~/.sheets/* | peco --query "$LBUFFER" | pbcopy)
    zle clear-screen
}

zle -N peco-snippets
bindkey '^x^s' peco-snippets

で上の例だとCtrl+x, Ctrl+sでスニペットの一覧が出てくるのでpecoやpercolで絞ると pbcopyに渡されて、クリップボードに格納される。

Linux上とかでクリップボード使わずに、そのまま利用したい場合は下記みたいな感じ

1
2
3
4
5
6
7
8
function peco-snippets() {

    BUFFER=$(grep -v "^#" ~/.snippets | peco --query "$LBUFFER")
    zle clear-screen
}

zle -N peco-snippets
bindkey '^x^s' peco-snippets

実際に動かして見るとこんな感じ

便利になった!

私がUNIXという考え方にどっぶり浸かっているので、pecoやpercolのパイプで渡して処理させるってのは感覚的に分かりやすくて大変扱いやすい。

vim-quickrunでServerspecをカーソル行単位でテストして編集効率を10倍にする

Serverspecが超高速で書けるserverspec-snippetsを作ったの続き。

超高速でServerspecが書けるようになったので、 今度はvim-quickrunを使って、 Serverspecを書きながらカーソル行だけテストを回せるようにした。

どんな感じかまた動画を用意したので、見ていただくのが早いです。

カーソル行だけテストが実行されるので、全体のテストを実行するより高速になってます。

vim-quickrunでテストを実行すると、出力に色が付かないので下記のようなsyntaxプラグインを作成。 使い方やvim-quickrunの設定例も下記にまとまっているので、参照ください。

g:quickrun_configにおいてcmdoptargsexecを調整すれば いろんな環境に対応が出来ると思います。

参考

Serverspecが超高速で書けるserverspec-snippetsを作った

Serverspec書いてますか!

Serverspecが超高速で書けるようにsnippetsを作成しました。(本当は私がResource Typesを全く覚えられないので作成しただけなんですが)

どんな感じのものなのかは動画を見て頂くのが早いです。

インストール方法や使い方はglidenote/serverspec-snippets を参照ください。

https://github.com/Keithbsmiley/rspec.vim/blob/master/ftdetect/rspec.vim みたい感じで、 filetypeをruby.serverspecへと自動指定は出来るんですが、rspecと干渉するので、ちょっと良い案を思案中。

大変便利になった

追記 2014/06/26

should <=> should_notなどの切り替えは下記のプラグインを使うと簡単にできるのでオススメです。

ソフトウェアの自前ビルド環境をVagrantで管理する

ここ1年くらい自分が担当しているサービスで使ってるNginxとか自前ビルドが必要なソフトは RPMを作らずビルドサーバでビルドしたバイナリをpuppetで管理して、 プロダクション環境にはpuppetやらデプロイツールなりで、バイナリ差し替え配布している。 (epelとかにrpmがあって、それがそのまま使えれば、基本的にそれを使ってるので、 自前ビルドしているパッケージはごく少数です。)

なんでRPMを作らないかは@hirose31さんのブログを読むと分かります!!

バージョンアップ、脆弱性対応、モジュールを追加などのたびにビルドし直さないといけなくて、 普通にやってると結構面倒くさい作業なので、Vagrantを使ってビルドしてる。

具体的にNginxを例に説明すると、下記のような感じのファイルを用意して、vagrant upだけでバイナリが作成される。

上の例だと

/tmp/build/nginx-1.7.1/objs/nginxにバイナリが出来上がるので、 それをpuppetのリポジトリに入れて、puppet各サーバで流して終わり。

アップデートや、モジュールを追加する場合は、provision.shを修正するだけで、 ビルドが終わったらvagrant destroyでビルドサーバを削除。

Vagrantfileprovision.shをgit管理しておけば、ビルド環境もバージョン管理が出来るし、 たいていこういう作業は忘れた頃に発生して毎回過去のissueを探したり面倒くさいので Vagrant使うと大変便利という話。

参考