CentOS6.5, PHP5.6な環境で、セッションハンドラに"memache"を指定してmemcacheプロトコルでTokyoTyrantと接続すると、セッション機構が動かないというバグ(現象?)に遭遇しました。
(ちなみにPHP5.5だとこの問題はおきません。)

調査解決にほぼ丸一日費やしたすえに、回避方法を見つけたので情報公開しておきます。
(ちなみに根本原因はわかっていません。どなたかわかったら教えてください。)
knife solo cookやchef-soloしたときに、下記のような警告が出ることがあります。
[2014-09-04T01:17:24+09:00] WARN:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
SSL validation of HTTPS requests is disabled. HTTPS connections are still
encrypted, but chef is not able to detect forged replies or man in the middle
attacks.

To fix this issue add an entry like this to your configuration file:

```
  # Verify all HTTPS connections (recommended)
  ssl_verify_mode :verify_peer

  # OR, Verify only connections to chef-server
  verify_api_cert true
```

To check your SSL configuration, or troubleshoot errors, you can use the
`knife ssl check` command like so:

```
  knife ssl check -c /home/chefsolo/chef-solo/solo.rb
```

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

対処法

knife-soloの最新版を使う
knife-soloの場合は最新版を使いましょう。v0.4.2 以上を使う必要があります。
インストール方法は、ChefDKを入れた上でknife-soloを入れるのがオススメです。
簡単!MacOSXやLinuxにChef,Knife,Berkshelfを一発でインストールしてくれるChefDKの紹介
設定ファイルをいじる
knife-soloの場合は .chef/knife.rbを、chef-soloの場合は solo.rbを編集して下記の1行を追記します。
ssl_verify_mode  :verify_peer
これでプロビジョンし直すと、警告が出なくなるはずです。

参考

https://github.com/matschaffer/knife-solo/pull/363

MacOSXでstraceする方法→ dtrussを使う

このエントリーをはてなブックマークに追加
本文なし(すいませんすいません)

[Chef]ChefDKでknife soloを使う方法

このエントリーをはてなブックマークに追加
ChefDKにはknife-soloが同梱されていません。
ChefDKをインストールした後に、knife-soloを追加でインストールするには次のようにします。
chef gem install knife-solo
でこの場合knife-soloがどこに入るのかというと、下記のような場所にインストールされるようです。
${HOME}/.chefdk/gem/ruby/2.1.0/gems/knife-solo-0.4.2
/opt/chefdk の下に配置されるのかと思ってたらそうではありませんでした。
getimagesizefromstring という関数が、PHP5.4から追加されていたので紹介します。
http://php.net/manual/ja/function.getimagesizefromstring.php

getimagesizeにはメモリ上の画像を渡せない

PHPにはもともとgetimagesizeという関数があって、画像ファイルのサイズやメタ情報をお手軽に取得することができました。
list($width, $height, $type, $attr) = getimagesize("/path/to/image.jpg");
ただこの関数には1個残念なところがあって、変数に格納したメモリ上の画像(バイナリ文字列)を引数として渡すことができないのです。
私はよくAmazonS3などから取得したメモリ上の画像を処理することがあるのですが、getimagesizeにそのまま渡せないので残念だなーと思ってました。
その場合は仕方なくImagickを使ったり一度ローカルに保存したりしてました。

getimagesizefromstringならオンメモリで処理できる!

$file = 'http:///example.com/image.jpeg';
$data       = file_get_contents($file);
$size_info = getimagesizefromstring($data);
こんな感じで使えます。
ネットワーク越しに取得した画像を処理したいときに大変便利ですね。
ファイル名を書く代わりに "php://stdout" とか書けばいけます。
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('mychanel');
$handler1 = new StreamHandler('php://stdout', Logger::DEBUG);
$handler2 = new StreamHandler('php://stderr', Logger::DEBUG);

$log->pushHandler($handler1);
$log->pushHandler($handler2);

$log->info("hello world");
実行結果
$ php use-monolog.php
[2014-08-29 03:32:24] mychanel.INFO: hello world [] []
[2014-08-29 03:32:24] mychanel.INFO: hello world [] []
同じものが2行表示されてるように見えますが、1行目が標準出力で2行目が標準エラー出力に吐かれています。

ちなみに、pushHandler()を1度も呼ばなかった場合は暗黙のうちに "new StreamHandler('php://stderr', Logger::DEBUG)"がハンドラとして登録されるようです。
$log = new Logger('mychanel');
$log->debug("hello world"); // 標準エラー出力に吐かれる
この挙動はドキュメントにははっきり書かれていませんがソースコードを見ればよくわかります。
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Logger.php#L229
Vagrant環境ではvagrant provision, 本番サーバではknife solo cook しているみなさんこんにちは。
今日は、Vagrantfileにレシピ名やらattributesやらを書くのはやめましょうという提案です。

vagrant provision(Vagrantfile)の問題点

vagrantでchef-soloを使ってプロビジョンするとき、たいていの人はVagrantfileにレシピ名やらjson情報を書いて、 vagrant up(vagrant provision)すると思います。

[Chef-Solo]猿でもわかるdata_bag入門

このエントリーをはてなブックマークに追加

data_bagとは?何がおいしいの?

Chef-Soloには"data_bag"という仕組みがあって、ノード間をまたがって利用するグローバルな値を管理することができます。
よくあげられるのは、管理対象の各サーバに同じ名前のユーザを作成する例です。
data_bags/users/doraemon.json
data_bags/users/nobita.json
のようなファイルを作ってユーザ情報を記述すると、レシピからそれを参照できます。

data_bagを使ってサーバのIPアドレスを管理する

さてここでは、サーバのIPアドレスを"data_bag"に登録してレシピから呼び出す例を紹介します。
サーバのIPアドレスというのは一見ノードの属性のように思えますが、そうではないのです。
サーバ同士で連携してサービスを提供する場合、同じIPアドレスをあちこちに書くはめになったりします。
例えばdbサーバのiptablesにwebサーバのIPアドレスを書いたりしますよね。
"data_bag"を使えば、このような情報をノードをまたいで一元管理することができます。

Chef-Soloの記事で、よくsolo.rbに絶対パスを書いてる例をひじょ〜〜によく見かけます。
solo.rb
cookbook_path ["/home/hoge/chef-repo/cookbooks"]
しかしこのような書き方はポータビリティがありません。
ディレクトリ名が変わったり、別のサーバで動かそうとすると、この絶対パスをいちいち書き換えなくてはならないからです。

File.expand_path()を使おう

ほとんどの場合、chef-soloコマンドを実行したときのカレントディレクトリに"cookbooks"と"site-cookbooks"が置いてあると思います。
したがってこのように書けます。
solo.rb
base = File.expand_path('..', __FILE__)

cookbook_path [base + '/cookbooks', base + '/site-cookbooks']
PHP5.5(remi-php55レポジトリのやつ)を動かしたらこんなエラーが出ました。
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/imagick.so' - liblcms2.so.2: cannot open shared object file: No such file or directory in Unknown on line 0

解決方法

wget http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
sudo yum install liblcms2-2.4-1.el6.x86_64.rpm
購読する

最近の人気記事

人気記事