正常な人間は OS を何回も再インストールしない。

Introduction

全国の Arch Linux インストール芸人の皆さん、こんにちは。
最近の Arch Linux には archinstall とかいうクソ便利なツールが組み込まれているのを知ってから Manjaro を触らなくなりましたが、OS のインストール後に行う各種環境のセットアップには毎度苦しめられてしまいます。

具体的には、git 入れたり yay 入れたり zsh 入れたり rclone 入れたり firefox 入れたり chrome 入れたり VSCode 入れたり fcitx 入れたり fonts 入れまくって discord 入れたり slack 入れたり zoom 入れたり steam 入れたり virtualbox 入れたり libvirt 入れたり docker 入れたり gimp obs-studio vlc clamav wireshark unarchiver jsongorntgingoahgnpuoaergneauiolghnerughapughreuhterphftgiufaerhgpoiuerahngliaerg

で、バカほどパッケージ入れた後は clamav のサービス有効化とか docker も libvirt もそうですし group もいじって rclone の設定も作って Xfce の各種設定をいじり倒してfcit異fhrgh直井gホイパghじゃろう家hg;おいあえrh五話園g;おいdファhj技pdsrfんhgpヘアろ言うgへrくぁいお号;絵swrth祇王pレ5hy08qw358hytgh8793hyp9qr5絵3wh8y9gくぁ絵rh90;y8ghr3エアq08wgyhwれ3

みたいな操作を OS 入れ直す度にやらされるのが流石に辛くなってきたので、重い腰をようやく上げて、当エントリにて開発環境を Ansible で構成管理する際の一例を示すことにします。

Puppet V.S. Chef V.S. Ansible V.S. SaltStack

そもそもエージェントレスじゃないとだるくてやってられんみたいなところはある。

Puppet

ギョームで気が狂うほど書いているので Puppet が一番慣れているところですが、初回のセットアップがだるいので、今回のように1台だけしか管理しないケースでは Puppet でなくてもよいでしょう。

Chef

知らん

SaltStack

マジで知らん

Ansible

まあ Ansible になるわな。
sudo pacman -S ansible だけ打っておけば、他に Global の設定をいじる必要など特に無いのでクソ楽です。

Example はよくれ

おらよ https://github.com/voltaxic-rift/archlinux-ansible-example

流れとしては

  • Arch Linux をインストール
    • archinstall 使ってやる等
    • この段階はどうしても手動に頼らざるを得ない
  • sudo pacman -S ansible git
  • 安全な方法で秘密鍵を持ってくる (optional)
  • 対象の repo を Clone する (今回は archlinux-ansible-example を使う)
    • git clone git@github.com:voltaxic-rift/archlinux-ansible-example.git
    • https でもいい
  • Ansible Playbook 適用 (以下 Usage に記載)

Usage

1
2
ansible-galaxy collection install -r requirements.yml
ansible-playbook -i hosts -K playbook.yml

以上!

Package 追加したい

roles/arch_packages/tasks/main.yml に Package を追記することで、構成管理に含めることができます。
AUR の場合は roles/aur_packages/tasks/main.yml

zsh に変えたり色々やりたい

例えばこういうのを roles/zsh/tasks/main.yml として作ります
https://github.com/voltaxic-rift/archlinux-ansible-example/blob/66d2537f77af6c4017150699f12f13bdba2443d6/roles/zsh/tasks/main.yml

1
2
3
4
5
6
7
8
9
10
11
---
- name: Add .zshrc
copy:
src: .zshrc
dest: /home/jadiunr/.zshrc
become: no

- name: Change login shell to zsh
user:
name: jadiunr
shell: /bin/zsh

roles/zsh/files/.zshrc を作ります (中身はお好みで)
https://github.com/voltaxic-rift/archlinux-ansible-example/blob/66d2537f77af6c4017150699f12f13bdba2443d6/roles/zsh/files/.zshrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000000
SAVEHIST=1000000
bindkey -e
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '/home/jadiunr/.zshrc'

autoload -Uz compinit promptinit
compinit
promptinit
# End of lines added by compinstall

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh
source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

# ghq alias
alias g='cd $(ghq root)/$(ghq list | peco)'

# ls with colored
alias ls='ls --color=auto'

# uid, gid
export UID=`id -u`
export GID=`id -g`

playbook.ymlzsh role を追記します。
https://github.com/voltaxic-rift/archlinux-ansible-example/blob/66d2537f77af6c4017150699f12f13bdba2443d6/playbook.yml

1
2
3
4
  - arch_packages
- yay
- aur_packages
+ - zsh

最後に playbook 実行で、変更が適用されます。

1
ansible-playbook -i hosts -K playbook.yml

例に挙げた .zshrc の場合、初回起動時に ~/.p10k.zsh を作成するセットアップウィザードが走ることに注意。
この辺は面倒 (あと zsh まわり詳しくない) なのでよしなにどうぞ。

そのた

他にも、docker, vboxusers group 追加など、ClamAV の導入など、都度 Role を作って適用することで、ある程度は良い感じに管理できるはずです。

ちなみに、Package のインストールは全部 arch_packages role にブチ込んでいます。
Role 毎に install を分けてもよいですが、入れるだけで完結する Package まで Role を分けたりしていると無駄に複雑になるので、まとめてしまったほうが管理しやすいと考えます。
Package install 以外の設定を入れたくなったときに Role を生やすのが個人的におすすめです (さっきの zsh のように)

Conclusion

正常な人間は OS を何回も再インストールしない。
あと fcitx とかの設定を構成管理に含めるのはクッッッッッッッッッッッッッッッッッッッッッッソだるいので、妥協を強いられる場面はどうしても発生します。
(Plasma の諸々の設定とかもね)
という具合ですが、少しでも楽したい人はこういうのを作っておくとよいかもしれません。
よい re-install ライフを。