2016年4月22日金曜日

Ansibleでmsg: the python mysqldb module is requiredが出る。

AnsibleでMySQLを利用する場合、MySQLモジュールを使うのですが、msg: the python mysqldb module is requiredというエラーメッセージが出ることがあります。
これは、サーバ側にPythonのMySQLライブラリが無い。ということなんですね。AnsibleはサーバにSSHで接続後、プレイブックにあるタスクを一つ一つ一時的なPythonスクリプトに変換して実行しています。これの動作に必要なんですが、解決法として、pipもしくはyumなどでMySQL-Pythonをインストール。というのがググれば出てきます。

大抵これで解決はするのですが、インストールしたにもかかわらず、msg: the python mysqldb module is requiredが出続ける場合、サーバ上のPythonのバージョンを確認してください。

実はOSによっては、Pythonのバージョンによって、MySQL-Python27のようにパッケージ名が異なるものがあります。

デフォルトでインストールされるライブラリがPythonのバージョンに依存していないか確認しましょう。

2016年4月21日木曜日

Ansibleで"No authentication methods available"がでてつながらない

Ansibleで"No authentication methods available"が出て何故かSSHにつながらず、ずいぶん嵌ったのでメモ。

Ansibleで、Hostsファイル(インベントリファイル)にSSH接続情報を設定して、その内容に間違いがないにもかかわらず、何故かSSHで接続できないとき。

ググると、SSHキーのパーミッションがどうとか出てくるのですが、SSHコマンドでは無事接続できる。

で、原因はこちら。

[target_server]
127.0.0.1 anshible_port=2222 anshible_ssh_user=vagrant anshible_ssh_pass=vagrant

お分かりいただけただろうか。正解はansibleです。

これ、焦っているときは本気で気づかないのでたちが悪いです。

2016年4月20日水曜日

Rubyでハッシュキーにシンボルを使った場合、代入式を短縮できる。

Chefのレシピをメンテしていて、Rubyのよく分からないものの一つにシンボルがあります。

で、これ、ハッシュ配列と組み合わせると、初心者にはよくわからないものになります。

a = { :A => "a", :B => "b"}

これは、シンボル:Aにaを代入しています。これはまぁOK。

a = { A: "a", B: "b"}

=>が消えまして、そのかわり前にあったコロンが後ろにつきます。
これは、=>を短縮したものなんですが、前にコロンが付くものがシンボルと思っていると訳が分からなくなります。

これの値を取り出すのは、 a[:A]になります。

ハッシュ配列に似たもの?として、構造体があります。
構造体はC言語の授業でならった人も多いと思います。

a = Struct.new(:ID,:Name)
rec = a.new(123,"taro")
pp rec.ID
みたいな感じで使います。
組み合わせて、ハッシュ配列に構造体を入れたり、配列を入れたりできます。
個人的には、a.bみたいな感じで値を取り出せる構造体が好みなんですが、Ruby的にはハッシュ配列が良いようですね。いろんなコード見ていますと。
(まぁ構造体だとメソッドとパッと見区別がつきにくい。てのがあるのかも)

最後に、Chefのレシピをメンテしていて、

a = {a: "a",b: "b}"
pp a.fetch(:a)

のようなコードを見て、なんでa[:a]じゃないんだろ?と疑問に思い調べてみました。
[]の場合、キーが存在しない場合、nilが帰ってきて、例外になりませんが、fetchの場合、key not found例外が発生します。
きちんと例外処理をしたい個所では使い分けないとなと思います。

参考:Rubyのややこしい配列とハッシュとシンボルについて整理してみた



2016年4月6日水曜日

JenkinsでProxy Errorが出る場合の対処方法

Jenkins+Apacheで動かしているとき、時々Proxy Errorが出ることがあります。

これ、時々ってのが厄介で、大抵はリロードすれば直ります。
今回、これの原因ぽいのが判明したのでメモっておきます。

Proxy Errorが出る環境は、Jenkins+Apacheでmod_proxyを使っている場合に出ますが、
どうやら、httpsにリダイレクトさせている環境で発生するようです。

というわけで、同様の事例がないか調べてみました。

どうやら、Apacheはhttpsなのに、レスポンスヘッダがhttpなのがいけないらしい。参考
なお、レスポンスヘッダの見方は以下の通り。

curl -ik https://foobar.example.com/jenkins
原因がわかれば対処ができます。参考サイトを参考に
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"

を追記してあげると無事直りました。

*Nginxの場合は以下のような感じ。(http->httpの例)
(--prefix=/jenkinsを付けているからと、
proxy_redirect http://localhost:8080/jenkins
なんてやるとダメだったので、バックエンドには付けないほうが良いみたい。)

location ^~ /jenkins {
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_redirect http://localhost:8080 $scheme://$host;
# Optionally, require HTTP basic auth.
# auth_basic "Please authenticate to use Jenkins";
# auth_basic_user_file /opt/nginx/htpasswd;
}