ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

雑にfabricを使う

fabricをちょっと試してみたメモ。

久しぶりにpythonの環境使うので、どれが正しいのかよく分かってない。 とりあえず anyenv+pyenv+python2.7.10+pyenv-virtualenvの環境で作ってみる。

pyenv インストール

pyenv install 2.7.10
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.anyenv/envs/pyenv/plugins/pyenv-virtualenv
exec $SHELL -l

virtualenvを作る

pyenv virtualenv 2.7.10 fabric

virturalenvの確認

% pyenv versions
* system (set by /home/masasuzu/.anyenv/envs/pyenv/version)
  2.7.10
  2.7.10/envs/fabric
  fabric

% pyenv local fabric
% pyenv versions
  system
  2.7.10
  2.7.10/envs/fabric
* fabric (set by /home/masasuzu/project/fab-ex/.python-version)

モジュールインストール

pip install fabric

実験ファイル作成

cat << ... > fabfile.py
from fabric.api import run, env

env.hosts = ['localhost']

def hello():
    run('echo Hello')

...

軽く動かして見る

% fab hello
[localhost] Executing task 'hello'
[localhost] run: echo Hello
[localhost] out: Hello


Done.
Disconnecting from localhost... done.

参考

コマンドラインでElasticsearchのindexの存在確認をしたい

超雑に。

% curl -i -XHEAD $(date --utc +"http://elasticsearch.myhost/${index_name}-%Y.%m.%d") 
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 04 Nov 2015 07:22:06 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
Connection: keep-alive

fluentdなどでdailyでindexを作ってるという前提のもとに、今日の分のindexがあるかどうかみたいときはこうすると良い。 404が返ってこなければ良い。

※ nginxでリバースプロキシしてる環境です。

変化に柔軟であること

が大事。

理由無く既存の仕組みを後生大事にしがみつくのはばからしい。

現状対して変化の必要がないのであれば、そのままでも問題無いと思うが、変化が必要であると判断したときに俊敏に動けないのは良くない。 既存の枠組みが業務を妨害するようなことになってはいけない。

新しい仕組みを入れる時や既存の仕組みを改造するときは、変更が容易なようにして周囲の変化に柔軟に対応出来るように心がけたい。

終了条件

何かタスクなり作業やるときは、事前にこうある状態と事後にはこうなってあるべき状態をちゃんと把握して作業するんじゃ無いですかね? 手順書通りにやってるだけで、終了条件を把握しないで作業してるとかそういうのプロフェッショナルの仕事じゃ無いと思うます。

という独り言

何かを主張するときの主語の問題

何か主張があるときに主語がWeなのかIなのかで全然状況が変わってきてしまうことがありがちなので、そこは主語を省略してないで欲しい。

  • (私個人が(他の人も同様かもしれませんが))○○で困ってるんです。
  • (私たちみんな)○○で困ってるんです。

言ってることはフレーズは同じでも、括弧の中身が違うだけで意味がだいぶ変わってしまいます。 また、受け取る側もそれを受けてアクションする内容や優先度も変わってくるので、ちゃんと説明出来てると嬉しいなと思いました。

MySQLのエラーコードの意味を知りたい

MySQLのエラーログにこんなエラーが出ていたとします。

150819  10:05:09 [ERROR] Slave I/O: The slave I/O thread stops because a fatal error is encountered when it try to get the value of SERVER_ID variable from master. Error: , Error_code: 1159

エラーメッセージは読めば良いとして、 Error_code: 1159 これの意味が分からない。 そういうときは、ドキュメントを見れば良いという話もありますが、いちいちブラウザ開くのめんどうくさい。

そういうときは perror コマンドを使ってあげるとよいでしょう。

% perror 1159
MySQL error code 1159 (ER_NET_READ_INTERRUPTED): Got timeout reading communication packets

なるほど、接続がtimeoutしたのかというのが分かったりします。 そんな地味な perror コマンドでした。

追記

