2019-12-23 / @syui

dotfiles , archlinux

Packer + Vagrant + Ansibleで構築するdotfiles

アドベントカレンダーに参加しています。

今回は、dotfilesにAnsibleを導入してみると便利かもしれないという話をします。

自動化スクリプトが動かなくなってた話

私は、昔、ArchLinuxを自動でインストールし、dotfilesを適用し、その上でデスクトップを構築するまでを以下のコマンドでやっていた時期がありました。

$ curl -L git.io/air|zsh

ですが、最近実行してみると、やっぱり動かなくなっていたのです!

dotfilesのメンテもいつの間にかやらなくなる話

dotfilesも同じく、最初はちゃんとpushするんですが、そのうち、commitがめんどくさくなってしまい、いつの間にかメンテナンスしなくなっていました。

そんな時、Ansibleで構築してみると便利かもしれないと思ったので、今回は、Ansible + dotfilesで環境一新してみることにしたのです。

(魔界化したdotfilesは何から手を付けていいのかわからない)

Ansibleとは環境構築を自動化するツールです。dotfilesは設定ファイル群で、今回はこれらを組み合わせます。

仮想環境は、Packer, Vagrant, ArchLinuxを使います。PackerでArchLinuxのVagrantイメージを作り、その上にdotfilesをおいてAnsible Playbookを実行しデスクトップ環境を構築するという流れでやってみたいと思います。

デスクトップのi3は、Mod4 + EnterでTerminalを起動。

https://github.com/elnappo/dotfiles

Packer + VagrantでArchLinuxの仮想環境を構築

ArchLinuxは、なかなか良さげのVagrantイメージがありませんでした。ということで、Packerで作ることにします。

まずは必要なものをインストール。

$ brew install packer
$ brew cask install vagrant

続いて、Packerの設定ファイルを取ってきて、PackerでVagrantイメージを作ります(今回のために作った)。

https://github.com/syui/arch

$ git clone https://github.com/syui/arch
$ cd arch/packer
$ packer build arch.json

作ったVagrantイメージをクラウドに保存して、ダウンロード起動します。

$ vagrant login
$ vagrant box add syui/arch arch.box --force

$ vim vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "syui/arch"
  config.ssh.private_key_path = "~/.ssh/vagrant"
  config.ssh.guest_port = 22
  config.ssh.username = "arch"
  config.ssh.host = "127.0.0.1"
  config.vm.synced_folder ".", "/vagrant", disabled: true
end

# 他の人は秘密鍵がないのでsshできない(virtualboxから起動してください)
$ vagrant up
$ vagrant ssh-config
$ vagrant status
$ vagrant ssh

# pass
# root : root
# arch : arch
$ su arch
$ cd

dotfilesからAnsibleを適用する

最後に、Ansibleを適用してデスクトップを構築します。

# https://github.com/elnappo/dotfiles
$ cd dotfiles/init
$ ./setup.sh

$ startx

Ansible + dotfilesはどうなのか?

Ansibleは、初見にとってはわかりやすいです。

例えば、他人のdotfilesを一見しても、なかなか把握しづらい場合があります。ですが、Ansibleなら設定ファイルを見ればなんとなくわかります。

私のような、いつの間にかメンテナンスが億劫になって、現在使っているdotfilesがどんどんと魔界になって、自分でも把握しづらくなってしまうような人には、Ansible + dotfilesは便利かもしれないと思いました。

ですが、一方で、dotfilesをちゃんと管理できている人にとっては、絶対に、シェルスクリプトのほうがいいと思います。なぜなら、シェルスクリプトのほうが書きやすいからです。それに、時間経過で動かなくなる可能性も比較的低いですからね、シェルスクリプト。

こういう部分を修正するのは、やっぱりシェルスクリプトでやるほうが手っ取り早いことが多いのです。

なので、dotfilesを継続メンテナスできている人は、Ansibleで管理するのは、あまりおすすめできません。手間が増えるだけです。

しかし、dotfilesを構築する取っ掛かりとして、あるいは、いつの間にか放置になってしまう人にとっては、Ansibleで書いておくと、あとで動かしやすいかもしれないと思いました。

結論 : dotfilesのメンテナンスしよう!