デーモン化してるHubotが何故か勝手に落ちてしまう。

Slackと連携させているHubotが何故か勝手に落ちてしまうので、調べてみたのでメモ。

どういうこと?

VPS上にHubotを設置して、Slackと連携させて遊んでました。 デーモン化にはforeverを使っていました。

github.com

毎日定期的につぶやいたり、backlogの変更をSlackに通知してくれたり、便利に使っていたのですが、ある日をさかいに勝手に落ちてしまうようになりました。

最初は普通に再起動していたのですが、頻繁に再現するので、調べてみました。

foreverのログを見てみる

$ forever logs
info:    Logs for running Forever processes
data:        script                  logfile
data:    [0] node_modules/.bin/hubot /home/www/.forever/YABZ.log

$ cat /home/www/.forever/YABZ.log

[Wed Oct 19 2016 11:19:00 GMT+0900 (JST)] ERROR TypeError: Cannot read property 'name' of undefined
  at Request.callback (/home/www/hubot/node_modules/superagent/lib/node/index.js:619:12)
  at /home/www/hubot/node_modules/superagent/lib/node/index.js:795:18
  at IncomingMessage.<anonymous> (/home/www/hubot/node_modules/superagent/lib/node/parsers/json.js:16:7)
  at emitNone (events.js:72:20)
  at IncomingMessage.emit (events.js:166:7)
  at endReadableNT (_stream_readable.js:921:12)
  at nextTickCallbackWith2Args (node.js:442:9)
  at process._tickCallback (node.js:356:17)

error: Forever detected script was killed by signal: SIGKILL

killされちゃってるみたいですね。。。

ググッてみる

ググッてみると同じような症状の人がいるみたい。

error: Forever detected script was killed by signal: SIGKILL - Google 検索

んで、見ていくと、以下のStack Overflowが見つかりました。

stackoverflow.com

なんでも .foreverignore を作れば治るよ。ということなので、早速作ってみた。

$ cd /home/hubot/

$ ls -al 
drwxrwxr-x   5 www www 4096 10月 24 11:01 2016 .
drwx------   8 www www 4096 10月 24 11:58 2016 ..
-rw-r--r--   1 www www   39  5月 20 06:45 2016 .gitignore
-rw-rw-r--   1 www www   11  9月  2 12:21 2016 .hubot_history
-rw-r--r--   1 www www   24  9月  2 12:16 2016 Procfile
-rw-r--r--   1 www www 7820  9月  2 12:16 2016 README.md
drwxrwxr-x   2 www www 4096  9月 23 18:24 2016 bin
-rw-rw-r--   1 www www  186  9月 21 18:05 2016 external-scripts.json
drwxrwxr-x 190 www www 4096 10月 24 11:45 2016 node_modules
-rw-rw-r--   1 www www  677  9月 25 21:37 2016 package.json
drwxrwxr-x   2 www www 4096 10月 24 11:58 2016 scripts

$ touch .foreverignore

$ ls -al
drwxrwxr-x   5 www www 4096 10月 24 11:01 2016 .
drwx------   8 www www 4096 10月 24 11:58 2016 ..
-rw-rw-r--   1 www www    0 10月 24 11:01 2016 .foreverignore <= 追加されてる
-rw-r--r--   1 www www   39  5月 20 06:45 2016 .gitignore
-rw-rw-r--   1 www www   11  9月  2 12:21 2016 .hubot_history
-rw-r--r--   1 www www   24  9月  2 12:16 2016 Procfile
-rw-r--r--   1 www www 7820  9月  2 12:16 2016 README.md
drwxrwxr-x   2 www www 4096  9月 23 18:24 2016 bin
-rw-rw-r--   1 www www  186  9月 21 18:05 2016 external-scripts.json
drwxrwxr-x 190 www www 4096 10月 24 11:45 2016 node_modules
-rw-rw-r--   1 www www  677  9月 25 21:37 2016 package.json
drwxrwxr-x   2 www www 4096 10月 24 11:58 2016 scripts

まだ追加して1日だけど、logで吐いてたエラーも出てないようだし、うまくいってるっぽい。
これでうまくいくといいけどなぁ。。

鍵認証で入れていたSSHが、ある日は入れなくなったとき

鍵認証で入っていたVPSに入れなくなって、さんざん悩んで解決したのでメモ。

どういうこと?

VPSを借りて、ログインには鍵認証を使ってパスワード入力なしで入っていました。 2~3日ぶりにサーバーにログインしようとしたら、パスワード入力のモーダルが出てきました。 変だなと思ったけど、しょうがないからパスワードを入れても、再度ターミナルからパスワード入力をしないと入れない。ってなことがあった。(伝わるかな?)

やったこと

ssh-agentの確認

ssh-agentに情報を登録しなおしたら入れるよ」というのをどっかで見たので、やってみた。

