teketeke_55の日記

技術メモとか

chef-serverに接続できなくなった時の対応メモ

以下のようなメッセージが出てknifeもchef-clientもうまく動作しないことがある。

 ERROR: Connection refused connecting to fedora16:4000 for /clients, retry 5/5
 Failed to authenticate. Ensure that your client key is valid

こういった場合はchef-server落ちている可能性がある。
プロセスを確認して落ちていたら起動する。

 # /etc/init.d/chef-server start
 Starting chef-server (via systemctl):                   [  OK  ]

OKは出るがプロセスが存在しない場合。

couchdbに接続できていない可能性がある。
server.rbのLOGの項目をdebug変更して再度起動スクリプトを実行

 log_level          :debug
 log_location      "/var/log/chef/debug.log"

以下のようなLOGが出力されていたらcouchdbに接続できていない。
プロセスもcouchdbが存在するか確認しておく。

 [2013-01-24T14:30:54+09:00] DEBUG: Sending HTTP Request via GET to localhost:5984/_all_dbs
 [2013-01-24T14:30:54+09:00] ERROR: Connection refused connecting to localhost:5984 for /_all_dbs, retry 1/5

念の為、chef周りもひと通り再起動。

  /etc/init.d/chef-server stop
  /etc/init.d/chef-expander stop
  /etc/init.d/chef-solr stop
  /etc/init.d/couchdb start
  /etc/init.d/chef-solr start
  /etc/init.d/chef-expander start
  /etc/init.d/chef-server start

これで正常に起動できた。
debug.logにも以下のような出力が。

 [2013-01-24T15:01:34+09:00] DEBUG: ---- HTTP Status and Header Data: ----
 [2013-01-24T15:01:34+09:00] DEBUG: HTTP 1.1 200 OK
 [2013-01-24T15:01:34+09:00] DEBUG: content-type: application/json
 [2013-01-24T15:01:34+09:00] DEBUG: date: Thu, 24 Jan 2013 06:01:34 GMT
 [2013-01-24T15:01:34+09:00] DEBUG: server: CouchDB/1.0.2 (Erlang OTP/R14B)
 [2013-01-24T15:01:34+09:00] DEBUG: content-length: 18
 [2013-01-24T15:01:34+09:00] DEBUG: cache-control: must-revalidate
 [2013-01-24T15:01:34+09:00] DEBUG: ---- End HTTP Status/Header Data ----

相変わらずchef-clientで以下のようなエラーが出る場合。

 [Thu, 24 Jan 2013 15:57:42 +0900] INFO: HTTP Request Returned 409 Conflict: Client already exists
 [Thu, 24 Jan 2013 15:57:42 +0900] INFO: HTTP Request Returned 403 Forbidden: You are not allowed to take this action.

knifeコマンドでクライアントを削除してchef-clientを実行する。

  knife client delete 【クライアント名】

またはknifeコマンドでclient 設定をやり直す

 knife counfigure -i
※設定内容適宜入力する


nginx+unicorn+gitlabの組み合わせでgitlabが起動しなくなった際の対応メモ。

AWS EC2 で表題構成のgitlabを運用していたのだが、EBSの初期値を使いきってしまったためDISKの拡張をした。
拡張後サーバを起動したのだがgitlabのWEBUIにアクセスできない。プロセスを見るとunicornが立ち上がっていないようだった。
手動で起動すると以下のメッセージ出力されて起動しない。

 # /etc/init.d/gitlab start
  Starting Gitlab service: master failed to start, check stderr log for details
 unicorn.

nginx側のログを見ると下記の出力が。

 2012/12/27 16:31:55 [error] 7692#0: *2 connect() to unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket failed (111: Connection refused) while connecting to upstream, client: 113.xxx.xxx.xxx, server: 54.xxx.xxx.xxx, request: "GET / HTTP/1.1", upstream: "http://unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket:/", host: "gitlab.xxx.net"

色々調べて見たがよくわからない。
 
