2018-05-16 Wed

Serverspec で sudo のかわりに pfexec を使う はてぶ

Solaris 10 な環境に対して Serverspec でテストを行ないたかったので、
以下を spec/spec_helper.rb に書いて、sudo のかわりに pfexec を使うようにしてみた。

module Specinfra
  module Backend
    class Ssh
      def build_command(cmd)
        cmd = super(cmd)
        if sudo?
          cmd = "pfexec #{cmd}"
        end
        cmd
      end
    end
  end
end


テスト対象の Solaris のバージョンによって切替えられるようにした方が便利だけど、
とりあえず、今回の目的は達成できたのでここまでにしておく。

2016-06-21 Tue

Serverspec で INI ファイルをテストする はてぶ

先日、JSON や YAML のファイルをテストする

- its(:content_as_json)
- its(:content_as_yaml)

のPR を送り、INI ファイルも同じようなものが欲しいと思ったので、
とりあえず、以下のような感じで spec_helper.rb に書いてみた。

[ Read More... ]

2015-03-24 Tue

Serverspec で service の property のテストに its(:property) が使えるようになった はてぶ

[2015-03-23-1] の Serverspec で zfs の property に its(:property) が使えるようになったのに続き、
Serverspec 2.12.0 から service の property のテストに its(:property) が使えるようになった。

describe service('apache22') do
  its(:property) { should include( 'httpd/enable_64bit' => 'true', 'httpd/server_type' => 'worker' ) }
end


zfs の方と同じように

- have_property のように property の数だけ svcprop command を叩かなくてよい
  - svcprop -a apache22 のように全ての property を取得して hash に詰めてる
- rspec の hash 用 matcher が使える

といったあたりがメリット。

2015-03-23 Mon

Serverspec で zfs allow のテストをしたい はてぶ

ということで、いろいろと考えている。

まずは、どうテストを書けるといいのかが決まらない。

すでにある Serverspec の resource type を参考にすると、
こんな感じに書けるのがよさそう。

describe zfs('rpool/export/home/foo') do
  it { should be_allowed('create,mount,snapshot').to_user('foo') }
  it { should be_allowed('create,mount,snapshot').to_group('staff') }
  it { should be_allowed_at_create_time('destroy') }
end


または its 形式にして、こんな感じ。

its(:user_permission) { should include('foo' => 'create,mount,snapshot' ) }
its(:group_permission) { should include('staff' => 'create,mount,snapshot' ) }
its(:create_time_permission) { should eq 'destroy' }


'create,mount,snapshot' などの permission 部分を文字列にしてしまうと、

describe zfs('rpool/export/home/foo') do
  it { should_not be_allowed('rollback,hold').to_user('foo') }
end


のようなテストができないし、permission の順番も問題になるので、
配列にした方がいいかもしれない。
完全一致のテストでよければ文字列でよい。

次に、zfs allow の出力の問題。

手元で適当に zfs allow で permission を設定してみた後の zfs allow の出力は以下。

tonaka@x230% zfs allow tank/test20150321/test_01/a
---- Permissions on tank/test20150321/test_01/a ----------------------
Local permissions:
        user tonaka destroy,rollback,snapshot
---- Permissions on tank/test20150321/test_01 ------------------------
Create time permissions:
        rollback
Local permissions:
        user tonaka destroy
Local+Descendent permissions:
        user tonaka snapshot
---- Permissions on tank/test20150321 --------------------------------
Create time permissions:
        destroy,snapshot
Local+Descendent permissions:
        user tonaka create,mount
        group staff create,mount


各 zfs の path に対して何が allow されたかが出力されて、
上からの継承分を含めて何が allow されているかは出力されない。

そのため、ある zfs の path の上からの継承分を含めた allow をテストしたい場合は
parse してごにょごにょして求める必要がある。

ある zfs の path の上からの継承分を含めた allow をテストするのではなく、
ある zfs の path に対して zfs allow が実行されているかをテストするなら、
その path の 'Create time permissions' と 'Local+Descendent permissions' を
確認すればよい。

