serverspec of selinux
ハマったのでメモ。OSはCentOS6.5
基本的には公式にある通り
describe selinux do
  it { should be_permissive }
end
のように書けば良いはずだが、失敗(当然サーバー側はpermissiveとなっている状態で)
  1) selinux SELinux should be permissive
     On host `vagrant`
     Failure/Error: it { should be_permissive }
       sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config
       env: getenforce: No such file or directory
       expected permissive? to return true, got false
     # ./spec/ftp-centos6/selinux_spec.rb:5:in `block (3 levels) in <top (required)>'
env: getenforce: No such file or directoryが怪しい
どうやら、コマンド的には
$ sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config
が実行されている
直接サーバーでこれを実行してみると…成功
クライアントから実行してみると…やはり失敗
$ ssh vagrant@vagrant 'sudo env PATH=/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config'
env: getenforce: そのようなファイルやディレクトリはありません 
getenforceコマンドのpathは
[vagrant@localhost ~]$ which getenforce
/usr/sbin/getenforce
ん?serverspecではPATH=/sbin:$PATH getenforceとして実行している。pathが違う
pathを正しいものに帰ると…成功
$ ssh vagrant@vagrant 'sudo env PATH=/usr/sbin:$PATH getenforce | grep -i -- permissive && sudo env PATH=/sbin:$PATH grep -i -- ^SELINUX=permissive$ /etc/selinux/config'
Permissive
SELINUX=permissive 
spec_helper .rbにて/usr/sbinへのpathを通してあげれば解決しそう。ここを見て追記
c.path = '/usr/sbin' と追記
解決した
おまけ
CentOS5.2にも同じテストを実行したところ、失敗
サーバーにログインしてみるとそもそもgetenforceコマンドが無かった!
sestatusコマンドならあったので、以下のようにテストを別途作成した
describe command '/usr/sbin/sestatus' do
  it { should return_stdout %r(^SELinux\s+status:\s+permissive$) }
end
というかちゃんとselinux使えやって話も…