2年前同じような記事書いてたことを今思い出した。

masasuzu.hatenablog.jp

複数のremoteにgit pushしたい

git remote set-url --add ${remote} して上げれば良い。

# git clone git@github.com:masasuzu/p5-Acme-LoveLive.git
cd p5-Acme-LoveLive
git remote set-url --add origin git@bitbucket.org:masasuzu/p5-acme-lovelive.git
# git push

この例だとgithubとbitbucket両方にpushするようになっているが、githubと社内のgitサーバ両方同期したいときにどうすれば良いのかなーと調べて出てきた一つの答えがこれ。

定期的にcronで同期させるとタイムラグがあるのに対して、こっちだとリアルタイムに同期出来るのが利点かな。ただ、cloneした後にこの設定忘れると、社内のミラーレポジトリが古いままになってしまって非常に面倒くさくなることもあり得るのが注意点ではある。 cronで同期方式とgit push時に同期方式、一長一短ではあるが、さて。

あと思いついた方法としてgithubのwebhook飛ばして、それをhookにしてfetchするとか、jenkinsさんお仕事任せるとかそういう方法もありますね。

Fluentdのfilter_grepの設定で少しはまった。

fluentd 0.12.15 の話です。

結論から言うとFluentdのfilter_grepが、keyの後にスペース1個しか許容してくれません。 なので、下記のようにそろえるために、スペースを余分に入れると、意図しない正規表現になってしまいます。

<filter fluent.info>
  type            grep
  exclude1        message    (?:^out_forest plants new output|adding rewrite_tag_filter rule)
</filter>

正しくはこう。

<filter fluent.info>
  type            grep
  exclude1        message (?:^out_forest plants new output|adding rewrite_tag_filter rule)
</filter>

ソース的にはこのあたりで、スペース一個でsplitしてるので、2個目以降のスペースはregexに含まれてしまうという。

key, regexp = conf["regexp#{i}"].split(/ /, 2)

out_rewrite_tag_filterと同じ感覚で設定すると自分のようにはまるのが請け合いという話でした。

<match static.access.**>
  type              rewrite_tag_filter
  rewriterule1      vhost       (?:hogehoge.jp|fugafuga.jp)     ignore
  rewriterule2      uri         (?:/favicon.ico|/robots.txt)    ignore
  rewriterule3      vhost       (.*)                            static.access.site.$1
</match>

以上です。今日1時間くらいはまってた話でした。

Fluentdのmonitor_agentを動かしたい

設定ファイルにこう書いて再起動するだけ。

<source>
  type monitor_agent
  bind 0.0.0.0
  port 24220
</source>

拡張子jsonを付けるとJSONで結果が返ってくるので、jqと組み合わせるとか、プログラムで処理しても良い。何も付けないとLTSVで結果が返ってくる。

curl --silent localhost:24220/api/plugins.json 

ちなみにもともと自分が、やりたかったことはforwardのキュー溢れしてないかどうかなのでこういう風にしてあげれば良い。

% curl --silent localhost:24220/api/plugins | grep forward | grep plugin_category:output
plugin_id:object:3fb168dda99c   plugin_category:output  type:forward    output_plugin:true      buffer_queue_length:3   buffer_total_queued_size:1447111        retry_count:0
plugin_id:object:3fb16aad87d8   plugin_category:output  type:forward    output_plugin:true      buffer_queue_length:77  buffer_total_queued_size:26217068       retry_count:0
plugin_id:object:3fb168667b9c   plugin_category:output  type:forward    output_plugin:true      buffer_queue_length:27  buffer_total_queued_size:21915109       retry_count:0
plugin_id:object:3fb1687cb9fc   plugin_category:output  type:forward    output_plugin:true      buffer_queue_length:54  buffer_total_queued_size:2465405        retry_count:0
plugin_id:object:3fb168d580a0   plugin_category:output  type:forward    output_plugin:true      buffer_queue_length:13  buffer_total_queued_size:421007 retry_count:0