tkuchikiの日記

Linux やプログラミングについて書きます。

apache の Directory ディレクティブの重複しているパスを出力する

検証した apache のバージョンは、2.2.29 です。apache の VirtualHost が大量にある環境で、 Directory ディレクティブのパスが重複しており、 意図しない設定で上書きされてしまう問題に苦しめられました。 ので、それを解決する方法です。以下のスクリプ…

GPG Pubkey の Summary を一覧表示する

$ rpm --import http://path/to/gpg-pubkeyのようにして、GPG Pubkey を import すると思いますが、 $ rpm -qa gpg-pubkey* gpg-pubkey-0608b895-4bd22942 gpg-pubkey-a12e206f-52aecba3のように表示されても、どれが何の key なのかわかりにくいと思います…

Jenkins EC2 Plugin で Spot Instance を使ってテストを回す

動作確認した環境は、 Amazon Linux 2015.03 Java 1.7.0_75 Jenkins 1.610 EC2 Plugin 1.27 です。Jenkins EC2 Plugin で Spot Instance を使えるようにするまで、 試行錯誤しましたので、導入方法をまとめました。 Jenkins のインストール 適宜 sudo してく…

perl, php, python の標準モジュールで /etc/shadow の hash を生成する方法

※追記 /etc/shadow の hash を生成するコマンドを作りました - tkuchikiの日記 で環境依存しない方法を紹介しています。 useradd や chef の user resource で password を設定するときに必要になる、 /etc/shadow の hash を生成する方法です。/etc/shadow …

chef の role name と role ファイル名は同じにしなくてはならない

検証した環境は chef 11.16.4 ですが、 後述の通り、12-stable(2015/01/15 現在) でも同様の問題が発生すると思います。 $ cat roles/hoge_hoge.json { "name": "hoge-hoge", ... } $ cat nodes/hoge.json { ... "run_list": [ "role[hoge-hoge]" ] }ぱっと…

chef 12.2.0.alpha.0 から metadata.rb の name attribute が必須に

metadata.rb と書きましたが、metadata.json でも同様です。 以降は、便宜上 metadata.rb と記載します。 該当となる変更箇所 Add validation to Metadata · 89427a5 · opscode/chef · GitHub Make `name` a required attribute in metadata · 2577c6f · ops…

docker run -v で mount したディレクトリを見やすく出力するワンライナー

執筆時の環境は docker 1.3.2 ですが、ある程度バージョンが前後してもそのまま使えると思います。 はじめに docker run -v /data1:/tmp/data とした場合は、 docker host の /tmp/data を mount していることがわかります。 しかし、docker run -v /data1 …

chef で Docker container を provisioning する

検証した環境は Docker 1.3.2、chef 12.0.3 ですが、 バージョンには依存していないと思います。例は、以下の様なファイル構成です。 $ tree . . ├── client.rb ├── cookbooks │ └── nginx │ └── recipes │ └── default.rb ├── Dockerfile ├── nodes │ └── n…

ohai で仮想化環境の種類を取得する

