我有大约十几个运行 Linux 的工作站,我需要一个系统以某种方式保持它们同步(安装相同的软件、相同的配置、相同的用户……),同时还允许我及时改进它们(例如配置更改、驱动程序更新、新软件……)。诀窍是,有时,其中一些会脱机,并且仅在几周甚至几个月后才重新激活,有时会添加新的工作站,需要从头开始配置。
我正在考虑使用Ansible它看起来很棒,但就我的用例而言,它有两个缺点:
- 它没有自动更新功能(当一个盒子在长时间不活动后启动时,我需要在控制站上手动运行剧本)
- 经过多年的生产,剧本会变得非常长。在只错过几个更新的工作站上运行它会非常低效。即使所有任务都是幂等的,每个任务都必须发送到工作站才能查看是否执行。将剧本分成更小的部分也不理想,因为它需要跟踪执行的内容和位置。
我正在考虑的替代方案是拥有一个脚本存储库并使用GNU Make来运行它们。制作用于从源文件更新目标,它基本上在源文件上运行命令以产生输出(例如将 C 程序编译为二进制文件)。如果我将脚本视为源文件,那么像这样的 Makefile 就可以完成这项工作:
TASKS= \
install_apps \
start_services \
add_users
TARGETS=$(TASKS:=.done)
all: $(TARGETS)
%.done: %.sh
echo "running $<"
./$<
touch $@
当其中一个工作站启动时,它可以自动拉取脚本仓库并运行制作有了这个系统,任务只需运行一次,并且按照列出的顺序运行。
问题
- 你认为我列出的缺点是错误的吗?也许有一种方法/解决方法可以实现我的目标,使用Ansible
- 您觉得我提出的替代方案有什么问题吗?请记住,上述 Makefile 是简化的,还不能用于生产。
答案1
第一个缺点是,Ansible 是一个基于推送的系统,可以通过使用ansible-pull。ansible-pull
从 VCS 存储库中提取剧本,并在本地主机上执行它们
ansible-pull
可以由 cron 或启动脚本触发。
长时间运行剧本的第二个缺点确实存在。Ansible 不是市场上最快的配置管理系统。但是,可以使用以下方法缩短 Ansible 的执行时间:丝裂原而且相对容易实现条件语句跳过剧本的某些部分以加快播放速度,如下所示:
- name: Register a variable
ansible.builtin.shell: cat /etc/motd
register: motd_contents
- name: Use the variable in conditional statement to run long running play
include: otherplays.yaml
when: motd_contents.stdout.find('hi') != -1
如果您编写剧本时考虑了执行时间,它可以像普通 bash 一样快。
总的来说,Ansible 提供了很多有用的工具来配置系统。Ansible 中可能没有什么是不能使用Make
和之类的东西来实现的Bash
。Ansible 相对于 Bash 的优势在于,很多人发现它更容易使用,代码更易读。