テストもやってみる

趣旨が変わってきたかもしれないけど、テストもやってみます。

テストを書く

Serverspec でテストするので、test/integration/default/serverspec/ ディレクトリを切っておきます。

ここに hello_spec.rb をつくります。

次にこのテストを実行するように設定します。.kitchen.yml で suites の inspec_test に項目を追加。

こんな感じにしました。で、一度ぶち壊してからテストまでやってみます。ぶち壊すのは destroy、で前にやったようにつくるのが converge。で、テストするのは verify です。

と、エラーが出ました。そういえば、レシピで出力していたのは「Kitchen」でした。ということで、レシピを書き換えます。

もう一度、converge して verify します。

テストが通りました。

レシピを書いて実行する

レシピを書く部分は前と同じなんだろうなと。

レシピを書く

recipes/hello.rb をつくる。やはり、Hello, World でしょう。

実際に動かしたときにレシピはあるけど、それを実行させる必要があるのでランリストをつくります。

これは .kitchen.yml に書いてやります。現状では、suites: の中の namedefault であるものの run_listrecipe[cheftest::default] が設定されています。ということで run_list に追加しますが、さっきのレシピは recipe[cheftest::hello] と表記するみたいです。recipe[::] ということなんでしょうか。ということで追加したファイルはこんな感じです。

動かしてみる

ここで、一連の操作をおこないます。kitchen コマンドに converge サブコマンドを与えて実行です。

ということで、ERROR を吐いているのが気になりますが、ファイルは生成されているようです。

一瞬無いかと思いましたが、ファイルのパス指定の問題です。

ありました。では、recipe/hello.rb を修正してみます。

再度実行してみます。

書き換わっています。さすが Chef だ。

エラーの原因

