VagrantとAnsibleを使って仮想マシンでsystemd-nspawnを使えるようにする
https://github.com/nishimura/vagrant-systemd-nspawn.git
ここに置いた。
Macでの環境。
Vagrant 2.0.1 ansible 2.6.4 VirtualBox 5.1.28 VMware Fusion 10.1.3
以前使ったときに
vagrant plugin install vagrant-hostsupdater vagrant plugin install vagrant-vbguest vagrant plugin install vagrant-persistent-storage
は実行済みとして。
固定環境で立ち上げるゲストが決まっているならhostsupdaterは入れずに手動でhost編集した方が楽かもしれない。
git clone https://github.com/nishimura/vagrant-systemd-nspawn.git host-debian9 cd host-debian9 source ./myenv-example-hostonly cp ~/.ssh/id_rsa.pub data/authorized_keys vagrant up ansible-playbook -i playbook/env/hostonly/ -u root -v playbook/container-host.yml
ホストのネットワーク設定とゲストを(exampleの設定なら)三台作る。
run debootstrap のところでしばらく待つ。普通にコマンド実行したら逐次表示は出来ない…?
他のネットワークにブリッジする場合は myenv-example-vmware と playbook/env/vmware-bridge のような感じで。
VirtualBoxとVMwareを繋ぐ場合、初期値でいいなら
cp ~/.ssh/id_rsa.pub data/authorized_keys source myenv-example-vmware vagrant up ansible-playbook -i playbook/env/vmware-bridge/ -u root -v playbook/container-host.yml
これですぐ動くはず。
host01という名前を変えるなら
- myenv*
- playbook/env/*/inventory
を変える。
myenv-example-hostonly の初期値のままなら、 host01.local.test というVagrantのゲストOSをsystemd-nspawnのホストとして作り、その中に guest01.local.test、(guest02, guest03) を作る。
IP は 192.168.1.3 がホストで、末尾 11, 12, 13 がゲスト。
ホストオンリーネットワークの中でブリッジ接続していてMacから直接
ssh root@192.168.1.3 ssh root@192.168.1.11
などで入れる。
systemd-nspawnのゲストOSを入れる領域は別途ディスクを追加して Btrfs でフォーマットしている。
何度も実行しているとよく忘れるんだけど、authorized_keysをコピーし忘れてエラーになった場合は、dataに置いてから
vagrant provision
で該当箇所だけ実行。停止やリスタートの必要は無い。
ゲストを増やす場合はenvの中の変数 guests を増やして
ansible-playbook -i playbook/env/vmware-bridge/ -u root -v playbook/container-host.yml --tags=guests
を実行。差分だけ反映された感じのログが出ていればOK。
rootで入っているので所々で警告は出る。
初期状態のOSなので、何かアプリを入れたりするときは別途でそれ用のAnsible設定を使えばいいかなという感じ。
自分の場合は作業用PCがDebianなので、Vagrantの部分を飛ばして
source myenv-example-localvm cp ~/.ssh/id_rsa.pub data/authorized_keys ansible-playbook -i playbook/env/localvm -u root -v playbook/container-host.yml
という感じでssh root@localhost で入って同様の操作をしている。
ホストの /etc/hosts は変更しないけど /etc/systemd/network は変わるので、既にsystemd-networkd で何かしら設定をしている場合は消えないように現状の設定に合わせる必要がある。
Vagrantのvmごと何度も消したり立ち上げたりするとめっちゃ時間がかかったので、仮想マシンからコンテナに移る流れは分かるような気がした。
あとネットワーク設定にハマるとなかなか抜け出せない。systemdに変わってるから予備知識ゼロだったしね…。
参考:
systemd-networkd - ArchWiki
9/27 追記:
guests: - { name: guest01, ip: 192.168.1.11/24 } - { name: guest02, ip: 192.168.1.12/24 } - { name: guest03, ip: 192.168.1.13/24 }
こういう変数があったとして、このセットがVagrant用、VMware用、ローカル用、みたいな感じで複数ある。
大抵の場合は変更しないのでデフォルト値として共有したい。
これを
guests: - { name: web, ip: 192.168.1.11/24 } - { name: app, ip: 192.168.1.12/24 } - { name: db, ip: 192.168.1.13/24 }
設定が進んでくるとこのセットを全て変えたりする。
このとき、IPは同じなので
guests: - { name: web } - { name: app } - { name: db }
名前だけ変えたい。
また、Vagrant用とVMware用の設定が異なったとして、このときは名前が同じなので
guests: - { ip: 192.168.11.11/24 } - { ip: 192.168.11.12/24 } - { ip: 192.168.11.13/24 }
ipだけ変えたい。
それから、既存環境と干渉するってときに
guests: - ? - { ip: 192.168.11.111/24 } - ?
一部だけ変えたい。
変えた後も、個別設定した箇所以外は共通設定の変更が反映されるようにしたい。
プログラムならすぐなんだけどAnsibleではどうやるのか全然思い付かなくて今迷ってる。
group_varsに書くのかinventoryに書くのかincludeで読むのか、また設定ファイルの中の配列や連想配列の一部だけ書き換えるのはどうすればいいのか、わからん…。
CourseraのGoogleのやつを一つやった
すぐできるかと思ったらめっちゃ時間かかった…。
7〜8時間のうち休憩100分程度、一週間分と考えたらこんなもんなのか。
最初は律儀にビデオ見てたけど、しんどいから字幕を翻訳して読みつつ、ビデオはスライドのようにして見てた。
実際にGCPにログインして操作出来るのは良い。良いが…めっちゃ遅い。
ちょっとした操作に1分以上とか平気で待つ。その間にちょっと離席してたらタイムアウトでセッション切れるし、コマンドの途中で切れたりしたらなんか中途半端になったから最初からやりなおしたりしたし。
あとなんか指定通りやってもエラーになることがあった。
普段使いのデスクトップPCがDebian Stretchで、GCPも同じだったので他の人よりはやりやすかったと思うのだが。
最初の方のテストはビデオ見なくてもわかったから飛ばして最後の方のテストだけやってみたらほとんど間違えたりした。
なので大人しく順番に。
明日もう一度やったら半分くらい忘れてそう。
元々e-learningとか好きじゃなくて、ビデオなら更にゆっくりペースになるので完全に向いてなかった。
先に手を動かしてから後で解説読んで、もう一度手を動かすのが自分的なベスト。
あとよく考えたら当然だけれどクラウドとか機械学習とかの一般的なことじゃなくてGoogleサービスについてだった。
一つ終わって、ふーんって感じで、身に付いた感はまったくない。普通の講義ってこんなんだったか。
あと Qwiklabs の登録、新規でgmailで登録しようとしたら既に居ますってエラーになってGoogleログインでやった。30クレジットないんだけどどうなってるんだろう。
残りのコースをどうするか…。
ImageMagickで縦横比を維持したまま画像をリサイズして左右に余白を追加する
convertのオプションが多くて複数回実行する必要があるみたいな記事もあるけど
http://imagemagick.org/discourse-server/viewtopic.php?t=11525
convert -size 400x600 xc:white page.jpgs -gravity center -composite output.jpgs
これを少し変えて
convert -resize 400x600 xc:white page.jpgs -gravity center -composite output.jpgs
でいけた。
CSRFのトークンはワンタイム?
今更な話なんだけど、トークンってワンタイムの必要あるんだっけ?と思ったのでメモ。
http://takagi-hiromitsu.jp/diary/20060409.html
https://blog.tokumaru.org/2011/01/anti-csrf-onetime-token-failure-case.html
この辺が話題になってたのって10年〜5年前か…そりゃ忘れる。
Debian stretch に Kubernetes をインストール
Docker Swarm は普通に動くようだったので Kubernetesも試した。
エラーでなかなか進まず色々試してたら汚れてきたのでカッとなってVMwareで新しい環境を作ってテストした。
テストだからって普段使いのLinuxで試さない方が良さそう。
taskselで全部のチェックを外してインストールした状態からスタート。
apt-get install ssh vim
ホスト名は k8smaster.k8s.dev で。
VMware fusionだとネットワークアダプタの詳細でMACアドレスを確認しつつ
sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
host vmnet-k8smaster { hardware ethernet 00:0C:29:CC:1D:30; fixed-address 172.16.87.11; }
で固定IPにしておくとやりやすい。VMwareは一度タスクキルする。
/Applications/VMware Fusion.app/Contents/Library/vmrun -T fusion start \ ~/Documents/Virtual\ Machines.localized/debian9.vmwarevm/debian9.vmx nogui
これでウィンドウ無しで起動できるけど面倒なので閉じるときのダイアログでバックグラウンド実行でもいいかなって。
初期設定など。
update-alternatives --config editor # usr/bin/vim.basic を選択 apt install sudo visudo # 一般ユーザー ALL=NOPASSWD: ALL sudo -i
ssh-keygen cp .ssh/id_rsa.pub .ssh/authorized_keys ssh k8smaster.k8s.dev
ローカルでも sshでFQDN でログインできる必要がある?なんか認証エラーになったので。
http://d.hatena.ne.jp/n314/20180820/1534731160
前回の記事の通りやってDockerを入れる。最新版にk8sが対応していないみたいだけど多分大丈夫っぽいnoteがあったので最新版で。
スワップは使えないのでオフ。
cat /proc/swaps swapoff -a vi /etc/fstab
自動インストールしたけどswapオフにしてパーティション切れば良かった。
https://kubernetes.io/docs/setup/independent/install-kubeadm/
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
ちょっとしたアップデートでガラッと動作が変わるからholdしろってことだよね多分。
kubeadm init --pod-network-cidr=10.244.0.0/16
完了メッセージは後で実行する。
rootじゃなくて良い作業は一般ユーザーで実行する。と言ってもパスワード無しでrootになれる必要あるよね。どういう思想なんだろう。
export KUBECONFIG=/etc/kubernetes/admin.conf kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
/etc/cni/net.d/ にファイルが作られる。
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
これ以上はアーキテクチャとか仕組みとかが分かってないとマニュアルコピペじゃ無理そうなので後でやる。クラウド環境をローカルで試そうと思ったらVMwareのゲストめっちゃ立ち上げないとダメだよね。みんな富豪的に全部クラウドでやってるのかな。こういう環境が必要な人は短期間インスタンス立ち上げるぐらいの費用は誤差なのか。
ここまでで docker ps で 16コンテナ立ち上がってるんだけど…。そのうちマイクロカーネルが流行らずモノリシックカーネルに変わってきている的なことにならないんだろうか。
削除メモ。
apt remove --purge kubelet kubeadm kubectl kubernetes-cni で消えないファイルを消す。
rm -rf /var/lib/etcd rm -rf /etc/kubernetes/ rm -rf /var/lib/kubelet/ rm -rf /etc/cni/
Debian stretch で docker-machine
docker-machineのコマンドではdockerを自動インストールできない。
こういうことを自動的にやってもらうためにdocker-machineを使うと思っていたんだが…。
https://docs.docker.com/install/linux/docker-ce/debian/
apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common
souces.list.d/docker.list 追加
deb [arch=amd64] https://download.docker.com/linux/debian stretch stable
またはコマンドで。
add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable"
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - apt-get update apt-get install docker-ce
各ホストにdocker-ceをインストールした後なら docker-machine create できる。
ローカルにもdocker-ceを入れる場合はローカルからローカルへのsshの設定もしておく。
Debian stretch で tsung
だいたい https://qiita.com/nishimura/items/f3ba8e051e2983ff743b ここの通りでいいんだけど、パッケージのパス設定が色々壊れている。
普通に実行すると
Starting Tsung Log directory is: /home/user/.tsung/log/20180814-1449 Can't start ! {error, {{badmatch,{error,enoent}}, [{ts_controller_sup,start_inets,1, [{file,"src/tsung_controller/ts_controller_sup.erl"}, {line,105}]}, {ts_controller_sup,init,1, [{file,"src/tsung_controller/ts_controller_sup.erl"}, {line,91}]}, {supervisor,init,1,[{file,"supervisor.erl"},{line,294}]}, {gen_server,init_it,6, [{file,"gen_server.erl"},{line,328}]}, {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,247}]}]}}
このようなエラーになる。
パッケージのバグらしい。
https://github.com/processone/tsung/issues/169
cd /usr/lib mkdir share cd share ln -s /usr/share/tsung . cd .. ln -s /usr/lib/x86_64-linux-gnu/tsung .
本来はrootで基本のpathいじるよりはパッケージのバグを直した方がいいと思うけど。
あと tsung_stats.pl で生成したhtmlでJavaScriptが足りなかったのでコピー
cp /usr/share/tsung/templates/style/dygraph-combined.js report-dir/style/