RedHat 系 Linux のホスト名を設定する

Vagrant とかでたくさん VM 立ち上げるときホスト名設定しないと何が何だかわからなくなるのでシェルプロビジョニングには以下の様なコマンドセットを紛れ込ませています。

7 系

HOSTNAME=from
sudo hostname $HOSTNAME
echo $HOSTNAME | sudo tee /etc/hostname

6 系

HOSTNAME=from
sudo hostname $HOSTNAME
sudo sed -i -e "s/\\(HOSTNAME=\\).*$/\\1$HOSTNAME/g" /etc/sysconfig/network

xz 形式で圧縮展開する(tar 使う版)

最近この拡張子なんだこれと思ってたんだけど 7z で使われている LZMA アルゴリズムLinux に採用されたものが xz 形式らしい。
GNU tar を使う場合 1.22 以降で使うことができる。
圧縮率も優秀で、展開もそれなりに高速らしい。
gzip と bzip2 のいいとこどりした感じっぽい。

圧縮

tar cvJf linux-stable.tar.xz linux-stable/

展開

tar xvJf linux-stable.tar.xz

参考リンク

  1. 逆引きUNIXコマンド/tar.xz形式ファイルを展開する – Linuxと過ごす
  2. xz (ファイルフォーマット) – Wikipedia)
  3. gzipの代わりにxzを使おう | Okumura’s Blog

awscliでec2インスタンスを操作する

よく忘れるので基本的な操作方法のまとめ。

インスタンスの操作

インスタンスを作成

  • AMI IDを調べてメモる
  • 立ち上げたいインスタンス
  • インスタンスタイプ: 現状t2.microが最小(2014/7/8現在)
  • 使用するキーペア
  • 適用するセキュリティグループ
% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups hoge | jq '.'

AZを指定する

--placement AvailabilityZone=ap-northeast-1a をつけてやればいい。

aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups web --placement AvailabilityZone=ap-northeast-1a | jq '.'

DeleteOnTerminationを避ける

今ではほとんどEBSから起動されるEC2インスタンスがほとんどだが、このままでは DeleteOnTermination=true となってしまっているので、インスタンスをterminateするとインスタンスに紐付けられているボリューム自体も削除されてしまう。

これを避けたいなら

% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups hoge \
--block-device-mappings "[{\"DeviceName\": \"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\": \"false\"}}]" | jq '.'

としなければならない。面倒だが。

既に作成されたインスタンスについて DeleteOnTermination=true としたい場合は

% aws ec2 modify-instance-attribute --instance-id i-dfff36d1 --block-device-mappings "[{\"DeviceName\": \"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\": \"false\"}}]" | jq '.'

とすればいい。

インスタンスを起動

% aws ec2 start-instances --instance-ids i-xxxxxxxx | jq '.'

インスタンスを停止

% aws ec2 stop-instances --instance-ids i-xxxxxxxx | jq '.'          

停まったかどうか確認。

% aws ec2 describe-instances --instance-ids i-xxxxxxxx | jq -r '.Reservations [] .Instances [] .State .Name'
stopped

インスタンスを削除(terminate)

% aws ec2 terminate-instances --instance-ids i-xxxxxxxx | jq '.'

jqで欲しい値をとってくる

インスタンスID

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .InstanceId'
i-xxxxxxxx

グローバルIPアドレス

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .PublicIpAddress'
xxx.xxx.xxx.xxx

PublicDNS名

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .PublicDnsName'
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

SSHで接続するとき

単なる覚え書き。

ssh ec2-user@xxx.xxx.xxx.xxx -i ~/.ssh/foobar.pem

References

  1. run-instances — AWS CLI 1.3.21 documentation
  2. start-instances — AWS CLI 1.3.21 documentation
  3. stop-instances — AWS CLI 1.3.21 documentation
  4. terminate-instances — AWS CLI 1.3.21 documentation
  5. describe-instances — AWS CLI 1.3.21 documentation

awscliでキーペア(鍵ペア)を一括削除する

概要

AWSAPIの練習とシェルスクリプトの練習も兼ねてる。

AWS APIを叩く練習をしていてキーペアをいっぱい作っちゃいました。
こんな感じ。

% aws ec2 describe-key-pairs| jq -r '.KeyPairs [] .KeyName'
default
default2
default3
default4
default5
default6
default7
default8

ちなみにjqの -r オプションはダブルクォーテーションを消してくれるオプション。

これらのキーペアを消したい。

find+xargsを使う(失敗)

find+xargsの組合せに慣れてるから以下の様な感じにしたくなる。

aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | xargs aws ec2 delete-key-pair --key-name
Unknown options: default3, default4, default5, default6, default7, default8, default2

でもエラー。xargsのmanページをよく見てみる。

Man page of XARGS

xargs は標準入力から読み込んだ一連の項目をその後ろに 追加していく (訳注: 作成されたコマンドラインが、
コマンドライン長の上限を 越える場合や、オプションによる特別な指定がある場合は、入力を適宜分割して、
command を複数回実行することになる)。標準入力における空行は無視する。

そういえば

find | xargs rm

find | xargs grep hoge

は引数に複数のエントリをもたせられた気がする・・・。

1個ずつ削除したいのでこれは使えない。

while+readを組み合わせる(成功)

aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | while read key; do
aws ec2 delete-key-pair --key-name $key
done

これならどうだ。

% aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | while read key; do
pipe pipe while> aws ec2 delete-key-pair --key-name $key
pipe pipe while> done
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}
{
"return": "true"
}

あっ、うまくいった。
やったきもちいいいいい。

References

  1. jq
  2. jqに痺れた … AWS CLIで演習など – OpenGroove
  3. jqコマンドを使ってみた – mknkisk report
  4. Bash – パイプ出力を現在のシェル上のwhileに喰わせる上手いやり方 – Qiita

lsof -i:69のシンタックス

次の例はリッスンしてるポート番号、またはサービス名を指定してプロセスを一覧表示するみたい。

% sudo lsof -i:69
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root  108u  IPv6 0x4b902fe355279297      0t0  UDP *:tftp
launchd   1 root  111u  IPv4 0x4b902fe35672a667      0t0  UDP *:tftp

manページからの抜粋

Service names and port numbers may be combined in a list whose
entries are separated by commas and whose numeric range
entries are separated by minus signs. There may be no embed-
ded spaces, and all service names must belong to the specified
protocol. Since service names may contain embedded minus
signs, the starting entry of a range can’t be a seoirvice name;
it can be a port number, however.

ちなみに、rootで実行しないと結果は空になるっぽい。

また、69はTFTPのポート番号なので以下のようにサービス名を指定してもいける。

% sudo lsof -i:tftp
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root  108u  IPv6 0x4b902fe355279297      0t0  UDP *:tftp
launchd   1 root  111u  IPv4 0x4b902fe35672a667      0t0  UDP *:tftp

参考文献