さて、kitchen converge したときのエラー「ERROR: Error connecting to https://supermarket.chef.io/universe, retry 1/5」ですが、名前が引けていません。
ubuntu 16.04 で DNS masquerade があると名前解決の一発目で失敗することが頻発します。/etc/NetworkManager/NetworkManager.conf を修正します。dns=dnsmasq の行をコメントアウト(#dns=dnsmasq)します。そして、sudo service network-manager restart しておきます。

Test Kitichen を試す

cookbook をつくる

chef コマンドで cookbook をつくります。

こんな感じになります。以下、この cheftest の中で作業。

Test Kitchen の設定

Test Kitchen の設定は .kitchen.yml に書かれているらしい。内容は、

という感じ。

driver
テスト環境のドライバ。vagrant の他に、EC2 とか docker とかあるよう。
provisioner
プロビジョナーとしては、chef-soloansible も使えるみたい。
verifier
Test Kitchen のベリファイステップに使うツールを指定する。Serverspec とかも使えるみたい。
platforms
テストをおこなうプラットホーム。複数定義できるけど今回は ubuntu-16.04 だけにする。
suites
テストスイート。とりあえずこのまま。

最終的に .kitchen.yml はこんな感じに。

とりあえず、ここまでの動作

動かしてみる。

長いけどこんな感じ。Chef 側から Vagrant をコントロールするという感じなんだろうか(まだ理解していない)。vagrant ssh のように ssh で入ることもできる。

/opt/chef に Chef 関連のものが入っているようです。起動しているインスタンスのリストは以下のように確認できた(ホスト側からです)。

次は実際にレシピをつくってみる。

最近の Chef ってどうなっているの?

昔(というほど昔じゃないような気がするけど)、伊藤直也さん(@naoya_ito)の『入門Chef-Solo』という Kindle 本を読んで、ちまちまと開発・テスト環境を Vagrant 上につくっていたんだけど、最近の Chef 環境では動かなくなっていたり、いろいろ面倒な状態になっています。

ちょっと調べてみたら、Chef-Solo は使わないで Chef Provisioning を使えというのがいくつか見つかったので、Deploying a multi-node application to Vagrant using chef-provisioning / Graphs and Chef and Javascript – oh my! とかを読んで、ほぅほぅと思っていたら、The State of Chef Provisioning / NOAH KANTROWITZ には「Chef Provisioning Is Not Deprecated.」だとか書いてあるし。「では、私はどうしたら?」とワケガワカラナイ状態になってしまいました。

ということで、Test Kitchen を調べて、もう一度 Chef をきちんと覚えようかと。

やりたいことは、複数人で共通の開発・テスト環境を使えるようにするということ。ホスト側でコードを書いて、Vagrant のゲスト VM で動作させていくというものです。確認ということで、新しくつくった VMware の Ubuntu 16.04 の上で作業します。vim-nox と簡単なツールを入れるために gdebi を入れておきます(なくても良いけど)。

Chef Development Kit (ChefDK)

なにはなくとも ChefDK は必要なので、これから入れます。

https://downloads.chef.io/chef-dk/ で Chef Development Kit をダウンロードして gdebi でインストール。

みたいな感じで。

VirtualBox

これがないと仮想環境ができない。

https://www.virtualbox.org/wiki/Downloads からダウンロードして gdebi でインストール。

で入る。

Vagrant

Test Kitchen は Vagrant を使うので(なんか自分の使う理由からは本末転倒な書き方)インストールします。

https://www.vagrantup.com/downloads.html からダウンロードして、これも gdebi でインストール。

で入ります。

というわけで、環境は出来上がりました。ファイル名のバージョン番号は適当に読み替えてください。

ESLint 〜 備忘録

ESLint とは

GitHub では、こんな感じに書いてある。

ESLintは、ECMAScript / JavaScriptコードで見つかったパターンを識別して報告するためのツールです。多くの点で、JSLintとJSHintに似ていますが、例外はいくつかあります。

  • ESLintは、JavaScriptの解析にEspreeを使用します。
  • ESLintはASTを使用してコード内のパターンを評価します。
  • ESLintは完全にプラグイン可能であり、すべてのルールがプラグインであり、実行時に追加することができます。

インストールと使い方

npm でインストールする。オススメはローカルにインストールすることだそうな。

プロジェクトなどでいろいろあるだろうから、やはりローカルでしょう。パスが通らないのが悲しいけど。

こんな感じで初期化。

設定

初期化すると .eslintrc というファイルができている。このファイルにこんな感じで設定を書いていく。

これがまた設定を書くのが面倒。適当なのを探すのが吉か?

プラグイン

とりあえず、node.js で使うので、それ用のプラグインを入れてみる。

再度設定

プラグインを読み込ませて("plugins": ["node"])、ES6 を指定して("es6": true)、node.js を指定して("node": true)。

ルールの説明

“node/exports-style”: “error”
module.exportsexports は「混ぜるな危険」です。
"node/exports-style"["error", "module.exports"]["error", "exports"] と使うやつを指定することもできる。
“node/no-deprecated-api”: “error”
node.js の非推奨 API を使うとエラーにする。
“node/no-deprecated-api”: “error”
node.js の非推奨 API を使うとエラーにする。
“node/no-missing-import”: “error”
存在しないファイルの import と export を禁止する。が、ES6 ではファイルの探し方がちゃんと決まっていないので将来的に変更があるよと書いてあった
“node/no-missing-require”: “error”
存在しないファイルに対しての require を禁止する(no-missing-import と似ているが使い分けがまだわからん)。
“node/no-unsupported-features”: “error”
指定した node.js のバージョンでサポートされていない構文の使用を禁止する。node.js のバージョンは package.json で指定してあるやつ("engines": {"node": ">=6.10.0"})。

間違っていたらゴメンなさい。

メールサーバ構築:必要そうなものを入れていく

tmux

ssh が切れたら悲しくなるので。

インストールし終わったら、管理ユーザで tmux に入ってから $ sudo su しておく。

ntp

時刻合わせ。

書き換えたのは以下の通り。NICT を参照している。

# ntpq -p で様子を見たら終わり。

ホスト名の設定

ホスト名を設定する。このあたりはバックアップはいらないと思う。

/etc/hostname の中身は FQDN にしておく。/etc/hosts も同様。

その他

何かあれば追記する。

メールサーバ構築:OS インストールと sshd, ufw の設定

Ubuntu 16.04 でメールサーバをたてる。

Ubuntu 16.04 のインストール

目標としては、Postfix が smtp サーバ、Dovecot で imap と pop を。Postgrey と SpamAssassin でスパム対策。Clam AntiVirus と amavisd-new でウイルス対策。管理は Postfix Admin でできたらいいなぁ。Roundcube で Web メールができたらなお良し。

Ubuntu は普通にインストールした(つもり)。インストール時につくられるユーザは管理ユーザとして使う。

sshd の設定

まず、sshd の設定をおこなう。コンソールから管理ユーザでログイン。でスーパーユーザになり、以降はスーパーユーザでの作業。

ファイルの変更はまずはこれだけ。待ち受けポートを変更する。

で、なんらかのターミナルアプリでつなげる(VPS を使っているので、なるべく早くターミナルアプリで操作したい)。
管理ユーザの authorized_keys に自分の公開鍵を追加する。パスワード認証は禁止。

authorized_keys の変更は以下のような感じ。

ufw の設定

ufw はデフォルト deny の設定にする。開く必要があるポートを考える。

ポート番号 プロトコル 備考
25 Simple Mail Transfer Protocol (SMTP)
80 Hypertext Transfer Protocol (HTTP)
110 Post Office Protocol v3 (POP3)
143 Internet Message Access Protocol (IMAP)
443 Hypertext Transfer Protocol over TLS/SSL (HTTPS)
465 Simple Mail Transfer Protocol over TLS/SSL (SMTPS)
993 Internet Message Access Protocol over TLS/SSL (IMAPS)
995 Post Office Protocol 3 over TLS/SSL (POP3S)
30000 Secure Shell (SSH) ssh のポート番号は変更している。

こんな感じ。とりあえず、設定。

確認したい場合は、# ufw status で。

ツールとか

先に入れておけばよかったツールとか。

画面は、

こんな感じです。

とりあえず、ここまで。

PHP の文字コード

いるんだか要らないんだか不明だけど。

PHP のタイムゾーン

PHP のタイムゾーンの設定。毎度マニュアルを見るのもバカらしいので。

Grunt を入れる(忘れてた)

npm で入れるという部分では、ウソではないんだけど。npm install -g grunt-cli で入ります。v1.2.0 が入りました。

適当なディレクトリをつくって、そこで作業します。

npm init で package.json を生成してちょっと手直し。まずは、

{
“name”: “test”,
“version”: “1.0.0”,
“description”: “for testing”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“author”: “ngn”,
“license”: “MIT”
}

こんな感じから。とりあえず npm install --save-dev grunt して、インストールした library の情報を package.json に吐き出してもらいます。

“devDependencies”: {
“grunt”: “^1.0.1”
}

こんなのが追加される。node_modules ディレクトリができていて、その中に grunt が入っているはずです。