なぜ自分は自動化をするのか?多分、他のユースケースと全く異なる理由。それは
の2つの理由。
内職がしたいというのは、プレイングマネージャー歴が長いのが理由。このプレイングマネージャーってあるときは、マネージャー、ある時は現場という会社から見てとても都合のいい役職。本来なら、現場に立たないマネージャーや、マネージメントをしない現場の高位なエンジニアと設定するべきなんだけど、人材不足なのか、役職をつけたから仕事を増やしたのか、両方させられる。この両方が曲者で、現場でトラブっているのに、マネージメントの会議とかに出させられる。現場がトラブってるから欠席なんていうものならマネージメント放棄とみなされるし。(自分からするとそっちが放棄していると思うのだが。)そうなると、会議の最中に検証環境を作ることもある。ただ、真剣にそれをやると会議で使い物にならない。パスワード設定をパチパチやっていれば、一発で内職がバレる。コマンドラインでコピペだけしていれば、そんなにバレない。そういう個人的な事情で自動化している。
新人の高品質なお仕事というのは、過去に製品検証をしていたことがある。その検証環境の構築が結構面倒で、人によってばらつきが出てしまう。自分の環境では起きるが、ばらつきのある他人様の環境では起きない。そもそも新人が作る環境は使い物にならない。なので、最初は、全員分の検証環境を作っていた。そうすると自分の仕事が止まるので、自動化してしまえということになった。saru.shというスクリプトを配り、一気に同じ環境ができるようになった。saru.shのsaruは、猿でもできるという意味。
閑話休題
Cloud-initのベーススクリプトを作ってみた。Cloud-initを知っているか、知らないかは、もはや、猿という動物を知っているか、猿すらも知らないかに近い。クラウドなんてかなり昔から使えるようになっていた。また、Ubuntuなんてデフォルトで使えるようになっている。これを使わない手はないと思う。すくなくとも人生で構築する時間のかなり多くを節約できる。(といいつつ、もはやクラウドイメージを使えば、OSのインストールとかもしないだろうし。)
今、LXDクラスタを実は作っていて、コンテナとVMで共用をしたいものを作ってみた。色々な環境で使えると思う。
設計内容
OS: Ubuntu Server 24.04
cloud-init: サイズは3KB程度しかないので、AWSのような64KBの制限のある環境でも使える。また、コンテナでもVMでも利用可能
User-Data:
-
起動時にapt upgradeを行う(初回起動に時間がかかるので。cloud-initの待ちをいれてある。)
-
root/ubuntuユーザは、~/.ssh/id_rsa.pubで証明書ログインが可能
-
ubuntuユーザのパスワードをPassword1234 (rootユーザはパスワードログイン不可)
-
/etc/rc.localの追加など、その他細かい設定
Netowork-data:
以下のようにして、Profileを作る。貼り付けたかったが、Yamlがぶっ壊れるので、Gistに。
https://gist.githubusercontent.com/masezou/93c11c4f1db96970981376c8b672166d/raw/e5431bf9e48fb68ff13abc78d3ec103a84abcedf/lxc-profile-ubuntu2404.sh
以下はインデントが壊れているので、利用するなら↑のGistのものを使う。
pubkey=”$(tr -d ‘\r\n’ < ~/.ssh/id_rsa.pub)”
lxc profile create cloudinit-ubuntu
cat <<EOF | lxc profile edit cloudinit-ubuntu
config:
cloud-init.user-data: |
#cloud-config
timezone: Etc/UTC
locale: en_US.UTF-8
ntp:
enabled: true
package_update: true
package_upgrade: true
packages:
– openssh-server
– language-pack-ja
users:
– name: ubuntu
gecos: Ubuntu
groups: [adm, sudo]
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
lock_passwd: false
ssh_authorized_keys:
– ${pubkey}
– name: root
ssh_authorized_keys:
– ${pubkey}
ssh_pwauth: true
chpasswd:
list: |
ubuntu:Password1234
expire: false
write_files:
– path: /etc/ssh/sshd_config.d/10-cloud-init.conf
permissions: ‘0644’
content: |
PasswordAuthentication yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
PermitRootLogin prohibit-password
– path: /etc/profile.d/Z99-addedcolour.sh
permissions: ‘0644’
content: |
alias diff=’diff –color=auto’
alias ip=’ip -color=auto’
– path: /etc/profile.d/Z99-custom.sh
permissions: ‘0644’
content: |
export EDITOR=vim
export SYSTEMD_LESS=FRXMK
– path: /etc/environment
permissions: ‘0644’
content: |
LANG=en_US.utf-8
LC_ALL=en_US.utf-8
– path: /etc/systemd/system/rc-local.service
permissions: ‘0644’
content: |
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
– path: /etc/rc.local
permissions: ‘0755’
content: |
#!/bin/bash
# rc.local – compatibility startup script
# Commands placed here will be executed at the end of multi-user boot
exit 0
runcmd:
– |
bash -lc ‘set -euo pipefail; export DEBIAN_FRONTEND=noninteractive; \
apt -y remove open-vm-tools
apt-get -y autoremove –purge’
chmod -x /etc/update-motd.d/00-header
chmod -x /etc/update-motd.d/10-help-text
chmod -x /etc/update-motd.d/50-motd-news
chmod -x /etc/update-motd.d/91-release-upgrade
chmod -x /etc/update-motd.d/91-contract-ua-esm-status
chmod -x /etc/update-motd.d/95-hwe-eol
– systemctl restart ssh
– systemctl daemon-reload
– systemctl enable rc-local
cloud-init.network-config: |
version: 2
ethernets:
eth0:
dhcp4: true
dhcp6: false
accept-ra: true
ipv6-privacy: false
dhcp-identifier: “mac”
enp5s0:
dhcp4: true
dhcp6: false
accept-ra: true
ipv6-privacy: false
dhcp-identifier: “mac”
description: “Ubuntu with cloud-init (SSH key, password login, auto update)”
devices: {}
name: cloudinit-ubuntu
EOF
lxc profile list cloudinit-ubuntu
Gistのシェルを実行すると、以下のようにプロファイルを追加指定ができる。
# コンテナ
CONTAINERNAME=c-test-fm-profile
lxc launch ubuntu:24.04 $CONTAINERNAME -p default -p cloudinit-ubuntu –target lxd-node1
# VM
VMNAME=vm-test-fm-profile
lxc launch ubuntu:24.04 $VMNAME –vm -p default -p cloudinit-ubuntu \
-c security.secureboot=false \
-c migration.stateful=true \
–target lxd-node1
実行してみるとちゃんと登録されているのがわかる。

以下QNAP Container Station版
https://gist.githubusercontent.com/masezou/cdc04bab6b18531049032baf73f392c4/raw/521a94c1ae2b87dc73f5b77f5b3afd93db0fe2db/lxc-qnap-profile-ubuntu2404.sh
LXD版との違いは、Network Configのみ。
QNAPで使う場合は、Container Stationからではなくコマンドラインから。またデバイス名は、matchで作ってある。動かなければ、固定にするしかない。
これは何が便利かというと、LXDで初回立ち上げた時からすぐに使える。特にネットワークの設定は、DHCPの認識をMACにするとIPアドレスが変わったりするので地味にめんどくさい。
User-Dataは、他の環境でも使えると思う。
いやー鬼のように便利だ。しかし、ここまで自由にCloud-initが使えるのは、vSphere / Ubuntu LXD / QNAP Container Stationだけなんだよなぁ。Proxmoxとかだと、ISOイメージにいれこまなければならないし、コマンドラインから設定が難しい。
これをベースにRHEL系のも作れそう。