どっちにするか?って話になると、両方できた方がよいということになってしまうが、
『ある zfs の path に対して zfs allow が実行されているかをテストする』の方が、
テストに失敗した時に何をすればいいのかわかりやすい分よい気がする。

別にまとめた方がいいけど、zfs allow で表示される permission の種類は以下。

- Create time permissions:
  zfs allow -c で許可された permission。
  その zfs の下位の zfs を create すると、この permission がつく。
- Local+Descendent permissions:
  zfs allow で許可された permission。
- Local permissions:
  zfs が create された際に Create time permissions でついた permission

2015-03-23 Mon

Serverspec で zfs の property のテストに its(:property) が使えるようになった はてぶ

pull request が merge されて Serverspec 2.11.0 から
zfs の property のテストが以下のように書けるようになった。

describe zfs('rpool') do
  its(:property) { should include( 'mountpoint' => '/rpool', 'atime' => 'on' ) }
end


この場合、テスト対象の zfs である rpool に対して

zfs get -Hp -o property,value all rpool


を実行して、その結果を { 'property' => 'value' } な hash に詰めるので、

- have_property のように property の数だけ zfs command を叩かなくてよい
- rspec の hash 用 matcher が使える

といったあたりがメリット。

Referrer (Inside):
[2015-03-24-1] Serverspec で service の property のテストに its(:property) が使えるようになった

2015-01-12 Mon

Serverspec 本を読んだ はてぶ

Serverspec 本を著者の宮下さんから頂きました。
ありがとうございます。

O'Reilly Japan - Serverspec
http://www.oreilly.co.jp/books/9784873117096/

@ftnkが投稿した写真 -


[ Read More... ]

2014-11-01 Sat

Serverspec で Encoding::CompatibilityError はてぶ

覚え書き

環境
- OS: Solaris 11.2
- Ruby: 2.1.3
- Serverspec: 2.3.1
- Specinfra: 2.4.1

問題

以下のような match 部分

describe file('hoge.txt') do
  its(:content){ should match(/日本語/) }
end



     Encoding::CompatibilityError:
       incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)


が出る。

回避方法

lib/serverspec/type/file.rb で以下のように @content ではなく @content.force_encoding('UTF-8') を返す。

    def content
      if @content.nil?
        @content = @runner.get_file_content(@name).stdout
      end
      @content.force_encoding('UTF-8')
    end


これだと乱暴なので、
以下のように書けるようにする方向で考えた方がよさげ。

describe file('hoge.txt') do
  its(:content){ should match(/日本語/).with_encoding('UTF-8') }
end


2013-06-25 Tue

Solaris 上の serversepc で be_installed.with_version はてぶ

@netmarkjp さんが
add feature package installed with version
https://github.com/mizzy/serverspec/pull/164
という pull request を投げていて、
0.6.8 で
"Support with_version chain with be_installed matcher without by chain (But currently supported only on Red Hat family)"
と取り込まれたので、Solaris 対応して pull request を送ってみた
(0.6.10 で取り込まれた)。

https://github.com/mizzy/serverspec/pull/166

Solaris の場合、以下のように、いろいろなバージョンがくっついてくるので、
もっと厳格にチェックした方がいい気はしているけど、とりあえず。

% pkg list -H entire
entire (solaris)                                  0.5.11-0.175.1.8.0.4.0     i--
% pkg list -Hv entire
pkg://solaris/[email protected],5.11-0.175.1.8.0.4.0:20130531T203415Z            i--


2013-06-25 Tue

Solaris 上の serverspec で be_reachable はてぶ

あるホストへの到達性をチェックする be_reachable が
Solaris で動かなかったので Solaris 用のコマンドを書いて
pull request を送った(0.6.9 で取り込まれている)。

be_reachable は
- ping によるチェック
- nc によるポートチェック
の 2 種類のチェックを行なえる

