ksaitoの日記

日々試したことの覚え書き

Ubuntuのopensshコンパイル

/etc/apt/sources.listの下記の行を追加します。

deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted

次のコマンドでソースパッケージを取得します。

apt update
apt-get source openssh

次のコマンドで、ビルドに必要な準備をします。

cd openssh-7.6p1
sudo apt-get build-dep openssh-server
autoconf
./configure

ビルドします。

make

以上

aws cliの結果をタグの値で絞り込むquery

aws cliの結果をタグの値で絞り込むqueryです。

例えば、Security Groupの中からNameタグに特定の値が設定されたデータを絞り込むには、下記のようにします。

aws ec2 describe-security-groups --group-ids <SecurityGroup ID> --query 'SecurityGroups[?Tags[?Key==`Name`].Value|[0]==`特定の値`]'

Kubernetes-dashboardに接続する

Kubernetes-dashboardをデプロイしましたが、接続するのにちょっと苦労しました。

リモートからは接続できない

マニュアル通りkubectl proxyを実行したところlocalhost以外からは接続できませんでした。

GUILinuxがあれば、これでも良いのですけどね。

$ kubectl proxy 
Starting to serve on 127.0.0.1:8001

表示をみてもIPアドレスが制限されているので、下記のような結果です。

$ curl http://ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:8001
curl: (7) Failed to connect to ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com port 8001: 接続を拒否されました
$

IPアドレスの制限を解除してみる

$ kubectl proxy --address 0.0.0.0
Starting to serve on [::]:8001

アクセスできるようになりましたが、認証エラーとなりました。

$ curl http://ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:8001
<h3>Unauthorized</h3>$

accept-hostsオプションを追加

0.0.0.0は、自分のIPアドレスに絞ったほうが良いです。

$ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
Starting to serve on [::]:8001

これで、アクセスできました。

$ curl http://ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:8001 | head -5
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",

シェルでタイムアウトを設けて何かを待つ処理をワンライナーで書く

シェルでタイムアウトを設けて何かを待つ処理をワンライナーで書いてみました。

アプリケーションサーバの起動のあとに何か実行する必要がある場合、起動の完了を待つ必要があります。 同期呼び出しやコールバックなどが設定できない場合は、ログやポートを定期的に監視する必要があります。

ここでは、サンプルとして、時刻の秒が48秒になったら何か処理することを想定します。

下記のように実装しました。

$ timeout 30 bash -c 'while true; do date +'%S' | grep 48 &&  break; sleep 1; done'
48
$ echo $?
0
$ timeout 3 bash -c 'while true; do date +'%S' | grep 48 &&  break; sleep 1; done'
$ echo $?
124
$

詳細

ワンライナーの詳細です。

条件の判定

何かの状態になったかを確認する専用のコマンドが提供されていない場合は、grepdiffが便利です。これらのコマンドは、終了ステータスで条件を満すと0、満たさないと0以外を返します。

時刻が48秒かを判別するには、下記のようにします。

date +'%S' | grep 48
echo $?

判定条件を毎秒繰り返す

while文を使って、条件の判定を毎秒繰り返す事ができます。

$ while true
> do
>   date +'%S' | grep 48
>   sleep 1
> done

この処理では、条件を満たしても終了しないので、終了処理を追加します。

&&は、実行したコマンドが成功した時に実行するコマンドを指定できます。 コマンドが成功(=条件を満たした)場合にbreakコマンドを実行してループを抜けます。

$ while true
> do
>   date +'%S' | grep 48 &&  break
>   sleep 1
> done
48
$

タイムアウトを設ける

timeoutコマンドを使って一定時間経過しても条件を満たさない場合は、エラーとなるようにします。

条件を満たしたか、タイムアウトになったかは、終了ステータスで判別できます。

$ timeout 60 bash -c 'while true; do   date +'%S' | grep 48 &&  break;   sleep 1; done'
48
$ echo $?
0
$ timeout 2 bash -c 'while true; do   date +'%S' | grep 48 &&  break;   sleep 1; done'
$ echo $?
124
$ 

vaultのオフシャルコンテナは、ホストOSがUbuntu 16.04 LTXでは動かない

vaultのオフシャルコンテナの0.9.5を起動すると下記のエラーがでました。

Attaching to vault
vault               | Couldn't start vault with IPC_LOCK. Disabling IPC_LOCK, please use --privileged or --cap-add IPC_LOCK
vault               | su-exec: vault: Text file busy

--privilegedなどをつけても改善しませんでした。

ホストOSがUbuntu 16.04 LTSの場合に選択されるストレージドライバが原因となるようで、課題では、ホストOSを変更するしかないみたいです。

ホストOSをUbuntu 17.10ですると解消しました。18.04 LTSが出るまでの一次避難ですん。

git commitできない

なぜだか、2つ以上のファイルをコミットしようとすると下記のようなエラーが出ます...

$ git commit           
fatal: ambiguous argument 'Makefile README.md': unknown revision or path not in the working tree.     
Use '--' to separate paths from revisions, like this:                                                 
'git <command> [<revision>...] -- [<file>...]'  
$

下記のように1ファイル毎、コミットするとエラーは出ないのですが、ファイル数が多いとつらい...

$ git commit Makefile -m "test"
[test 072a6d3] test
 1 file changed, 1 insertion(+)
$ git commit --amend -m "test"
[test ecee83b] test
 Date: Tue Feb 20 22:41:38 2018 +0900
 2 files changed, 2 insertions(+)
$

なんでだろう?