psで再びプロセスを確認してみたところredisも起動していないことに気づいた。
起動スクリプトを叩いても起動しない。
redisのLOGを見てみると、

 [1083] 27 Dec 15:52:13 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
 [1083] 27 Dec 15:52:14 # Short read or OOM loading DB. Unrecoverable error, aborting now.

どうやらDISKを使い切った際にredisの何かが壊れたらしい。
 
redisのdumpファイルrenameしてそれぞれを起動したところうまく行った。
(vm.overcommitの設定はOOM killerが起きやすくなりそうなので設定はしなかった)

 mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bk
 /etc/init.d/redis-server start
 Starting redis-server: redis-server.
 /etc/init.d/gitlab start
 Starting Gitlab service: unicorn.

参考文献:
http://rfs.jp/server/aws
https://groups.google.com/forum/?fromgroups=#!topic/redis-db/P7F3jBPu6lM
http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer

amazon S3 のアクセス制御をIAMポリシーで行うメモ

IAMのポリシー作成機能を使用してS3をアクセス制御する

S3だけフルアクセスできる

{
  "Statement": [
    {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "*"
    }
  ]
}

機能を絞る場合

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "*"
    }
  ]
} 

S3の特定のバケットのみフルアクセス(バケットとその中身のリストは表示される)