describe host('target.example.jp') do
  # ping
  it { should be_reachable }
  # port
  it { should be_reachable.with( :port => 22, :proto => 'tcp' ) }
end


lib/serverspec/commands/base.rb で

      def check_reachable(host, port, proto, timeout)
        if port.nil?
          "ping -n #{escape(host)} -w #{escape(timeout)} -c 2"
        else
          "nc -vvvvz#{escape(proto[0].chr)} #{escape(host)} #{escape(port)} -w #{escape(timeout)}"
        end
      end


Solaris の ping は '-w' がなく、
'-c' は traffic_class の指定で count ではないので動かない。

nc の方は host と port を最後に書かなくてはいけないので、
'-w #{escape(timeout)} が最後にきている上のものでは動かない。

ということで、lib/serverspec/commands/solaris.rb で以下のように定義してみた。

      def check_reachable(host, port, proto, timeout)
        if port.nil?
          "ping -n #{escape(host)} #{escape(timeout)}"
        else
          "nc -vvvvz#{escape(proto[0].chr)} -w #{escape(timeout)} #{escape(host)} #{escape(port)}"
        end
      end


2013-06-13 Thu

serverspec 0.5.6 以降での問題 はてぶ

serverspec 0.5.6 に上げたところ、

- テストの実行が遅い
- SSH のセッションが切れる

ようになった(Solaris 上で実行)。

これは 0.5.6 でテスト毎に check_os が走るようになったことが原因。

check_os は以下のようになっていて、テスト対象の OS が Solaris だと、
1 つのテストにつき check_os で 5 個、テスト自体で 1 個の計 6 個のコマンドが実行される。

そりゃ、遅くなるよねって話です。

      def check_os
        if run_command('ls /etc/redhat-release')[:exit_status] == 0
          'RedHat'
        elsif run_command('ls /etc/system-release')[:exit_status] == 0
          'RedHat' # Amazon Linux
        elsif run_command('ls /etc/debian_version')[:exit_status] == 0
          'Debian'
        elsif run_command('ls /etc/gentoo-release')[:exit_status] == 0
          'Gentoo'
        elsif run_command('uname -s')[:stdout] =~ /SunOS/i
          'Solaris'
        elsif run_command('uname -s')[:stdout] =~ /Darwin/i
          'Darwin'
        else
          'Base'
        end
      end


SSH のセッションが切れる件は、sshd のログを調べたところ、

Disconnecting: pipe failed: Too many open files


と出ていて、check_os がテスト後に実行されることで
sshd の file descriptor を食い潰していたもよう
(Solaris の sshd の file descriptor は 256 しかない。)

対策としては
- check_os の実行をさせない
  - spec_helper.rb の include Serverspec::Helper::DetectOS を
    include Serverspec::Helper::Solaris など特定の OS に置きかえる
  - OS type caching per hosts · Issue #149 · mizzy/serverspec h
    https://github.com/mizzy/serverspec/issues/149
- sshd の file descriptor を増やす

check_os を実行させないようにしても、
テスト自体の数が増えれば file descriptor を使い果たすので、
sshd の file descriptor を増やすことを考えた方がよさそう。

OS type caching per hosts は 0.6.2 で追加された。

- Add OS type caching to Helper::DetectOS by mizzy · Pull Request #151 · mizzy/serverspec
  https://github.com/mizzy/serverspec/pull/151

Referrer (Inside):
[2013-06-13-3] sshd の file descriptor の制限を変更する

2013-06-13 Thu

serverspec で command not found はてぶ

最近 serverspec の更新に追いつくため作業していてぶつかったのが
PATH が通っていなくて command not found になるという症状。

0.4.12 の以下の変更で、絶対 PATH で書かれていたコマンドが相対 PATH に変更されている。

- Change command path to relative by mizzy · Pull Request #129 · mizzy/serverspec h
  https://github.com/mizzy/serverspec/pull/129

