使用ansible来管理dotfiles,现在停止使用了
前言
写一篇关于如何使用Ansible管理dotfiles的故事。
得出结论
-
- ローカルPCだけならAnsible使わなくてよかった
-
- 普通のシェルスクリプトか、スクリプト言語で良い
- 最終的にAnsible使わないようにした
背景
最初使用Shell脚本来管理dotfiles。
正如其他文章所述,这只是一个创建普通符号链接的脚本。
但是,由于工作上可能很快要开始写Ansible脚本,所以我决定兼顾学习,将之前用Shell脚本编写的内容改用Ansible重写。
从这里开始,我开始使用Ansible来管理dotfiles。
最后,我发现管理变得困难,因此决定回到使用脚本编写。
之前使用Ansible进行管理的内容已经保存在另一个分支中。
以下是该内容。
dotfiles的组成
目前的dotfiles配置如下。
.
|-- ansible
| |-- roles
|-- ConEmu.xml
|-- README.adoc
|-- bash
| |-- bashrc
| |-- conf.plugins.d
| `-- plugins.sh
|-- bin
|-- code
| |-- README.md
| |-- dump_extentions.sh
| |-- extensions.txt
| `-- user
|-- config.nims
|-- docker-compose.yml
|-- git
| `-- commit.template
|-- i3
| `-- config
|-- krita.shortcuts
|-- lib
| `-- sh
|-- note.md
|-- setup.sh
|-- spacemacs
|-- termite
| `-- config
|-- tmux.conf
|-- user-dirs.dirs
|-- vim
| |-- README.adoc
| |-- after
| |-- colors
| |-- conf.d
| |-- conf.plugins.d
| |-- dict
| |-- gvimrc
| |-- init.vim
| |-- plugins.vim
| |-- template
| |-- vimperatorrc
| |-- vimrc
| |-- vimrc.min
| `-- vrapperrc
`-- zsh
|-- README.md
|-- conf.d
|-- img
|-- plugins.zsh
`-- zshrc
21 directories, 45 files
为了管理方便,我将vimrc和bashrc分割成多个文件,并在目录中进行管理。此外,我还将bash和zsh的设置分开,并将它们共享的内容放置在lib/sh中,这导致了复杂的依赖关系。
角色和剧本的结构
我的 dotfiles 文件夹里面存放着 Ansible 相关的配置文件。
角色的划分大致如下。
clojure/tasks
common_deploy
common_setup/tasks
docker/tasks
font
git/tasks
go
i3
nim
nodejs/tasks
python/tasks
shell
terminal
vim
vscode
将安装工具和配置文件放置在一个角色中。
由于Ansible可以编写以集中控制为目标的脚本,所以我认为这种总结方式很好,于是我做了这个总结。有时候可能只想更新nim,只想更新Go等等。
所以,playbook大致是这个样子的。
- hosts: localhost
connection: local
vars_files:
- "vars/env.yml"
roles:
- role: common_deploy
- role: nodejs
tags: [update]
- role: python
tags: [update]
- role: git
- role: go
- role: docker
- role: vim
tags: [update]
- role: shell
- role: i3
- role: terminal
- role: font
- role: vscode
- role: nim
有什么不好的地方吗?
最终决定将以 Ansible 编写的 playbook 转回为 shell 脚本。原因何在?
写得不流畅
从个人的观点来看,使用脚本更容易编写和阅读。
使用YAML编写部署的好处是,即使多人合作,也不会有太大的编写方式差异,并且即使是无法理解或编写脚本的人也能进行维护。
在多人维护时,使用Ansible的YAML是减少对技术理解差异的一种方法之一。
如果只有我自己写和维护dotfiles,我认为只需要我写得最容易的方式就可以了。
在Ansible的YAML中表达条件分支很麻烦,写起来也不方便。
角色分配几乎没有意义
Ansible是一种用于为多个远程环境进行配置管理的工具,它在这个过程中发挥了作用。
当需要设置相同的中间件但服务器角色不同时,可以通过将角色按中间件单元划分来重复使用角色,从而避免重复管理配置。
这使得Ansible非常强大。
尽管如此,由于只有一台本地电脑,即使进行角色分配也无法在其他设置中进行重复使用,因此并不是很开心。
相反,文件分散,不知道哪里有什么设置,反而增加了维护的复杂度。
回想一下,或许将所有任务都以横向方式写在一个文件中也是一种方法。
思考
嗯,我试着用Ansible来管理dotfiles,作为学习的一部分。
由于通过Ansible完成了dotfiles的管理,我学习了Ansible的使用方法、编写方式、最佳实践以及查阅文档的技巧。
无论是工作还是私人使用的服务器,我都使用Ansible,并且我觉得把它作为学习的工具非常有意义。
但是,如果只是管理自己本地的个人电脑,使用命令行或脚本语言会更方便。
正如最强的 dotfiles 驱动开发和在 GitHub 上进行管理的操作方式所述,我认为Shell非常好用。
我最终使用NimScript重写了dotfiles的链接。我将所有内容都写在一个文件中。
这篇文章不是关于dotfiles的,而是关于ansible的文章吗?
以上是全部内容。