ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

自分のipアドレスを知りたいとき(linux)

最初に結論

hostname -Iを使うと良い

某所で、自ホストのIPアドレスを取得するためにこんなことをしている箇所を見つけたのが発端です。

LANG=C /sbin/ifconfig | grep 'inet addr' | awk '{print $2;}' | cut -d: -f2 | grep -v 127.0.0.1 | tail -n 1

もう少し、簡潔にできないかなー。(そもそもifconfigはもう使わない方が良いし) ip addr show eht0 とかでもデータ加工しないとだめだしな。とか考えてたら、hostnameでできそうだということが分かりました。

似たオプションで、-i-I があるのですが、名前解決ができるかできないかの違いです。用途に合わせて使い分けましょう。

   -i, --ip-address
          Display  the  network  address(es)  of the host name. Note that this works only if the
          host name can be resolved. Avoid using this option;  use  hostname  --all-ip-addresses
          instead.

   -I, --all-ip-addresses
          Display  all  network  addresses  of  the  host. This option enumerates all configured
          addresses on all network  interfaces.  The  loopback  interface  and  IPv6  link-local
          addresses are omitted. Contrary to option -i, this option does not depend on name res‐
          olution. Do not make any assumptions about the order of the output.

sudoersにはワイルドカードが使える

デーモン管理はUpstartでやっていて、Webアプリケーションサーバwebapp-${project_name}、ジョブワーカーはjobworker-${project_nameみたいな感じの名前で定義しています。

serviceコマンドはrootじゃないと実行出来ないのですが、デプロイのときなど、大量のサーバにいちいちパスワード打てないので、特定のユーザにNOPASSWORDで実行出来るようにします。 ただ、何も考えず/etc/sudoersに設定していくとサブコマンド毎に指定していかないといけないのでなかなか辛いです。

app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 restart
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 reload
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 stop
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 start
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 restart
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 reload
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 stop
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 start
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 restart
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 reload
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 stop
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 start

かといって、こうしてしまうと、全てのUpstart管理のデーモンをパスワード無しで操作出来てしまうのでかなり危険です。

app ALL=(root) NOPASSWD: /usr/bin/service

なんかうまい方法無いかなとsudoersのmanpageを引いていたらワイルドカードが使えるらしいので、こうしてみました。 これなら権限を絞りつつ、記述も簡潔になって良い感じです。

app ALL=(root) NOPASSWD: /usr/bin/service webapp-* *
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-* *

※ この記述あくまで一例だからこのまま使ってることを意味しないです。念為

fabricで現在実行中のhostを取りたい

A. env.host を使うと良い。

hostによって配るcrontabが違っていて、レポジトリ的には ${HOSTNAME}.crontab みたいな感じでhost名を含むファイル名で置いてあるときに、どうしたらうまく配れるかなと考えた結果 env.host で実行中のhost名が取れるのでそいつを利用した。

from fabric.api import sudo, env
from fabric.decorators import task

@task
def some_task(project):
    src = "/opt/%s/config/crontab/%s.crontab" % (project, env.host)
    dst = "/etc/cron.d/%s" % project
    sudo("if [ -e $src ];then cp %s %s; fi" % (src, dst))

わざわざワークツリーに移動しなくてもgit操作したい

今まで、ワークツリーにいちいち移動してから、gitの操作してたんですが、 --git-dir で指定してあげればその必要も無いという知見を得ました。

今まではこうしてたのを、

cd /path/to/repos/
git log

こうしてあげることで、ディレクトリの移動が必要無くgitの操作ができます。

git --git-dir=/path/to/repos/.git --work-tree=/path/to/repos/ log

古めのgitは上記の方法じゃないとダメなんですが、1.8.5からは -C オプションが使えるようになってるので、こちらを利用した方が良いです。

git -C /path/to/repos/ log

べんり。

GitHubはsvn対応していたらしい

そういうのを昔どっかで聞いて、ネタじゃないの?とか思って居たんですが、ふとさっき思い出して、試してみたら、普通にcheckoutできた。

% svn checkout https://github.com/masasuzu/resume
A    resume/branches
A    resume/trunk
A    resume/trunk/README.md
Checked out revision 5.

commitもできる。

% svn commit -m 'cpan => CPAN'
Authentication realm: <https://github.com:443> GitHub
Password for 'masasuzu':

Committed revision 8.

なるほど。ちゃんと反映されてる

参照

svnだから特定のディレクトリからチェックアウトするということもできるので、使いようによっては便利かも。

CodeDeploy-Agent をUbuntu12.04でもインストールしたい

  • ※そもそも、サポート対象外のディストリビューションのバージョンなので、ちゃんと動くかどうかはまったく保証出来ません。

  • ※前提として、awsコマンドインストール済みで、CodeDeployなどの各種設定済みであること

Ubuntu12.04でaws deploy installしようとするとruby2.0が無いのでインストール失敗します。

E: Unable to locate package ruby2.0
E: Couldn't find any package by regex 'ruby2.0'
Installing the AWS CodeDeploy Agent... ERROR
Command '['apt-get', '-y', 'install', 'ruby2.0']' returned non-zero exit status 100
Install the AWS CodeDeploy Agent on the on-premises instance by following the instructions in "Configure Existing On-Premises Instances by Using AWS CodeDeploy" in the AWS CodeDeploy User Guide.

そこで、brightboxのレポジトリにruby2.0があるので、追加してあげた後にインストールしてあげると、うまくCodeDeploy-Agentがインストールできます。

apt-get install python-software-properties
add-apt-repository ppa:brightbox/ruby-ng
apt-get update
apt-get install ruby2.0


aws deploy install --config-file codedeploy.onpremises.yml --override-config --region ap-northeast-1

ひとまず、動いている模様です。

# service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 18324

# tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log
2015-11-25 15:50:00 INFO  [codedeploy-agent(18708)]: master 18708: Spawned child 1/1
2015-11-25 15:50:01 INFO  [codedeploy-agent(18708)]: Started master 18708 with 1 children
2015-11-25 15:51:01 INFO  [codedeploy-agent(18712)]: [Aws::CodeDeployCommand::Client 200 61.042376 0 retries] poll_host_command(host_identifier:"arn:aws:iam::1234:user/deploy")

2015-11-25 15:52:03 INFO  [codedeploy-agent(18712)]: [Aws::CodeDeployCommand::Client 200 61.021466 0 retries] poll_host_command(host_identifier:"arn:aws:iam::1234:user/deploy")

AWS CodeDeployをオンプレミスで使うにあたっての料金に関してざっくり計算

https://aws.amazon.com/jp/codedeploy/pricing/

1台に対して1回デプロイする毎に$0.02かかる ざっくりの計算だと、1日あたり20回くらいデプロイがあるとし、各プロジェクトの平均台数が30台とする。 これを計算すると1日当たり$12。

  • (20回) * (30台) * ($0.02) = $12

1ヶ月20営業日換算ですると$240

  • ($12) * (20営業日) = $240

$1 == 120円で計算すると、28800円。

これに追加して、s3などの使用料金がかかかる。 なお、6ヶ月間の無料枠にはAWS CodeDeployは含まれてはいない模様。

http://aws.amazon.com/jp/free/

月あたり約3万円をどう取るか。AWSにあるインスタンスに対してデプロイするときは1台当たりの$0.02というのはかからない。 要はAWS移行しろとのAWSからの思し召しだ。