{
  "Statement": [
    {
      "Action": [
        "s3:ListAllMyBuckets"  #ここがないとmanagement consoleからバケット全体が見えなくなってしまう。
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::【バケット名】","arn:aws:s3:::【バケット名】/【ディレクトリ名】/*"]
    }
  ]
}

※マネジメントコンソールからはバケット自体は見えてしまう。これは仕様らしいのでFireFox Organizerなど別のツールで対応する必要がある。
https://forums.aws.amazon.com/thread.jspa?messageID=328828

S3の特定バケット特定フォルダのみフルアクセス(特定フォルダ以外は見えない)

{
 "Statement": [
   {
#マネジメントコンソールを使用しない場合やバケットの一覧を表示させたくない場合はここの "Effect"は必要ない
     "Effect": "Allow",
     "Action": "s3:ListAllMyBuckets", 
     "Resource": "arn:aws:s3:::*",
   },
   {
     "Effect": "Allow",
     "Action": [
       "s3:ListBucket",
       "s3:ListBucketVersions"
     ],
     "Resource": "arn:aws:s3:::【バケット名】",
     "Condition": {
       "StringLike": {
         "s3:prefix": "【ディレクトリ名】/*"
       }
     }
   },
   {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
   }
 ]
}

IPアドレス制御

{ 
  "Statement": [
    {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "*",
     "Condition": {
         "IpAddress":  {
             "aws:SourceIp": [”【接続元IPアドレス】”]
           }
        }
     }
   ]
}

httpsのみアクセスできるようにする

{
 "Statement": [
  {
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
    "Condition": {
       "Bool":  {
           "aws:SecureTransport": "false"
      }
    }
  }
 ]
}

組み合わせ

"Statement": [
 {
   "Effect": "Allow", 
   "Action": [
     "s3:ListBucket",
     "s3:ListBucketVersions"
   ],
   "Resource": "arn:aws:s3:::【バケット名】", ※取得するバケットを制限
   "Condition": {
     "StringLike": {
       "s3:prefix": "【ディレクトリ名】/*”
     }
   }
 },
 {
   "Effect": "Allow", #接続元IPアドレスによる制御
   "Action": "s3:*",
   "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
   "Condition": {
     "IpAddress":  {
            "aws:SourceIp": ["【接続元IP1】","【接続元IP2】"]
   }
 },
  {
    "Effect": "Deny", #https通信のみ許可
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
    "Condition": {
       "Bool":  {
           "aws:SecureTransport": "false"
      }
    }
  },
    {
    "Effect": "Deny", #ACL周りの操作と、バケットの作成、削除はさせない
    "Action": ["s3:*Acl","s3:CreateBucket","s3:DeleteBucket"],
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
  }
 ]
}

参考文献:
http://docs.amazonwebservices.com/AmazonS3/latest/dev/UsingIAMPolicies.html
http://docs.amazonwebservices.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html
http://www.techtricky.com/amazon-s3-how-to-restrict-user-access-to-specific-folder-or-bucket/

CUIリモートログイン時の出力を日本語対応にする【FreeNAS】

FreeNAS(FreeBSD)の初期設定ではリモートログイン時でも日本語が文字化けしてしまう。

 # ll /mnt/vol01/public/
 total 1084
 drwxrwxrwx  57 root           wheel      80 Oct 27 10:49 ???????????????????????????/
 -rwxrwxrwx   1 root           wheel     298 Apr 11  2012 ???????????????????????????.xls*
 drwxrwxrwx  37 root           wheel      55 Nov 13 13:41 IRClog/

GUI上から操作する場合はそれほど問題ないがsshログイン時などにファイル名が判別出来ず不便なので日本語表示に対応させたい。
WEBを検索すると
http://server-setting.info/freebsd/freebsd_japanease.html
で対応する方法がわかりやすく紹介されているので試してみた。

紹介されているログイン設定ファイルを編集では下記のエラーが出てうまく行かなかったので各シェルの設定ファイルを編集する方法を実施した。

 Nov 13 14:48:01 freenas02 sshd[18875]: login_getclass: unknown class 'japanese'

  • 実行環境:FreeNAS-8.3.0-RELEASE-x64 (r12701M)
rootユーザーの場合は事前にマウントポイントを読み書き可能にしておく
 # mount -uw /
 # mount  ※read-onlyが外れているか確認

 # vi .cshrc
  #以下を追記
 setenv  LC_CTYPE ja_JP.UTF-8
 setenv  LANG     ja_JP.UTF-8

※一般ユーザーの場合は各ホームディレクトリに権限をつけて配布する。
ログインしなおして日本語が表示されているか確認する。

 # ll /mnt/vol01/public/
 total 1084
 drwxrwxrwx  57 root           wheel      80 Oct 27 10:49 初期インストールソフトウェア/
 -rwxrwxrwx   1 root           wheel     298 Apr 11  2012 バックアップ一覧.xls*


うまく見えていたらマウントポイントを読み込み専用に戻しておく

 # mount -ur /

※もしくは再起動
サーバにモニタをつないでコンソール接続してログイン場合は文字化けするので注意。
そのあたりについても先程のリンク先で紹介されている。

nagiosめも(check_log3)

webサーバのアクセスLOGから出力される

" 408 

(ダブルクオートスペース408スペース)
を検知したい。

※この記事は事前にngiosサーバ、nrpeのインストールと設定が完了していることが前提。


nagiosexchangeで検索すると最近更新されたchek_log3というpluginがあったのでこれを使ってみる。
check_log2と比べると検知文字の検出回数指定やnegapatternのファイル読み込みなどができてなかなか高機能ぽい。

http://exchange.nagios.org/directory/Plugins/Log-Files/check_log3-2Epl/details

検知には監視対象機器のnrpe実行ユーザーで以下の権限が必要なので事前に準備しておく。

  • 監視対象のLOGファイルの読み取りできること
  • seekfileが存在しての読み書きできること

当初はnrpe.cfgに下記のように設定して実行してみたが正規表現とスペースがうまく処理できないようでうまく行かない。

command[check_log3]=/usr/local/nagios/libexec/check_log3.pl -l $ARG1$ -s  $ARG2$ -c  $ARG3$  -p $ARG4$

./check_nrpe -H localhost -c check_log3 -a /usr/local/nagios/etc/test.log  /usr/local/nagios/etc/seek.file.test  3 "\"\ 408\ "
CHECK_NRPE: Received 0 bytes from daemon.  Check the remote server logs for error messages.

いろいろ弄った結果、以下の設定でうまく行った。

  • nrpe.cfg(対象機器)
  command[check_log3]=/usr/local/nagios/libexec/check_log3.pl $ARG1$ -c 3 -p "\"\ 408\ "

 

  • service.cfg(監視サーバ)
  check_command                   check_nrpe!check_log3!"-l /var/log/httpd/access.log -s /usr/local/nagios/etc/seek.file"

 
ARGを一つ一つ設定した場合に手動実行ではうまく行くのだがnagiosから実行するとなぜかうまく展開されなかったり、引数の順番を変えるとエラーがでたり内部処理はよくわからないままだが、上記のようにARGを一つにすると引き渡せた。
 (nagiosからnrpeに渡される引数は""で囲まれて渡される?)
 
この設定だと対象機器側で更新が必要なので面倒だ。
nagiosサーバ側だけで完結する方法は無いものか。。。

Active Directoryユーザーログインとhomeディレクトリ作成とuserquotaを連携

Active DirectoryとCIFSの初期設定が完了していることが前提

CIFS共有領域にユーザーがアクセスした時にアクセスしたユーザー名でディレクトリを作成しつつ
ZFSのuserquota機能でユーザーごとの容量制限を行う。
ZFSのuserquotaはZFS バージョン5、zpool バージョン15からサポートされているようだ。

CIFSの準備

「Services」→「CIFS」のスパナアイコンをクリックして設定をする

「Homes auxiliary parameters」に以下の文言を追加する。

root preexec = /mnt/vol01/mkdir.sh %D %U

上記はCIFS共有領域にユーザーがアクセスした時に実行される。
スクリプトは実行権限を付けてFreeNASサーバの任意の場所置いておく。

mkdir.shの中身

 #!/bin/bash

 if [ ! -d /mnt/vol01/personal/$1/$2 ]; then
        mkdir /mnt/vol01/personal/$1/$2
        chmod g+s /mnt/vol01/personal/$1/$2
        chown $2:"domain users" /mnt/vol01/personal/$1/$2
        chmod 750 /mnt/vol01/personal/$1/$2
        zfs set userquota@$2=1g vol01/personal # zfs コマンドでuserquotaを設定
 fi
 exit 0

確認

windowsマシンから共有領域にアクセスすると上記で設定したディレクトリが見えているはず。
サーバにログインしてquota状況も見てみる。

 # zfs userspace vol01/personal
 TYPE        NAME       USED  QUOTA
 POSIX User  root      4.50K   none
 POSIX User  user1      34K     1G

うまく動いていれば先ほどログインしたユーザー名でquotaが設定される。

  • 参考文献

http://damedame.monyo.com/?date=20110220
http://ppona.com/gpl/iodata/usl-5p/USLSRC100/daemon/samba/040924/samba-2.2.11-ja-1.0/docs/ja/htmldocs/using_samba/ch06_06.html
http://docs.oracle.com/cd/E24845_01/html/819-6260/gazvb.html#scrolltoc

freenasでルートパーティションを読み書き可能にする

  • freenasバージョン

FreeNAS-8.3.0-BETA3-x64 (r12317M)

pkg_addやportsでパッケージを追加したかったのだが
freenasのルートパーティションは初期設定でリードオンリーに設定されているため、
ファイルやディレクトリ作成できずインストールできなかった。

 # cat /etc/fstab
 /dev/ufs/FreeNASs2a / ufs ro 1 1

 # mount
 /dev/ufs/FreeNASs1a on / (ufs, local, read-only, soft-updates)

コマンドラインから上記を編集してもシステム起動時に別のファイルを読み込んでファイルを再作成するの再起動すると元に戻ってしまう。
設定を永続的に反映するには以下にあるファイルを修正する。

  /conf/base/etc 

まずはルートパーティションを書き込み可能にする。

 # mount -wu /

起動時に読み込まれるファイルを修正する。

# vi /conf/base/etc/fstab 
 /dev/ufs/FreeNASs2a / ufs rw 1 1 # roをrwへ変更


再起動する。

 # reboot


確認

 # cat /etc/fstab
 /dev/ufs/FreeNASs2a / ufs rw 1 1
 
 # mount
 /dev/ufs/FreeNASs2a on / (ufs, local, soft-updates)
  • 参考文献

http://forums.freenas.org/showthread.php?5468-read-only-usb-filesystem&highlight=fstab