Humanity

Edit the world by your favorite way

非対話的に ~/.ssh/known_hosts を更新

qiita.com

基本は上記記事の

host="target-hostname"
ssh-keygen -R $host
ssh-keyscan -H $host >> ~/.ssh/known_hosts

でいいのだけど、(少なくとも自分の環境だと) ssh-keyscan で出力した1列目のカラムにホスト名しか出力されず、 その後別のレコード(行)としてIPアドレスが登録されてしまっていた。

hoge ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH
(hogeのIPアドレス) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH

これによって新たにプロンプトが出て待たされることはない(ホスト名が既に登録されている場合はプロンプトは出ないらしい。「Warning: Permanently added the ECDSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.」といつものメッセージが表示されて静かに追加される)。 ただ、いくつも行ができるのは何となく気持ち悪い。

そこで以下のように、

  • ホスト名から引いたIPアドレスを付加させるようにした
  • 自分の環境だと対象が CNAME で実 IP は複数ある可能性があったので、$HOST_LIST に全てのホスト名を列挙することにした *1
  • ついでに ~/.ssh/known_hosts がない時に ssh-keygen -R でエラーが出ないようガードするようにした
  • ちなみにパースできなくなるので ssh-keyscan-H はつけていない…(外した)
HOST_LIST='hostA hostB hostC'
HOST=...

get_ip_list() {
    local host
    for host in $HOST $HOST_LIST; do
        getent hosts $host || true
    done | awk '$0=$1' | sort -u | paste -d , -s
}


[ -f ~/.ssh/known_hosts ] && ssh-keygen -R $HOST
ssh-keyscan $HOST |
    awk -v "hosts=$(get_ip_list)" '$1 = $1 "," hosts' \
        >>~/.ssh/known_hosts

これにより冒頭でも示した ~/.ssh/known_hosts に追加される行は以下のようになる。

Before

hoge ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH
(hogeのIPアドレス) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH

After

hoge,(hogeのIPアドレスのリスト) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH

参考リンク

*1:アドホックなので他にいい方法があれば教えてほしい

ローカルの様々なリポジトリを GitLab につっこんだ記録

やったこと

Gitlab を VM にインストール

インストールは公式サイトの手順通りにやればすんなり入る。

Download GitLab Community Edition (CE) | GitLab


しかし、Web にアクセスしてみたら頻繁に 502 が返ってきて、ログを調べてみたらいろんなプロセスが kill されていた。 メモリが足りないっぽい(そういや前さくらVPSに立てた時もこんな事があった)。

2GB RAM is the recommended memory size for all installations and supports up to 100 users

VM に割り当てるメモリは安全のために 3072M(3G) にしといた。

2 cores is the recommended number of cores and supports up to 500 users

とも書いてあったが、CPU は 1 core のままにしといた(ケチった)。


ホスト名が local-the-host のため、リポジトリの URL が git@local-the-host:user/repos.git になってしまう。 CNAME を設定してそちらにアクセスする予定なので、ホスト名を変える。 変えるには /etc/gitlab/gitlab.rb をいじって反映させるコマンドを実行する必要がある。

For an Omnibus install, it is a little different.

The correct place in an Omnibus install is:

/etc/gitlab/gitlab.rb external_url 'http://gitlab.example.com' Finally, you'll need to execute sudo gitlab-ctl reconfigure and sudo gitlab-ctl restart so the changes apply.

How to change URL of a working GitLab install? - Stack Overflow

Omnibus っていうのは、ざっくり言ってパッケージ化されたバージョンの Gitlab。 gitlab-ctl コマンドを使って設定を反映する。

あるリポジトリをジョブ管理ツールでジョブ実行した時に git push で更新

まず今回対象のとあるリポジトリ用のユーザを Gitlab と CentOS にそれぞれ作っておく。