ohai の version は、8.0.1 です。仮想化環境の種類は、以下のように格納されています。 { "virtualization": { "system": "VIRTUALIZATION_TYPE" } }当然ですが、仮想環境下でなければ "virtualization" key はありません。chef で取る場合は、 node[:virtu…

git 2.2.0 の rpm 作成方法

rpm を作成した環境は、CentOS 6.4、git 1.7.1 です。執筆時(2014/12/15) の git 最新版は 2.2.0 でした。 git.spec が極端に変更されない限りは、 多少バージョンが前後しても同様の手順で作業できると思います。perl-Git に、subversion-perl, perl-YAML …

Amazon Linux で yum.conf に installonlypkgs を正しく設定しないと kernel update で問題が発生する

Amazon Linux 2014.03 の kernel update 時に instance が起動しなくなる問題の対処法 - tkuchikiの日記 の続編です。この現象を確認したのは、 Amazon Linux 2012.03, 2012.09, 2013.03, 2013.09, 2014.03, 2014.09 です。 2012.03 よりも前のバージョンに…

zabbix 2.0.x(epel zabbix20) のグラフが文字化け、横軸が正しく表示されなくなる問題の対処法

問題が発生した環境は、以下です。 CentOS 6.4 zabbix 2.0.11 epel の zabbix20 package zabbix 2.0 をマイナーアップデートしたら、 グラフの日本語部分が文字化けするようになりました。/usr/share/zabbix/include/defines.inc.php に、 define('ZBX_FONTP…

指定ディレクトリ以下に配置している gem を install し直す script

ユースケースとしては、CentOS 6 標準の ruby 1.8.7 を使っていた想定で、 /usr/lib/ruby/gems/1.8/gems に入れている gem を、 /rh/opt/ruby193 に gem を install し直すような用途の script です。gem のディレクト名を awk と sed で parse して、 gem i…

Amazon Linux 2014.03 の kernel update 時に instance が起動しなくなる問題の対処法

追記: Amazon Linux 2014.03 の問題ではなく、yum.conf の設定の問題でした。Amazon Linux で yum.conf に installonlypkgs を正しく設定しないと kernel update で問題が発生する - tkuchikiの日記 に詳細を書きました。解決方法自体は間違っていないので、…

chef で FileEdit を使うときは、write_file を使ってファイルを書き出さないほうが良い(かもしれない)

執筆時の chef のバージョンは以下のとおりです。 $ rpm -q chef chef-11.16.4-1.el6.x86_64chef でファイルの変更をする場合、chef/file_edit.rb at 11.16.4 · opscode/chef · GitHubを使うことで簡単に行うことができます。実際にコードを書く場合は、 fil…

chef の role name にハイフン、アンダースコア、半角英数字以外は使えない

執筆時の chef のバージョンは以下のとおりです。 $ rpm -q chef chef-11.16.4-1.el6.x86_64{ "name": "example.com", ... }のような role がある状態で、 chef を実行したら、以下のエラーがでました。 Chef::Exceptions::ValidationFailed: Option name's …

knife コマンドで cookbook(や metadata.rb, README.md) を作成するのを knife コマンド外から行う

執筆時の chef のバージョンは、以下のとおりです。 $ rpm -q chef chef-11.16.4-1.el6.x86_64chef/cookbook_create.rb at 11.16.4 · opscode/chef · GitHubをみると、 create_cookbook create_changelog create_readme create_metadata という method があ…

chef の config file を読み込んで、設定値を使用する方法

執筆時の chef のバージョンは、以下のとおりです。 $ rpm -q chef chef-11.16.4-1.el6.x86_64chef 以外から、chef の config file を読み込んで、Hash のようにアクセスする方法です。 主に、以下のコードを参照しました。 chef/config.rb at 11.16.4 · ops…

chef-solo から chef-server に移行する際に問題となる include_attribute と include_recipe の使い方

執筆時の chef-server と chef-solo のバージョンは、以下のとおりです。 $ rpm -q chef-server chef-server-11.1.6-1.el6.x86_64 $ chef-solo --version Chef: 11.16.4chef-solo だと、include_attribute と include_recipe を使っていても問題が出なかった…

chef-server-ctl reconfigure を繰り返すときの注意点

執筆時に使用した chef-server のバージョンは、以下のとおりです。 $ rpm -q chef-server chef-server-11.1.6-1.el6.x86_64 chef-server のセットアップをしている時に、 $ chef-server-ctl reconfigure を打つと、 $ ls -1 /etc/chef-server/ admin.pem ch…

golang で外部コマンドを実行して標準出力を取得する

執筆時に使用した go version は、go1.3 です。golang で外部コマンドを実行して、 標準出力の結果を受け取る方法です。 Go Playground では試すことができませんのでご注意ください。※追記1id:mattn さんにご指摘いただいた、Cmd.Output の例を追記しました…

ELB の health check を aws cli で変更するラッパースクリプト

Management Console でぽちぽちやるよりも、 予め用意しておいたほうが精神的にも操作する上でも楽なので用意しました。 必要に応じて、https と ssl の healthcheck を増やしたりすると良いと思います。 Interval とかも引数で変えられるようにしようかとも…

epel の srpm から最新の openvpn の rpm を作成する

執筆時最新版の、openvpn 2.3.4 の rpm 作成方法です。 $ yum install -y yum-utils rpm-build rpmdevtools lzo-devel openssl-devel pam-devel pkcs11-helper-devel $ rpmdev-setuptree $ yum install -y http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/e…

yum でインストールした rpm がどの repository のものか調べる

インストール済みの rpm がどの repository のものかは、yumdb コマンドで調べられます。 YumDB - yum - Trac に詳しく書いてありますが、 $ yum install -y yum-utils して、yumdb コマンドを入れたあとに、 $ yum search from_repo REPO_NAME で以下のよう…

Nginx で 404 をキャッシュさせない

nginx で 404をキャッシュさせないようにする場合、 add_header Cache-Control "no-cache, no-store"; return 404 "not found"; と設定しても、Cache-Control ヘッダが付与されません。Module ngx_http_headers_module を見ると、 Adds the specified field …

sar で Invalid system activity file が出るファイルを一括削除するスクリプト

sar を使っている時に、 Invalid system activity fileまたは、 システム動作情報ファイルの形式が正しくありませんというエラーメッセージが表示されて使えないことがあります。 SYSSTAT の 2.1 を見ると、 You are trying to use a file which is not a sy…

fluent-plugin-multiprocess を使っているときでも各ファイルの configtest をできるようにする

fluentd の frsyuki/fluent-plugin-multiprocess · GitHub は、 プロセスを分けられて便利なのですが、 td-agent の initscript の configtest をしたときに、/etc/td-agent/td-agent.conf のチェックしか行えません(設定している cmdline の方は configtest…

ISUCON4 予選1日目で惨敗しました

チーム 流れ弾 で ISUCON4 予選1日目に参加しました。最終スコアは、29500 くらいでした。 言語は Ruby です。残念な結果でしたが非常に有意義な時間を過ごすことが出来ました。 主催の LINE株式会社様、 協賛のクックパッド株式会社様、株式会社データホテ…

Chef の Attributes を yaml に書き出す

chef の attributes を yaml に書きだそうと思ったとき、 require 'yaml' file "/path/to/file.yml" do content YAML.dump(node[:yaml]) end といったコードを思い浮かべると思いますが、 これでは以下のページのように、Object 名や、意図しない要素まで出…

Go の http.Get で証明書エラーが出るURL にリクエストを送ってもエラーが出ないようにする

検証した環境は Go 1.3 です。http.Get, Post で、SSL 証明書エラーがでる URL にリクエストを送ると、 以下の様なエラーが出力されます。 2014/07/24 09:36:00 Post https://127.0.0.1: x509: cannot validate certificate for 127.0.0.1 because it doesn'…

PhantomJS 1.10 の RPM を生成できない場合の対処法

git checkout 1.9 をしないで、master の PhantomJS 1.10(development) を rpmbuild する際の手順です。 1.9 では、問題ありませんでした。Build | PhantomJSの手順で、RPM の作成まで行おうとしたところ、 $ ./mkrpm.sh phantomjs => Copying sources... =>…

Oracle の RPM で install した MySQL 5.5 から 5.6 への upgrade 手順

例として、5.5.28 -> 5.6.17 への upgrade 手順を記します。 Oracle の RPM を使う場合の手順です。 Oracle の mysql-community repo から yum で入れている場合は、 yum upgrade でできると思います。 RPM 取得 $ wget http://dev.mysql.com/get/Downloads/…

ec2 instance の name tag と private ip を /etc/hosts に追記する

aws ec2 describe-instances が返す json を parse して、 /etc/hosts に private ip, name tag を追記するスクリプトです(name tag を hostname としてる場合を想定しています)。 aws configure をしている前提で書いていますが、 そうでない場合は、適宜 r…

python のワンライナーで、json の任意のキーの値を出力する

jq を使わないで行う方法です。 $ echo '{"hosts":[{"name":"host1"},{"name":"host2"}]}' | python -c "exec(\"import json,sys\\nj=json.load(sys.stdin)\\nfor attr in j.get('hosts'):\\n print attr.get('name')\")" host1 host2 python のコードに改行…

git push したら commit log を mail で送信する

git

自前で git をホスティングしているリポジトリに対して push したときに、 commit log を mail で送信する方法です。/path/to/repo/.git/hooks 以下に、所謂コミットフックを行うためのファイルがあります。そのなかに、post-receive.sample というファイル…

Bash で動作するプログレスバー

tkuchiki/bash-progress-bar · GitHub を実装しました。実装した関数は2つで、 progress_bar TIMES CURRENT は、TIMES に何回繰り返すか、CURRENT が何回目かを引数に取ります。 TIMES=10, CURRENT=1 の場合、1 / 10 * 100 = 10% のようになるので、 決まっ…

Ubuntu 14.04 で Docker 0.11.0 を動かす

Ubuntu 14.04 で Docker 0.11.0 を動かしたかったのですが、 apt-get update apt-get install -y docker.io で install される Docker の version が、 0.9.1 でしたので、Binaries - Docker Documentation を参考に install しました。 apt-get install -y …

現在の shell を shellscript の中から確認する(Linux, BSD 両対応)

現在の shell(以下、current shell) を確認する方法として真っ先に思い浮かぶのは以下だと思います。 $ echo $SHELL /bin/bash ただ、これは不正解で、$SHELL はあくまでも login shell ですので、 login shell と current shell が違う場合は正しい値を返し…

Monit でログを監視してプロセスを再起動させる

Monit を使って、 ログに特定の文字列が書き込まれた時にプロセスを再起動させる例です。以下の要件を満たすために検証しました。 原因を調べきれていないけれど時々セグフォしてしまう ずっと落ちたままだと困るので再起動させたい 数分で起き上がってくれ…

SSL 証明書と鍵のペアを1発で確認するコマンド(bash限定)

openssl で SSL 証明書と秘密鍵のペアを確認する方法は以下のページを参考にさせていただきました。 ありがとうございます。証明書と鍵のペアをコマンドで確認する - inuzの日記bash 限定で、以下のコマンドで確認できます。 差分がなければOK。 diff <(open…

varnish-release-4.0 の spec ファイルを書いた

まだ公式に varnish-release-4.0 の rpm がなかったので、spec ファイルを書いた。末尾のコードを適切なディレクトリに設置して、以下のコマンドを実行する。 最後に yum install varnish でインストールできる。 yum install -y rpm-build rpmdevtools rpmd…

php-build が libphp5.so を上書きしないようにするパッチ

CHH/php-build · GitHub は、php を指定のディレクトリに build できるので便利だが、 --with-apxs2 をつけて build すると、httpd の modules ディレクトリ以下 (/etc/httpd/modules など) の libphp5.so を上書きしてしまう。 この場合、システム全体で使…

find でディレクトリに symlink が含まれるときはパスの末尾に / をつけるか、-L をつける

$ tree -p /tmp/ /tmp/ ├── [lrwxrwxrwx] foobar -> /tmp/hoge └── [drwxr-xr-x] hoge ├── [-rw-r--r--] hogege └── [-rw-r--r--] hogehoge 2 directories, 2 filesというディレクトリ構成の時に、 $ find /tmp/hoge /tmp/hoge /tmp/hoge/hogege /tmp/hoge/h…

Redis の rpm を簡単に作成できるようにした

以前、CentOS 6 用 Redis 2.6.13 の RPM 作成手順 - tkuchikiの日記 という記事を書いたが、 毎回記事を見ながら作業するのは面倒なので、変数を少し変えただけで作れるようにした。rpmbuild の環境がない場合は、以下を予め実行。 yum install -y rpmbuild …

Shellscript で指定回数ループするコードのベンチマーク

Shellscript で 指定回数ループする場合を調べていたら、 while でインクリメントしていくか、for in seq の2 パターンが見つかった。 どちらが高速なのか疑問に思ったのでベンチマークを取った。 while code #!/bin/sh i=0 while [ $i -ne 10000 ]; do i=`e…

ISUCON3 本選に出場してきました 【インフラ編】

チームメンバーのブログ記事 ISUCON本選に出場してきました 【アプリ編】 - @Konboi memo ISUCON3 本選に出場してきました 【祈り編】 | hello-world.jp.net はじめに 11/09 (土) に行われた ISUCON3 本選に、会社の先輩 @hilotter と、同期の @Konboi で、…

capistrano の deploy を git (ssh) で行うときの設定

capistrano で、repository を以下のように設定した場合の諸々の設定。 ※この作業は、~/.ssh/id_rsa 以外を使う場合に必要となる。 # config/deploy.rb set :scm, "git" set :repository, "git@github.com:tkuchiki/example.git" このまま deploy しようとし…

root宛のメールを /etc/aliases で設定して転送するときは、decode: root を削除しよう

/etc/aliases に、 root: mail@example.comと書くと、 root 宛のメールを mail@example.com に転送できるが、 # trap decode to catch security attacks decode: rootこれが書いてあると、転送できない。理由は、コメントに書いてある通り。 したがって、該…

yum の repo ファイルの enabled を変更するコマンド

/etc/yum.repos.d/*.repo の enabled を sed などで書き換えるのは面倒だなと思っていたら、 書き換えるコマンドがあった。 4.3.5. Yum リポジトリの追加・有効化および無効化ただし、CentOS の場合は、6 以降でないと利用することができない。 また、Amazon…

RDS で GRANT ALL すると ERROR 1045 (28000): Access denied が出る

表題の通りエラーがでる。 調査した結果、Using "GRANT ALL" With Amazon's MySQL RDS - fidian.com で解決できた。 ありがとうございます。 GRANT ALL ON `%`.* TO ...; DB 名に % を使えば良いようだ。