$ ssh-add -K {鍵の場所}

$ ssh-add -l 
2048 {鍵情報} (RSA) <= 登録されてる

$ ssh {ユーザー}@{URL}
 {ユーザー}@{URL}'s password: <= だめ・・・

入れない・・・

パーミッション変更

パーミッションが正しくないと入れないよ」と言われたので、やってみた。

# ローカル
$ cd .ssh

$ ls -l
-rw-------  1 {ユーザー}  staff   1.7K  8 26 18:35 id_rsa
-rw-------  1 {ユーザー}   staff   415B  8 26 18:35 id_rsa.pub

うーん、大丈夫っぽい。

# サーバー
$ cd .ssh

$ ls -l
-rw-------. 1 {ユーザー} {ユーザー} 383  9月  5 11:04 authorized_keys

うーん、大丈夫そう・・・。

結局

サーバーの鍵を削除して、ローカルの鍵を登録しなおしました。

# サーバー
$ cd .ssh

$ vi authorized_keys
該当する記述を削除

これでサーバはOK

# ローカル
$ cd .ssh

$ ssh-copy-id -i id_rsa.pub {ユーザー}@{URL}
/usr/local/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
/usr/local/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/local/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
{ユーザー}@{URL}'s password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh '{ユーザー}@{URL}'"
and check to make sure that only the key(s) you wanted were added.

# 入ってみる
$ ssh {ユーザー}@{URL}
[{ユーザー}@{URL} ~]$ <= 入れた!!!

こんなに簡単に入れるなら最初からこうしておけばよかった。。。

残念な時間の使い方をしました。。。

VPSにwordpressを入れたらCentOSのスタート画面しか出てこない時ーー

サーバー移転の際、Wordpressを移したのですが、ドメインを叩いてもCent0Sのスタート画面しか出てこなくて涙が出たので、解決したメモ。

どんなエラーが出るの?

サーバーにSSHで接続してエラーログを見ると、以下のように出る。

Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive is also forbidden due to its similar ability to circumvent directory restrictions

どういうことだ???

ググッてみる

ググッてみると同じようなことで解決している記事があったので、そのとおりにやってみる。

そうだ。ブログを書こう! : Options

なんでも、mod_rewriteを使うディレクトリでは「Options FollowSymLinks」が必要だということらしい。

修正してみよう

.htaccess を修正。

# BEGIN WordPress
<IfModule mod_rewrite.c>
Options FollowSymLinks <= ここを追加
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

ここまでやって再度、ページにアクセスすると、今度は問題なくつながった!

.htaccessの仕組みをもうちょっとわからないといけないなぁ。と思った一日でした。

Gulp のインストールでエラーが出た

Gulpを使って開発をしようとしたら、 $ npm install gulp --save-dev でエラーがでたので、メモ。

どういうこと?

ローカルでGulpを使って開発をしようとしました。 Gulpを使うのが久しぶりだったので、以下の記事を参考にGulpを設定しようとしました。

liginc.co.jp

$ npm init $ npm install gulp -gまでは問題なく出来ましたが、$ npm install gulp --save-devでエラーを吐いて進まなくなりました。

$ pwd 
/Volumes/MacintochHD/Documents/

$ mkdir gulp

$ cd gulp

$ npm init 
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (gulp)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Volumes/MacintochHD/Documents/gulp/package.json:

{
  "name": "gulp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

$ npm install gulp -g

$ npm install gulp --save-dev
npm ERR! Darwin 14.5.0
npm ERR! argv "/usr/local/Cellar/node/6.7.0/bin/node" "/usr/local/bin/npm" "install" "gulp" "--save-dev"
npm ERR! node v6.7.0
npm ERR! npm  v3.10.8
npm ERR! code ENOSELF

npm ERR! Refusing to install gulp as a dependency of itself
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Volumes/MacintochHD/Documents/gulp/npm-debug.log

うーん、どういうことだろう?

原因はpackage.jsonのnameでした。

どうやら、開発用に用意したディレクトリ名が"gulp"だったのが問題らしい。

package.jsonのnameはデフォルトでディレクトリ名を取るらしく、それがgulpだとエラーになるらしい。

なので、package.jsonを修正する。

{
  "name": "gulptest", <= gulpから変更
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "gulp": "^3.9.1"
  }
}

この状態で再度 $ npm install gulp --save-dev を実行すると、問題なくインストールできました。

以前、hubotでも同じエラーがあったなぁ。npmだとpackage名と同じ名前をpackage.jsonのnameに指定するとエラーになるみたい。 あとでもうちょっと調べてみよう。

"vagrant up" しようとしたら "version of VirtualBox installed that is not supported" と言われた

Ansibleを試してみようと思い、以下の記事を参考にvagrantで試してみようとした。

qiita.com

boxを用意して、'$ vagrant up' してみました。