さらに、0.4.13 の以下の変更で、spec_helper.rb で PATH を設定できるようになっている。

- Add custom path to the command by mizzy · Pull Request #133 · mizzy/serverspec h
  ttps://github.com/mizzy/serverspec/pull/133

ということで、spec_helpler.rb に

c.path = '/usr/sbin:/sbin'


と書いてみたけど、command not found のまま。

この時、

sudo PATH=/usr/sbin:/sbin:$PATH command


のように展開されるが、どうも PATH=/usr/sbin:/sbin:$PATH が効いていない。

sudo と path でググると、

Defaults env_keep += "PATH"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


を sudoers に書けばよいというのが見つかり、これで PATH が通るようになった。

この設定についてはあとで調べる。

また、上の書き方だと、全てのユーザに対して有効になるので、
以下のようにして特定のユーザに対しての設定にした方がよい
(以下の例ではユーザ fumi に対する設定)。

Defaults:fumi env_keep += "PATH"
Defaults:fumi secure_path = /sbin:/bin:/usr/sbin:/usr/bin


また、この問題に対して 0.5.8 で
"sudo PATH=/usr/sbin:/sbin:$PATH command" の
sudo と PATH の間に env を入れる対策がとられている。

- use 'env' to set PATH by hayato1980 · Pull Request #147 · mizzy/serverspec h
  https://github.com/mizzy/serverspec/pull/147

2013-05-05 Sun

serverspec の対象 OS に関する覚え書き はてぶ

serverspec の対象 OS に関する覚え書きを以下に書いておきました。

https://gist.github.com/ftnk/5518075

- テスト対象の OS が auto detect できない
- テスト対象の OS に対応していない

という人の役に立つといいんですが。

2013-05-01 Wed

serverspec への matcher の追加方法に関する覚書 はてぶ

https://gist.github.com/ftnk/5492542

に晒しておいた。

2013-04-14 Sun

serverspec にいくつかの matcher を merge してもらった はてぶ

serverspec を Solaris に対応([2013-03-25-1])させてから、
いくつかの matcher を書いて merge してもらったのでメモ。

merge してもらったのは以下の 4 つ。
- be_zfs
- have_svcprop / have_svcprops
- have_ipfilter_rule
- have_ipnat_rule

[ Read More... ]

2013-03-25 Mon

serverspec を Solaris に対応させた はてぶ

昨日メモした serverspec [2013-03-24-3] を Solaris に対応させた。

https://github.com/ftnk/serverspec/tree/add-solaris-support

日中に mizzy さんのところ https://github.com/mizzy/serverspec
multi OS 対応が merge されていたので、mizzy さんのところから fork して、
対応させてみた。

とりあえず、以下のような spec を書いて、このあたりが通ることは確認。

pull request をしたことがないので、
ちゃんとした方法かわからないけど、
いちおう、pull request を送っておいた。

(追記)
無事に merge された
https://github.com/mizzy/serverspec/commit/96d4c0f1acf77ce828d920d2cca5ba14524f49ef

Referrer (Inside):
[2013-04-14-1] serverspec にいくつかの matcher を merge してもらった

2013-03-24 Sun

serverspec はてぶ

とりあえず、メモだけ

- Puppet や Chef で構築したサーバを RSpec でテストする - Gosuke Miyashita
  http://mizzy.org/blog/2013/03/23/1/
- 構築済みサーバを RSpec でテストする serverspec という gem をつくった - Gosuke Miyashita
  http://mizzy.org/blog/2013/03/24/3/
- https://github.com/mizzy/serverspec

lib/serverspec/matches/ 以下のファイルを Solaris 用に書き換えれば
Solaris 対応ができる。

すでに debian 対応したフォークがあるので、
これをもとに Solaris にも対応させればよさげ。

https://github.com/ttakamura/serverspec

Referrer (Inside):
[2013-03-25-1] serverspec を Solaris に対応させた
ChangeLog 最新ページ