2013-06 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2013-06-28 Fri

[別の年の同じ日: 2005 2006 2007 2008 2009 2010 2016

Solaris Internals - Solaris 10 and OpenSolaris Kernel Architecture (2nd Edition) はてぶ

まだ買っていなかったのでポチった。

Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture (2nd Edition) [Kindle版]

2013-06-25 Tue

[別の年の同じ日: 2002 2003 2006 2007 2008 2009 2010 2011

serverspec の Solaris 対応について はてぶ


自分以外に Solaris で serverspec を使いたい人がいるとは思わず、
とりあえず、Oracle Solaris 11 だけを考えて Solaris 対応としてきたけど、
そろそろ Solaris のバージョン違い、
OpenIndiana などのディストリビューションを考えた方がよさげ。

仕事で Solaris 10 な環境もあるし。

Solaris 10 と Oracle Solaris 11 は uname で区別できるとして、
OpenIndiana なんかはどう区別すればいいんだろ。

#jposug のパッケージビルド用に OpenIndiana の環境も作った方がよいし、
環境を作ってみるか。

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--


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-14 Fri

[別の年の同じ日: 2006 2007 2008 2009 2010 2011

左目に鉄の錆が入って傷がついた はてぶ

朝から左目にゴミが入ったような違和感があって、
水ですすいでも違和感がとれないので眼科に行ったところ、
鉄の錆が入っていて、傷がついていたらしい。

2013-06-13 Thu

[別の年の同じ日: 2003 2006 2007 2008 2009 2010

sshd の file descriptor の制限を変更する はてぶ

serverspec が sshd の file descriptor の制限にひっかかった件([2013-06-13-2])の
対応として、sshd の file descriptor の制限を変更する方法を考える。

一番簡単なのは、/lib/svc/method/sshd の start 部分に ulimit を追加する方法。

'start')
        #
        # If host keys don't exist when the service is started, create
        # them; sysidconfig is not run in every situation (such as on
        # the install media).
        #
        create_key $SSHDIR/ssh_host_rsa_key rsa
        create_key $SSHDIR/ssh_host_dsa_key dsa

        ulimit -n 8192
        /usr/lib/ssh/sshd
        ;;


これはお手軽だけど、パッケージの管理下にあるファイルを変更したくない。

@nsloop 先生によると



ということなので、この辺りを調べてみる。

一時的に変更したければ、


contract 経由で PID を調べることで、目的の sshd のプロセスを特定できるのは便利。

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 の制限を変更する

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-06-04 Tue

[別の年の同じ日: 2003 2006 2007 2008 2009 2010

Oracle Solaris に SmartOS のパッケージは流用できなかった はてぶ

- OpenIndianaにSmartOSのパッケージを流用する | Gehirn News(ゲヒルンニュース)
  http://news.gehirn.jp/dev/309/

を見て、流用しようとは思わないけど、
どんなパッケージがあるかは気になったので、
Oracle Solaris 上に pkgin という zone を作成。

手順にしたがって、pkg_admin rebuild を実行したところ、
下記のようなエラーが。

root@pkgin:/# pkg_admin rebuild
ld.so.1: pkg_admin: fatal: libc.so.1: version 'ILLUMOS_0.1' not found (required by file /opt/local/sbin/pkg_admin)
ld.so.1: pkg_admin: fatal: libc.so.1: open failed: No such file or directory
Killed


libc.so.1 が ILLUMOS の物かチェックしているので、
Oracle Solaris では流用できないということに。