ログ日記

作業ログと日記とメモ

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 のような感じで。
VirtualBoxVMwareを繋ぐ場合、初期値でいいなら

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 で何かしら設定をしている場合は消えないように現状の設定に合わせる必要がある。




Vagrantvmごと何度も消したり立ち上げたりするとめっちゃ時間がかかったので、仮想マシンからコンテナに移る流れは分かるような気がした。
あとネットワーク設定にハマるとなかなか抜け出せない。systemdに変わってるから予備知識ゼロだったしね…。



参考:
systemd-networkd - ArchWiki


qiita.com
qiita.com



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で読むのか、また設定ファイルの中の配列や連想配列の一部だけ書き換えるのはどうすればいいのか、わからん…。