tkak's tech blog

This is my technological memo.

Bash Tips

最近、短期間に大量のサーバに設定をいれるという仕事がたんまりきていて、とてもじゃないけど手作業なんてしんどいので、ちまちまと使い捨てスクリプトを書いて作業を楽にしてます。
そんな中『これは使える!』というスニペットを残しておきます。

seqコマンド

seqコマンドは順番で数字を出力するだけなんですが、使い勝手よくてちょくちょく使ってます。

$ seq 3 #1から3までの整数を出力
1
2
3

$ seq 2 5 # 2から5までの整数を出力
2
3
4
5

$ seq 4 2 8 # 4から2ずつ8まで出力
4
6
8

$ seq -w 5 100 # -wをつけると桁の幅を同じにできる
005
006
007
009
010
...
...
100

$ seq -s " " 5 # -sで区切り文字を指定できる
1 2 3 4 5

$ seq -f "hoge%02g.log" 3 # 他の文字列と合わせて出力
hoge01.log
hoge02.log
hoge03.log

$ for i in $(seq 3); do echo "do something"; done
do something
do something
do something

source コマンド

bashでテンプレートエンジンもどきみたいなことをしたい時とかに使います。

#!/bin/sh
string="Hello World!!"
source test.txt

test.txt

cat << EOF
<html>
<head>
This is a test.
</head>
<body>
${string}
</body>
</html>
EOF

list fileの読み込み

リストファイルを一行ずつ読んで何かにしたい時に。

$ while read line do; echo ${line}; done < list.txt

配列に要素を追加する

array=() # 配列定義
array=(${array[@]} "fuga")

文字列置換

サーバをコピーして、中の設定ファイルを書き変えたい時に。

$ sed -i "s/hoge/fuga/g" /etc/hosts

DNSからIPアドレスを取得

$ host `hostname` | cut -d" " -f4

