2013年5月15日水曜日

(とりあえず)Chef(Solo)やってみた

スズキです。

そろそろ、ある程度は理解しておかないと置いていかれそうなので...

ダウンロードは下記(本家)から可能です。ここではRHEL6(CentOS6)用を
使っていますが、いろいろなプラットホーム毎に用意されています。
Install Chef

インストール

# curl -L https://www.opscode.com/chef/install.sh | bash
...
Downloading Chef  for el...
...
Installing Chef 
警告: /tmp/tmp.wlXWdFaE/chef-.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中...                ################################# [100%]
   1:chef                   ################################# [100%]
Thank you for installing Chef!

Gitリポジトリの作成

# mkdir -p /var/chef/cookbooks
# cd /var/chef/cookbooks
# git init
Initialized empty Git repository in /var/chef/cookbooks/.git/

JSONファイルの用意

# cat localhost.json
{
    "run_list": [
        "apache2"
    ]
}
下記の"apache2"の"cookbook"を利用する想定です。
Opscode Community

コミット

# git add .
# git commit -m init
...
 create mode 100644 localhost.json
※"/var/chef/cookbooks"はGitリポジトリにしてコミットまでしてないと
下記がうまく行きませんでした...

"cookbook"のダウンロード?

# knife cookbook site vendor apache2
WARNING: No knife configuration file found
Installing apache2 to /var/chef/cookbooks
Checking out the master branch.
Creating pristine copy branch chef-vendor-apache2
Downloading apache2 from the cookbooks site at version 1.6.2 to /var/chef/cookbooks/apache2.tar.gz
Cookbook saved: /var/chef/cookbooks/apache2.tar.gz
Removing pre-existing version.
Uncompressing apache2 version 1.6.2.
removing downloaded tarball
1 files updated, committing changes
Creating tag cookbook-site-imported-apache2-1.6.2
Checking out the master branch.
Updating ec540d0..2dc8dcb
Fast-forward
...
 111 files changed, 5491 insertions(+), 0 deletions(-)
...
Cookbook apache2 version 1.6.2 successfully installed
上記の"Opscode Community"からダウンロード?しています。

適用?

# chef-solo -j localhost.json
...
上記で作成したJSONファイルを指定しています。

確認

# ps aux | grep http
root   2103 0.0 0.4 73352 2508 ? Ss 11:08 0:00 /usr/sbin/httpd
apache 2106 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2107 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2108 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2109 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2110 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2111 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2112 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2113 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2114 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2115 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2116 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2117 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2118 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2119 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2120 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
apache 2121 0.0 0.3 73352 1924 ? S  11:08 0:00 /usr/sbin/httpd
ちゃんと"httpd"まで立ち上がってました!

言葉(用語)の使い方に、まだ自身が持てない...
--------
http://www.suz-lab.com

2013年5月14日火曜日

EC2の価格のJSONを"jq"でいじってみた

スズキです。

@ar1さんが下記記事(EC2およびS3の価格がJSONで取得できる)を公開してくれました。
EC2およびS3の価格をプログラマブルで計算したい人はJSONをたたこう
JSONとくれば「jq」でしょ、ということで"jq"で色々と整形してみました。

まずはリージョン一覧です。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[].region '
"us-east"
"us-west-2"
"us-west"
"eu-ireland"
"apac-sin"
"apac-tokyo"
"apac-syd"
"sa-east-1"
何か微妙に期待していた値と違うような...

次にインスタンスタイプです。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "sa-east-1").instanceTypes[].type '
"stdODI"
"secgenstdODI"
"uODI"
"hiMemODI"
"hiCPUODI"
インスタンスタイプといっても、"m1, m2, m3, c1, ..."の部分ですね...

さらに、"small, large, ..."の部分まで出力してみます。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[].size ] }'
{
  "stdODI": [
    "sm",
    "med",
    "lg",
    "xl"
  ]
}
{
  "secgenstdODI": [
    "xl",
    "xxl"
  ]
}
{
  "uODI": [
    "u"
  ]
}
{
  "hiMemODI": [
    "xl",
    "xxl",
    "xxxxl"
  ]
}
{
  "hiCPUODI": [
    "med",
    "xl"
  ]
}
マイクロって"u"なんですね...(最初よくわからなかった...)

