缘起

平时常常操作 vagrant 和虚拟机,就很烦要切换到对应文件夹之后才能发出指令。

所以就搞了很多想法想要简化。

由于往往会做很多虚拟机,有时候还不断修订、改造,所以我并不喜欢采用 z name 的方式来加速目录切换,只因此时可能有很多名字相似的目录,z 对此可能比较蠢笨,不一定能 cd 到我真正想要的目的地。

工具脚本化

后来,我就考虑使用 zsh 的 hash 文件夹方案了,另外也考虑整合了在 virtualbox 中直接创建的虚拟机。最后得到了一个大大的脚本。

Hash 文件夹

Named Folder 之我所谓。这个概念以前我有文章介绍过:

Tilde 展开以及命名目录

首先,这个大大的脚本需要一个前置函数 __vms_reg

__vms_reg 函数

这是一个单独的注册片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__vms_reg() {
	hash -d | grep -qE '^vhost.ub20a=' || hash -d vhost.ub20a="$HOME/work/ops.work/ub20a.local"
	hash -d | grep -qE '^vhost.hello=' || hash -d vhost.hello="$HOME/hack/work/hello-1-cxx"

	if [ -f "$HOME/.vagrant.vhosts" ]; then
		local name1 name2
		while IFS=$'\t' read -r name1 name2; do
			if [[ "$name1" != "" ]]; then
				dbg ">> loading pair: $name1 -> $(eval echo -e $name2)"
				# hash -d | grep -qE '^vhost\.'$name1'=' ||
				hash -d vhost.$name1="$(eval echo -e $name2)"
			fi
		done <"$HOME/.vagrant.vhosts"
	fi
}

当你在一个文件夹中建立 vagrant 虚拟机的时候,例如 "$HOME/work/ops.work/ub20a.local",就可以给它指定一个助记名“ub20a”,然后在 __vms_reg 中定义一个条目。

你也可以在 $HOME/.vagrant.vhosts 中定义这样的关联关系:

1
ub20a	$HOME/work/ops.work/ub20a.local

中间以制表字符隔开

__vms_reg 函数的剩余部分是负责加载这个文件。

单独的一个 __vms_reg 函数可能是有用的,不但保持了灵活性,也提供一个 lazy load 的效果。

vagrant_run 函数

正式的函数比较大(:;),这是因为我想处理很多模糊的情况。

首先跟你讲用法。

运行一个 vagrant 虚拟机

1
2
3
4
vagrant_run ub20a
vagrant_run ub20a up
vagrant_run ub20a halt
vagrant_run ub20a destroy -f

vagrant_run 就好像 vagrant 本身一样,除了前置一个 ub20a 名字之外。这个名字是前面我们为文件夹所起的助记名。

运行 Vagrantfile 中的某一个虚拟机

如果 Vagrantfile 中定义了多个 vm 虚拟机也没关系,如同 vagrant up vm_name 那样去调用,但 vm_name 被提前了:

1
2
3
4
vagrant_run redis_va redis_001 up
vagrant_run redis_va redis_001
vagrant_run redis_va redis_001 halt
vagrant_run redis_va redis_001 destroy

列出已知的虚拟机助记名

此外,还有一个辅助子命令 list(或者 ls):

1
2
3
4
5
6
7
8
9
10
11
12
$ vagrant_run ls
VMs in virtualbox:

"armcxxbuilder_arm-cxx_1672653341445_34553" {447f620c-20d6-465d-b6f6-940b15b7cf1d}
"ubuntu20test" {546dd35c-0ef7-4414-b06c-6e0067afb394}

VMs in hash folder:

vhost.hello=~/hack/work/hello-1-cxx
vhost.redis-va=~/work/ops.work/redis-va
vhost.ub20a=~/work/ops.work/ub20a.local

运行一个 virtualbox 虚拟机

如果想直接无界面地启动某个 virtualbox 中的虚拟机的话,直接使用它的名字好了:

1
2
3
4
5
6
vagrant_run ubuntu20test
vagrant_run ubuntu20test up
vagrant_run ubuntu20test run
vagrant_run ubuntu20test halt
vagrant_run ubuntu20test stop
vagrant_run ubuntu20test shutdown

完整的脚本定义

这个大大的脚本真的是太大了,所以就放在 gist 了:

请自行按需取用吧。

小结

暂时写这么多。

留下评论