大量のサーバに対して手作業するのには限界があるので、うまくコマンド使い回して作業を効率化して定時で帰りましょうね!(キリッ

RHEL6系/CentOS6系のファイルパーミッションのdot「.」をなくす方法

RHEL6系/CentOS6系から、selinuxの管理下にあるファイルにはファイルパーミッションにdot「.」がつくようになってます。

[root@localhost ~]# ls -ld /etc
drwxr-xr-x. 57 root root 4096 Jan  4 13:21 /etc

selinuxを無効化しても、元々あったファイルにはドットがついたままなので、
なんか気持ち悪い感じ…。

いろいろ調べたら、ファイルの拡張属性security.selinuxが残ってるのが原因っぽいです。

このdot「.」を消すためには、ファイルの拡張属性を設定するsetfattrコマンドを使います。

[root@localhost ~]# getfattr -m - /etc
getfattr: Removing leading '/' from absolute path names
# file: etc
security.selinux

[root@localhost ~]# setfattr -x security.selinux /etc
[root@localhost ~]# getfattr -m - /etc
[root@localhost ~]# ls -ld /etc
drwxr-xr-x 57 root root 4096 Jan  4 13:21 /etc

全ファイルに対して設定する場合は下記を実行します。
(再帰的にコマンドを実行するオプションがないので、findでごりっとやってます。)

# find / -exec setfattr -x security.selinux {} \; 

VagrantのBase Boxを作ってみた。CentOS6.3 x86_64編

Vagrantは、Virtual BoxのVM(仮想サーバ)管理を簡単にするためのツールです。
VMを、コマンドラインから起動、停止、削除、etcできるので、テストや開発環境作成などでかなり重宝します。


今回はそのテンプレートになるBase Boxを作ってみたので、メモを残しておきます。
VagrantのBase Box作成を自動化するVeeweeというツールもありますが、
使ってみてうまくいかなかったので、今回は自分で作ります…。

今回試した環境はこんな感じ。

OS(Mac) 10.8.2
Virtual Box 4.2.6
Vagrant 1.0.5

※Virtual BoxとかVagrantのインストールなどは、今回省略します。

VMは、CentOS6.3 x86_64です。

Virtual BoxのVM作成

まず、Virtual BoxのVMを作ります。
VMは下記のような感じで作りました。

Name: vagrant-centos6.3
Type: Linux
Version: Red Hat (64bit)
Memory size: 512MB
Hard drive: 8GB (新規作成)
Hard drive file type: VDI, Dynamically allocated (動的割り当て)
Audio: Disable
USB controller: Disable
Port Forwarding: Name: ssh, Protocol: TCP, Host Port: 2222, Guest Port: 22

起動させてOSをインストールします。
メモリが512MBしかないので、テキストモードのインストーラが起動します。(1GB以上だとGUIモード)
キーボード、言語環境を選択します。
テキストモードだと、パッケージ選択やパーティション設定などが設定できないので、
そのまま進めていけばインストーラが終わります。

VMの初期設定

次にいろいろとVMに初期設定を入れていきます。

ネットワークの有効化

そのままだとネットワークが有効になっていなかったので、有効にします。

# /bin/sed -i 's/ONBOOT="no"/ONBOOT="yes"/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# /etc/init.d/networking restart
vagrantユーザの作成

sshで接続するために、vagrantユーザを作成します。

# /bin/sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication no/g' /etc/ssh/sshd_config
# /etc/init.d/sshd reload
# /usr/bin/yum -y install sudo
# /usr/sbin/groupadd vagrant
# /usr/sbin/useradd vagrant -g vagrant -G wheel
# echo "vagrant"|passwd --stdin vagrant
# echo "vagrant   ALL=(ALL)   NOPASSWD: ALL" >> /etc/sudoers
ssh 接続

ポートフォワーディング機能で、ホスト側の2222ポートをゲストの22ポートに割り当ててるので、
localhostの2222にsshします。

$ ssh localhost -l vagrant -p 2222
$ su -
# id
必要なパッケージのインストール

いろいろ入れます。

# yum -y install gcc make gcc-c++ ruby kernel-devel-`uname -r` zlib-devel openssl-devel readline-devel sqlite-devel perl

epelのリポジトリ設定ファイルを作成します。

# cat > /etc/yum.repos.d/epel.repo << EOM
[epel]
name=epel
baseurl=http://download.fedoraproject.org/pub/epel/6/\$basearch
enabled=1
gpgcheck=0
EOM

ruby-develとrubygemsをインストールします。

# yum -y install ruby-devel rubygems
# yum -y clean all
# rm -f /etc/yum.repos.d/epel.repo
chefクライアントのインストール

chefをインストールします。少し時間がかかるので、待ちます。

# gem install --no-ri --no-rdoc chef
vagrantユーザの公開鍵配置

vagrantユーザ用の公開鍵を配置します。

# mkdir /home/vagrant/.ssh
# chmod 700 /home/vagrant/.ssh
# cd /home/vagrant/.ssh
# curl -L -o authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
# chown -R vagrant /home/vagrant/.ssh
VirtualBox Guest Additionsのインストール

VitualBoxゲストOS用ドライバVirtualBox Guest Additionsをインストールします。

# cd /tmp
# curl -L -o VBoxGuestAdditions_4.2.6.iso http://download.virtualbox.org/virtualbox/4.2.6/VBoxGuestAdditions_4.2.6.iso
# mount -o loop VBoxGuestAdditions_4.2.6.iso /mnt
# sh /mnt/VBoxLinuxAdditions.run
# umount /mnt
# rm VBoxGuestAdditions_4.2.6.iso
# sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers
# sed -i "s/^#UseDNS yes/UseDNS no/g" /etc/ssh/sshd_config
# dd if=/dev/zero of=/tmp/clean || rm /tmp/clean

Base Boxのパッケージ化

作ったVMをBase Boxにします。

$ vagrant package --base vagrant-centos6.3

カレントディレクトリにpackage.boxというファイルができます。

あとは、Base Boxをvagrantに登録して、起動させます。

$ vagrant box add my_box package.box
$ mkdir test_environment
$ cd test_environment
$ vagrant init my_box
$ vagrant up
$ vagrant ssh

以上。

…と、まぁ、ほとんどveeweeの設定ファイルをなめただけなんですが、
とりあえず、流れが把握できたのとchefだけのBase Boxができたので、めでたしめでたし。
veeweeで失敗していたのは、ネットワーク周りが原因な気がする…。
まー、あとは、chefのcookbook作っていろいろ遊んでみよう。

Opscode Chef のトレーニングに参加してきた。

久々のblog更新。
日本Chef User会のFacebookで紹介されている
Chefのハンズオントレーニングイベントに参加してきました。
Japan Chef Users Group | Facebook

トレーニングの講師は、Opscode社のSean OMeara 氏。
全部英語でしたが、(たぶん)普段普通に話すよりゆっくり話てくれてたのと、
周りのスタッフの方々が通訳してくださって、内容は大体把握できました。
ただ、やっぱり質問は流暢な英語でしたかった(´・ω・`)

また、対象者がChefをさわった事がある方 (初級の上〜中級の下)でしたが、
なぜConfiguration Managementが必要なのか、なぜChefなのかとか、
割りと基本的な話を最初にしてくれて内容整理できてよかったです。


以下、自分が気になったところのまとめです。

cookbookのテストについて

Chef のテストについては、3つ。テストの種類によってツールを使い分ける。

1. unit test -> chef-minitest-hundler

calavera/minitest-chef-handler · GitHub
テストできるところとできないところがるので、使い方を工夫する。

2. integration test -> test-kitchin with vagrant

test-kitchen | RubyGems.org | your community gem host
chefはやっぱりvagrantとの相性がいい。開発環境やテスト環境としてvagrantとchefを組み合わせて使う。
これ使ったことがないので、今度試してみよう。

3. Behavior Test -> cucumber chef

Cucumber-chef
cucumber自体全然使ったことがないので、これも今度試す。

個人的にchefのcookbookを書いていて、テストコードどう書くのか、
ものすごーく気になってたところなんですが、
Seanが言ってたけど(たぶん)、

  • chefのテストにはカバーできない部分がある。
  • UnitTestの中でChefのResource機能の動作をテストするのは無駄。
  • why-run機能を使いなよ。

テストに関してだったり、cookbookの使い方だったり、
まだベストプラクティスっていうのはなくて、
会社ごとにポリシーとかもあるし、各自で試行錯誤するしかないっていうのが、
印象でした。

why-run機能について

ver10.14でリリースされた機能。
chefを実行したときの処理をサーバ側に反映せずに動作確認できる機能です。
この機能はchefの開発が始まった頃からチケットがあって、
何度もclose, reopenを繰り返し、議論されてきたらしい。
元々は、dry-runっていうネーミングで作ってたんだけど、今はwhy-run。
dry-runだと、実行中でシステムに変更を加えない
(ファイルを作成したり、マウントをしたりしない)ので、
real-runを実行したときと差分がでてしまう。
why-runは、実行中にシステムの内容が変わるところもカバーしている。

chef実行時のフォーマットについて

chef-client実行時に、Fオプションで出力結果を変更することができる。

$ sudo chef-client -Fdoc -lfatal --color --why-run

null, doc, minimal, minの4つが現状使用可能。

その他、開発に便利なツールについて

bento

opscode/bento · GitHub
vagrant用baseboxの作成を効率化するツールveeweeをカプセル化するもの。

test-kichin

Integration Test Tool
opscode/test-kitchen · GitHub

foodcritic

link checker, style guide
Foodcritic - A lint tool for your Opscode Chef cookbooks
これはめちゃくちゃ参考になる!色々と間違ってcookbook書いてた。

設定ファイルに設定を追加するためには

rubyで書く場合


Class: Chef::Util::FileEdit

— Documentation for chef (0.8.16)


上記クラスをruby blockの中で使う。

bashで書く場合

bushスクリプトを書いてexecuteで使う。

Chef の処理系について

  1. chef-client実行
  2. build node
  3. authenticate
  4. sync cookbooks(expanded run list)
  5. load cookbooks
  6. converge
  7. success?
  8. if yes -> run
  9. if no -> error

chefのresourceとLWRP

chefのcookbookは、Lightweight Resources and Providers (LWRP)という機能を使うことによって、
recipe内で使うresourceを簡単に定義することができます。

用意するファイルは下記になります。

resources

resourceで使うactionとattributeの定義とバリデーションをLWRPの形式で記述する。

providers

resourceの具体的なアクションを記述する。中でchefで定義しているresourceを使うことができる。

SaltStackを試してみた

SaltStackは、大量のサーバを管理運用するためのリモート制御・設定管理ツールです。
capistranoなどのリモート制御ツールとpuppet, chefなどの設定管理ツールを合わせたようなものという印象です。
pythonで書かれてます。

http://saltstack.org/

インストール

まずは、インストールから。saltstackは、以下のものに依存があります。

Python 2.6
ZeroMQ >= 2.1.9
pyzmq >= 2.1.9 - ZeroMQ Python bindings
M2Crypto - Python OpenSSL wrapper
PyCrypto - The Python cryptography toolkit
msgpack-python - High-performance message interchange format
YAML - Python YAML bindings

では、CentOSに、saltstackを入れてみましょう。上記の依存ツールはyumでいれるとまるっと入れてくれます。きっと。

# wget -O /etc/yum.repos.d/epel-salt.repo \\
    http://repos.fedorapeople.org/repos/herlo/salt/epel-salt.repo

SaltStackは、サーバ/クライアント型のツールで、サーバとクライアントは、それぞれmasterとminionと呼ばれます。
master、minionをインストールします。

#yum install salt-master
#yum install salt-minion
設定

設定ファイルはそれぞれ下記になります。
/etc/salt/master
/etc/salt/minion

# vi /etc/salt/minion
- #master: salt
+ master: 10.0.0.1
実行

master側

# salt-master -d

minion側

# salt-minion -d

master側で、アクセスを許可するminionサーバを設定する。

# salt-key -L
# salt-key -A
or
# salt-key -a <minion's id>

今日はとりあえず、ここまで。

Linuxサーバ構築ツールまとめ

仮想化技術が進歩し、大量のサーバを管理・構築することが多くなりました。

PuppetやChefなど、サーバ構築・管理を自動化するいろんなツールがあるので、
整理しておこうと思います。

以下の3つに分類します。

  • Provisioning Tools
    • kickstart
    • cobbler
    • crowbar
    • spacewalk

BIOS設定、PXEブート、kicskstartなど、一番下のレイヤーのOSインストールまでを行うツールです。

  • Configuration Management Tools
    • puppet
    • chef
    • saltstack
    • rundeck

and more...
http://en.wikipedia.org/wiki/Comparison_of_open_source_configuration_management_software

パッケージ管理や設定ファイルの配布など、OSより上のレイヤーの管理を行うツールです。

デプロイや設定ファイルの修正など、大量のサーバに対しインタラクティブな操作を行うツールです。


以下、リンクとメモ書きです。

Provisioning Tools

kickstart

RHEL系のLinuxディストリビューションのOSインストールを自動化する機能。
http://fedoraproject.org/wiki/Anaconda/Kickstart

cobbler

Linuxの自動インストールを管理するサーバ。
http://cobbler.github.com/

crowbar

サーバプロビジョニングのプラットフォーム。ファームウェアのUPDATEやPXEブートからのOSインストールが可能。
DELLのCloudEdge Solutions Teamが、OpenStack用のインストーラとして開発したもの。
Chefサーバをラップしているので、OSから上の設定をできるのかも。
https://github.com/dellcloudedge/crowbar/wiki

spacewalk

サーバのHW設定の情報を閲覧したり、kickstartを実行したり、ブラウザからサーバの管理ができる。RHEL系のみ。
http://spacewalk.redhat.com/

Configuration Management Tools

puppet

システム自動管理ツール。rubyで書かれている。サーバ/クライアント型。
サーバ側でマニュフェストと呼ばれる設定ファイルを管理し、
クライアント側は定期的に(デフォルトで30分)サーバからマニュフェストを取得し、
クライアントサーバをあるべき姿に維持する。
http://puppetlabs.com/