Gitlab では Members に Developer(push できるユーザ)として加え、 ユーザごとに作れるプロジェクト数なんてものがデフォルトで 10 に設定されてるらしいので、 Project limit を念のため 1 にした(Admin 設定からいける)。 もう動確めんどいのでやらないけど、プロジェクト作れないようにしたいなら 0 にすればいいらしい。 あと上記リポジトリ用ユーザに不要なリポジトリが見えないよう、基本全てのリポジトリは Private にしておく。

CentOS ではユーザと専用のホームディレクトリを作成し、~/.netrc に以下のように書いておく(パスワードプロンプトをスキップさせるための設定ファイル)。 セキュリティ的によろしくないけどとりあえずこれで。 SSH 鍵を転送とか考えたけど、結局ファイルやホームディレクトリのパーミッションだけ気を付けるようにした。

machine gitlab.lan
login hogeuser
password xxxxx

で、実行ユーザに注意しながらジョブ管理ツールに実行させる。 すると無事実行したスクリプトで git push して Gitlab にプッシュさせる事ができた。

ちなみにジョブ管理ツールは惰性で Hinemos 使ってるけどいい加減 Rundeck とかに移行したい(エージェントが重い)。 やるとは言ってない。

BitBucket のリポジトリを Gitlab にバックアップ

BitBucket 連携したものの、バックアップするリポジトリがなかった(終)。

(なんかあったと思ったけどゴミしかなかった)

GitHubリポジトリを Gitlab にバックアップ

GitHub 連携で楽できた。

インポートしたら GitHub のユーザ名と同じ名前空間リポジトリが作られるけど、 自分は /tyru/repo じゃなく /github/repo に作ってほしかったので、せっせこ手動で Transfer した。

ちなみに取得するリポジトリ一覧には fork したものも含まれるので、 http://<gitlab>/thinca/vim-ambicmd/ みたいに Gitlab が勝手に thinca グループ作ってくれて便利。*1

*1:こっちもせこせこ手動で削除した

本で勉強するか Web で勉強するか

最近技術書を買うかどうかの判断が確立してきた。 のでブログにまとめてみる。

自分の場合、以下のような大きい問題領域を扱う技術を本気で勉強したい、となったら本を買うと決めている。

けどライブラリツールの場合、なるべく本は買わない。 それは今までハズレが多かったから。 この「ハズレ」というのは以下の様なケースを指している。

  • 自分が知識を吸収できなかった
  • それほど得るものがなかった
  • 買ったものの情報の鮮度が古くて使えないと判断した

なぜツールとライブラリはこのようなケースが多いのか。 それはまず前提として、「ツールやライブラリは何らかの特定領域の問題を解決するためのものである」という事。

これにより界隈の状況や HW リソースの向上により問題自体が無くなったり、性質が変わったりしてしまう(Web 界隈は特にその傾向が激しい)。

また、情報の鮮度も比較的落ちやすい。 よって公式ドキュメントにあたった方が確かな情報を得られる。

また公式ドキュメントを見る他の理由として、ツールやライブラリの場合、情報が公式のコミュニティに集積しやすいというのがあると思っている。

これに関してはプログラミング言語や OS となると問題領域が大きすぎて(自分にとって)実用的な情報が公式コミュニティからは得られにくい。*1

よって、その根本的な所の思想を含めた技術を理解しないと「私○○できます」とは言えない。*2

なのでそういった類の技術だと判断したら技術書を買う事にしている。


ぶっちゃけリファレンスなら Web の方がずっと役に立つし、公式サイトを見れば分かるような本は買いたくない。

でも小ネタばかりを集めると 〜 Hacks とかみたいに結構根本につながる知識に出会えたりもする。 でもそれは Web でもできることなので、今はそういった本を積極的に買う気にはなれない…(主に経済的理由で) 個人的には Advent Calendar でいいやと思い始めている。*3

Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

*1:余談だが PHP が良質な公式ドキュメントを持つのは特定領域に特化してるから、というのは一つの原因じゃなかろうか

*2:まぁぶっちゃけどの技術に対してもそんな恐れ多い事は言えないんだけども…

*3:最近は Advent Calendar も tips 系だけじゃなくなって来てるけど… というかそもそも数多すぎ