$ vagrant up

The provider 'virtualbox' that was requested to back the machine
'controller' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

4.0, 4.1, 4.2, 4.3

どうやら、virtual boxのバージョンが違うから合わせてくれといっているようだ。

なので、virtual boxのバージョンを上げてみた。 virtual boxは Homebrewで入れているので、ターミナルからおもむろに $ brew cask install virtualbox としてバージョンをあげてみるがやはり変わらない。

そこで、vagrantの方のバージョンをあげてみる。

$ brew cask install vagrant
==> Downloading https://releases.hashicorp.com/vagrant/1.8.6/vagrant_1.8.6.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask vagrant
==> Running installer for vagrant; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
==> installer: Package name is Vagrant
==> installer: Upgrading at base path /
==> installer: The upgrade was successful.
🍺  vagrant was successfully installed!

ここまでやって、ようやくvagrantが立ち上がりました。 さっ、ansibleの勉強しよーっと。

Macで日本語入力ができなくなったけど解決した話

Macで作業中、突然日本語入力ができなくなってしまうことがあり、一応の解決策が見つかったのでメモ。

どういうこと?

Macでアプリを切り替えて作業をしていると、突然日本語入力が出来なくなる。 ちなみに、Google日本語入力を使っています。

  • 「英数」「かな」キーを押してみても反応なし。(もしくは、一瞬右上の言語メニューが切り替わるけど、すぐに戻ってしまう。)
  • 右上の言語メニューから「ひらがな」を選択しても変化なし。

コード書いてる時ならそこまで困らないが、チャットなどしてる時だと、もう大変。 「nihonngoutenakunarimasita」みたいになってしまう。。

どうやって解決したの?

普段、クリップボード拡張で、Clipyを使っています。 思い返してみると、日本語が入力できなくなった辺りからClipyが反応しなくなってしまった。

これはもしやと思って、Clipyを落としてみた。

/Applications/Utilities/アクティビティモニタ を開き、「Clipy」を探し、"×"アイコンをクリック。

Cipyが落ちたので、日本語入力をやってみると・・・できた!!!!

他のアプリが影響したりしてることもあるけど、今回はこれでうまくいきました。 よかったよかった。。。

Ansibleを使おう

TOC

  • 構成管理ツールとは?
    • Ansibleとは?

構成管理ツールとは?

サーバーを作成した時など、マニュアル的に実行している処理、手順があると思います。

例えば・・・ - ユーザーを作って - apache入れて - sshの設定して - ディレクトリ作って などなど。

マニュアルを見ながら進めていけば、1度や2度なら問題は起こらないかもしれませんが、それが10回20回・・・となった場合、毎回同じような結果になるといえるでしょうか? (マニュアルをブラッシュアップしろよというツッコミはここでは無視)

そういうときは構成管理ツールを使いましょう。 構成管理ツールを使うと以下のことができるようになります。

  • セットアップの自動化(構成管理)
  • デプロイメント
  • これらの手順を共有できる などなど。

面倒な作業を自動化できるだけでなく、手順をコード化することができます。 しかもそれをチーム内で共有すれば、誰が何度やっても同じ結果が返ってくるようになります。

Ansibleとは?

構成管理ツールには代表的な物がいくつかあります。

  • Puppet
  • Chef
  • Ansible
  • Rex

この中で最近人気のある Ansible を使っています。

Ansible

Ansibleには主に以下の特徴があります。 - エージェントレス - 豊富なモジュール - 冪等性 - シンプルな記述

エージェントレス

  • サーバー側に特別なインストール不要
  • ローカルにpython2.4+,サーバーにpython2.6+がインストールサれていれば動く

サーバーに勝手にいろいろインストールできないという場合でも、pythonさえあれば動作します。

豊富なモジュール

以下に一例を挙げます。 - yum - git - ファイルのダウンロード - slackに通知を送る などなど。 All Modules — Ansible Documentation

標準でできることが多いので、YAML形式で設定を書いていけばいろいろな機能を使うことができます。

冪等性

Ansibleの特徴に冪等性(べきとうせい)があります。 冪等性とは「ある操作を何度行っても、毎度同じ結果が返ってくる」ということです。

すでに実行したことがある処理を再度実行した場合でも、実行し直すのではなく、状態を見て、適宜スキップしてくれます。

シンプルな記述

Ansibleの設定ファイルは一般的なYAML形式で書かれており、非常にシンプルです。

  - name: apacheのインストール 
    apt: pkg=apache2 state=latest 

  - name: MySQLのインストール 
    apt: pkg=mysql-server-5.6 state=present

このように非常にシンプル。

Ansibleを使えば、サーバーの構築はもちろん、Macの環境構築、CMSのセットアップなど多くのことを自動化出来ます。

今回はざっくりとした概要だけで、具体的な使い方は別の記事で紹介したいと思います。