最後にLinuxの金額まで出力してみます。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json \
> | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[] | { (.size): .valueColumns[] | select(.name == "linux").prices.USD } ] } '
{
  "stdODI": [
    {
      "sm": "0.088"
    },
    {
      "med": "0.175"
    },
    {
      "lg": "0.350"
    },
    {
      "xl": "0.700"
    }
  ]
}
{
  "secgenstdODI": [
    {
      "xl": "0.760"
    },
    {
      "xxl": "1.520"
    }
  ]
}
{
  "uODI": [
    {
      "u": "0.027"
    }
  ]
}
{
  "hiMemODI": [
    {
      "xl": "0.505"
    },
    {
      "xxl": "1.010"
    },
    {
      "xxxxl": "2.020"
    }
  ]
}
{
  "hiCPUODI": [
    {
      "med": "0.185"
    },
    {
      "xl": "0.740"
    }
  ]
}
「24時間 x 30日 x 100円(1$)」して一ヶ月分の金額にもしてみました。
# curl -s http://aws.amazon.com/jp/ec2/pricing/pricing-on-demand-instances.json | jq ' .config.regions[] | select(.region == "apac-tokyo").instanceTypes[] | { (.type): [ .sizes[] | { (.size): .valueColumns[] | select(.name == "linux").prices.USD | ( tonumber * 24 * 30 * 100 ) } ] } '
{
  "stdODI": [
    {
      "sm": 6336
    },
    {
      "med": 12599.999999999996
    },
    {
      "lg": 25199.999999999993
    },
    {
      "xl": 50399.999999999985
    }
  ]
}
{
  "secgenstdODI": [
    {
      "xl": 54720.00000000001
    },
    {
      "xxl": 109440.00000000001
    }
  ]
}
{
  "uODI": [
    {
      "u": 1944.0000000000002
    }
  ]
}
{
  "hiMemODI": [
    {
      "xl": 36360
    },
    {
      "xxl": 72720
    },
    {
      "xxxxl": 145440
    }
  ]
}
{
  "hiCPUODI": [
    {
      "med": 13319.999999999998
    },
    {
      "xl": 53279.99999999999
    }
  ]
}
小数点がうざい...

まあ、"jq"の練習です...
--------
http://www.suz-lab.com

2013年5月13日月曜日

Nagios(プラグイン)でDNSラウンドロビンの各IPアドレスに対する(HTTP)監視

スズキです。

プラグインは下記の通りです。
# cat check_dns_roundrobin
#!/bin/sh

. `dirname $0`/utils.sh
PLUGIN=/usr/lib64/nagios/plugins/check_http

while getopts :H:I: OPT; do
    case $OPT in
        H) DNSNAME=$OPTARG;;
        I) DNSNAME=$OPTARG;;
        *) ;;
    esac
done

IP_LIST=`dig +noall +answer $DNSNAME \
| awk '{ print $5 }'`

if [ "$IP_LIST" = "" ]; then
    echo "Can't resolve \"$DNSNAME\"."
    exit $STATE_CRITICAL
fi

for IP in $IP_LIST; do
    OPTIONS=`echo $@ | sed s/$DNSNAME/$IP/g`
    OUTPUT=`$PLUGIN $OPTIONS`
    STATUS=$?
    if [ $STATUS -ne $STATE_OK ]; then
        echo "$IP $OUTPUT"
        exit $STATUS
    fi
done

OUTPUT=`echo $IP_LIST | sed "s/\n/ /g"`
echo "OK $OUTPUT"
exit $STATUS

仕様は次の通りです。
  • オプションは"check_http"と同じ。
  • 一つでも結果がOK以外のIPアドレスがあったら、その時点で終了。
  • プラグインは"utils.sh"が存在するディレクトリに配置

実行すると次のようになります。
失敗(チェックに失敗するIPアドレスが存在)
# ./check_dns_roundrobin -H test.suz-lab.com
192.168.1.1 CRITICAL - Socket timeout after 10 seconds
成功(すべてのIPアドレスがチェック成功)
# ./check_dns_roundrobin -H test.suz-lab.com
OK aaa.aaa.aaa.aaa bbb.bbb.bbb.bbb ccc.ccc.ccc.ccc ddd.ddd.ddd.ddd

ELBのノード監視にも使えるかも...
--------
http://www.suz-lab.com