几个月前,我在 Opensource.com 上读了 Marco Bravo 的文章 如何使用 Ansible 记录流程。我承认,当时我并没有完全理解。我当时没有积极使用 Ansible,并且我记得当时认为这看起来像是得不偿失。但我抱着开放的心态,决定花时间深入研究 Ansible。
我很快找到了一个借口来开始我的第一次真正的 Ansible 冒险:像 如何让旧电脑再次发挥作用 中那样改造旧笔记本电脑。我一直喜欢玩旧电脑,并且用现代方法自动化一些东西的前景激起了我的兴趣。
任务
今年早些时候,我给了我七岁的女儿一台改装过的戴尔 Mini 9,运行着某种 Ubuntu。起初,我六岁的女儿并不太在意,但随着音乐的播放,她发现了有趣的程序,她的兴趣也随之而来。
我意识到我很快需要为她再建一台。任何有年龄相近的小孩子的父母都可能认同我的困境。如果两个孩子没有得到相同的东西,就会产生冲突。类似的玩具、类似的衣服、类似的鞋子……有时颜色、形状和闪烁的灯光都必须相同。我确信他们会注意到笔记本电脑配置上的任何差异,并且这会成为争论的焦点。因此,我需要这些笔记本电脑具有相同的功能。
此外,考虑到有小孩参与其中,我怀疑我需要多次重建这些东西。故障、事故、升级、损坏……这可能会成为时间黑洞。
由于两个小女孩共用一台戴尔 Mini 9 并不是一个真正可行的解决方案,我从我的一堆旧硬件中抓起一台戴尔 D620,升级了内存,装上了一个廉价的 SSD,并开始酝酿一个可重复的过程来构建孩子们的电脑配置。
如果你仔细想想,这项任务似乎非常适合配置管理系统。我需要一些东西来记录我正在做的事情,以便它可以轻松地重复。
Ansible 来解救
我没有尝试设置一个完整的预启动执行环境 (PXE) 来支持偶尔的笔记本电脑安装。我想教我的孩子们为我做一些安装工作(另一种自动化,哈!)。
我决定从一个最小的操作系统安装开始,最终将我的 Ansible 方法分解为三个部分:引导启动、帐户设置和软件安装。我可以将所有内容都放在一个巨大的脚本中,但分离这些功能使我可以为其他项目混合和匹配它们,并随着时间的推移单独改进它们。 Ansible 的 YAML 文件可读性帮助我在改进系统时保持清晰。
对于这个笔记本电脑实验,我决定使用 Debian 32 位作为我的起点,因为它似乎在我的旧硬件上效果最佳。引导启动 YAML 脚本旨在采用最少的操作系统安装并将其提升到某种标准。它依赖于可通过 SSH 使用的非 root 帐户,仅此而已。由于最小的操作系统安装通常只包含对 Ansible 非常有用的东西,因此我使用以下命令来击中一台主机并提示我使用权限提升登录
$ ansible-playbook bootstrap.yml -i '192.168.0.100,' -u jfarrell -Kk
该脚本利用 Ansible 的 raw 模块来设置一些基本要求。它确保 Python 可用,升级操作系统,设置 Ansible 控制帐户,传输 SSH 密钥,并配置 sudo 权限提升。当引导启动完成后,一切都应该到位,以便此节点完全参与我的更大的 Ansible 清单。我发现引导启动最少的操作系统安装是细致入微的(如果有人感兴趣,我将撰写另一篇文章来讨论这个主题)。
帐户 YAML 设置脚本用于为每个家庭成员设置(或重置)用户帐户。这使我们拥有的少量机器上的用户 ID (UID) 和组 ID (GID) 保持一致,并且可以在需要时用于修复锁定的帐户。是的,我知道我可以设置网络信息服务或 LDAP 身份验证,但我拥有的帐户数量非常少,我更喜欢保持这些系统非常简单。这是我发现特别有用的一个摘录
---
- name: Set user accounts
hosts: all
gather_facts: false
become: yes
vars_prompt:
- name: passwd
prompt: "Enter the desired ansible password:"
private: yes
tasks:
- name: Add child 1 account
user:
state: present
name: child1
password: "{{ passwd | password_hash('sha512') }}"
comment: Child One
uid: 888
group: users
shell: /bin/bash
generate_ssh_key: yes
ssh_key_bits: 2048
update_password: always
create_home: yes
vars_prompt 部分提示我输入密码,该密码被放入 Jinja2 转换以生成所需的密码哈希。这意味着我不需要将密码硬编码到 YAML 文件中,并且可以运行它来根据需要更改密码。
软件安装 YAML 文件仍在不断发展。它包括 sysadmin 的基本实用程序集,然后是我的用户需要的东西。这主要包括确保每台机器上都安装了相同的图形用户界面 (GUI) 界面以及所有相同的程序、游戏和媒体文件。这是为我的年幼的孩子们准备的一小部分软件
- name: Install kids software
apt:
name: "{{ packages }}"
state: present
vars:
packages:
- lxde
- childsplay
- tuxpaint
- tuxtype
- pysycache
- pysiogame
- lmemory
- bouncy
我使用虚拟机创建了这三个 Ansible 脚本。当它们完美时,我在 D620 上测试了它们。然后转换 Mini 9 就变得轻而易举;我只需加载相同的最小 Debian 安装,然后运行引导启动、帐户和软件配置。然后两个系统都以相同的方式运行。
一段时间以来,两个姐妹都享受着她们各自的电脑,比较使用情况并探索软件功能。
关键时刻
几周后,不可避免的事情发生了。我的大女儿最终得出结论,她的粉色戴尔 Mini 9 性能不足。她妹妹的 D620 具有更强大的性能和更大的屏幕空间。 YouTube 成为了新的潮流,而 Mini 9 无法跟上。你可以猜到,可怜的 Mini 9 被弃用了;她想要一台新机器,而与她妹妹共用一台是不行的。
我的旧硬件堆里还有一台 D620。我更换了 BIOS 电池,给它装上了一个新的 SSD,并升级了内存。这是又一个为旧硬件注入新生命的完美例子。
我从源代码控制中拉出了我的 Ansible 脚本,我需要的一切都在那里:引导启动、帐户设置和软件。到那时,我已经忘记了很多具体的软件安装信息。但是诸如帐户 UID 和所有要安装的软件包之类的细节都已清晰地记录下来并准备就绪。虽然我肯定可以通过查看我的其他机器来弄清楚,但没有必要花费时间! Ansible 已经将所有内容都清晰地呈现在 YAML 中。
YAML 文档不仅有价值,而且 Ansible 的自动化使新安装变得轻而易举。从 USB 驱动器安装最小的 Debian 操作系统大约需要 15 分钟。随后使用 Ansible 进行最终用户部署来整理系统只花了另外九分钟。最终用户验收测试成功,我的家庭迎来了一个新的计算平静时代(其他父母会理解!)。
结论
通过这个练习花时间学习和实践 Ansible,让我看到了其自动化和文档化能力的真正价值。每当我需要配置或修复机器时,花几个小时弄清楚第一个示例的具体细节可以节省时间。 YAML 清晰、易于阅读,并且——由于 Ansible 的幂等性——易于测试和随着时间的推移进行改进。当我有新想法或我的孩子们有新要求时,使用 Ansible 来控制本地虚拟机进行测试是一个有价值的省时工具。
在空闲时间执行系统管理员任务可能很有趣。花时间自动化和记录你的工作在未来会带来回报; Ansible 会记录你的工作并随时准备应用,这样你就可以继续处理其他更新鲜有趣的事情,而无需调查和重新学习一大堆你已经解决的事情!
3 条评论