読者です 読者をやめる 読者になる 読者になる

成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Chef-solo+knife-solo+Vagrantでサーバ構築を自動化してみる - その4 redis

今回は、githubのcookbookを使って、redisをインストールしてみます。

※環境は前回と同じです。

今回の流れ

  1. Berksfileでgithubのリポジトリを指定する
  2. サーバに適用してみる
  3. forkして修正する
  4. サーバに適用してみる

超シンプル。

Berksfileでgithubのリポジトリを指定する

さて、今回は https://github.com/miah/chef-redis こちらのクックブックを利用させて頂きます。

Berksfile

site :opscode

cookbook 'sudo'
cookbook 'nginx'
cookbook 'redis', git: 'https://github.com/miah/chef-redis.git'

nodes/chef-test.json

{
    "users": [
        { "name": "yagi", "group": "deploy"},
        { "name": "deploy", "group": "deploy"}
    ],
    "authorization": {
        "sudo": {
            "groups": ["vagrant", "deploy"],
            "users": ["vagrant", "deploy", "yagi"],
            "passwordless": true,
            "sudoers_defaults": [
                "env_reset",
                "mail_badpass",
                "secure_path=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\""
            ]
        }
    },
    "nginx":{
        "version": "1.4.1",
        "install_method": "source",
        "source": {
            "version": "1.4.1"
        },
        "port" : 80,
        "worker_processes": 2
    },
    "redis": {
        "install_type": "source",
        "source": {
            "version": "2.6.14"
        },
        "symlink_binaries": true
    },
    "run_list":[
        "recipe[users]",
        "recipe[sudo]",
        "recipe[nginx]",
        "recipe[redis::server]"
    ]
}

今回は、バージョン指定でソースからインストールしたかった為、こんな感じにしてみました。

redis-cliも欲しかったので、"symlink_binaries": trueも入れました。

サーバに適用してみる

では早速、cookしてみます。

$ bundle exec knife solo cook chef-test

サーバにログインして確認してみます。

(いい加減serverspec書きたい、、、)

$ ssh chef-test
$ ps aux | grep redis
redis     7699  0.1  0.0  35124  1908 ?        Ssl  13:22   0:00 /opt/redis/bin/redis-server /etc/redis/server.conf
vagrant   7864  0.0  0.0   8128   664 pts/1    R+   13:23   0:00 grep --color=auto redis

起動はしてるっぽいので、redis-cliからアクセスしてみます。

$ redis-cli
Sorry, command-not-found has crashed! Please file a bug report at:
(省略)

おぉ、、、怒られました。

forkして修正する

https://github.com/miah/chef-redis/blob/master/recipes/server_source.rb#L45

この辺を見ると、/sbin/あたりにsymlinkを貼っているっぽいので、確認します。

$ ll /sbin/redis*
lrwxrwxrwx 1 root root 20 Sep  9 13:21 /sbin/redis-cli -> /opt/redis/redis-cli
lrwxrwxrwx 1 root root 23 Sep  9 13:21 /sbin/redis-server -> /opt/redis/redis-server

赤いので、すぐに分かりますが、一応/optの方も確認。

$ ll /opt/redis/
total 12
drwxr-xr-x 3 redis redis 4096 Sep  9 13:22 ./
drwxr-xr-x 5 root  root  4096 Sep  9 13:21 ../
drwxr-xr-x 2 redis root  4096 Sep  9 13:22 bin/
$ ll /opt/redis/bin/
total 8452
drwxr-xr-x 2 redis root     4096 Sep  9 13:22 ./
drwxr-xr-x 3 redis redis    4096 Sep  9 13:22 ../
-rwxr-xr-x 1 redis root  2224534 Sep  9 13:22 redis-benchmark*
-rwxr-xr-x 1 redis root    30547 Sep  9 13:22 redis-check-aof*
-rwxr-xr-x 1 redis root    63507 Sep  9 13:22 redis-check-dump*
-rwxr-xr-x 1 redis root  2326559 Sep  9 13:22 redis-cli*
-rwxr-xr-x 1 redis root  3986254 Sep  9 13:22 redis-server*

どーやら、/opt/redis/bin/配下にあるっぽい。

なので、リポジトリをforkして直してみます。

https://github.com/yagince/chef-redis/commit/d7ef9d763ade63f6c62817156e1499fc0d083321

直してみました。

サーバに適用してみる

直したので、こっちのリポジトリを見るようにして、再度cookしてみたいと思います。

Berksfile

site :opscode

cookbook 'sudo'
cookbook 'nginx'
cookbook 'redis', git: 'https://github.com/yagince/chef-redis.git'
$ bundle exec knife solo cook chef-test
(省略)
  * link[/sbin/redis-server] action create (up to date)
  * link[/sbin/redis-cli] action create (up to date)
(省略)

ありゃ、up to dateと言われてしまった。。。

とりあえず、symlinkを手動で消して実行しなおしてみます。

$ sudo rm /sbin/redis-*
$ bundle exec knife solo cook chef-test
(省略)
  * link[/sbin/redis-server] action create
    - create symlink at /sbin/redis-server to /opt/redis/redis-server

  * link[/sbin/redis-cli] action create
    - create symlink at /sbin/redis-cli to /opt/redis/redis-cli
(省略)

作成されたっぽい。けど、pathが変わってない???

んー、クックブックがキャッシュされとるのか?

というわけで、updateしてみます。

$ bundle exec berks update
Using sudo (2.1.4)
Using nginx (1.7.0)
Installing redis (2.1.1) from git: 'https://github.com/yagince/chef-redis.git' with branch: 'master' at ref: 'd7ef9d763ade63f6c62817156e1499fc0d083321'
Using build-essential (1.4.0)
Using yum (2.3.0)
Using apt (2.0.0)
Using runit (1.1.6)
Using ohai (1.1.10)
Using stunnel (2.0.4)
Using discovery (0.2.0)

updateされたっぽいので、cookしてみます。

$ bundle exec knife solo cook chef-test
(省略)
  * link[/sbin/redis-server] action create
    - unlink existing file at /sbin/redis-server
    - create symlink at /sbin/redis-server to /opt/redis/bin/redis-server

  * link[/sbin/redis-cli] action create
    - unlink existing file at /sbin/redis-cli
    - create symlink at /sbin/redis-cli to /opt/redis/bin/redis-cli
(省略)

ちゃんとunlinkして、/opt/redis/bin配下にsymlink貼ってるようです。

$ ssh chef-test
$ redis-cli
redis 127.0.0.1:6379> 

ちゃんとアクセスできました。

まとめ

今日はgithubのcookbookを直接見る方法をメモりました。

http://berkshelf.com/

branch: 'hoge'でブランチも指定できるようです。Bundler風。 ※tagもある。

今回までに作った物は https://github.com/yagince/chef-sample こちらに置いてあります。