Ansible 如何为我的家庭带来安宁

这位父亲使用 Ansible 配置了他年幼女儿的电脑,从而轻松管理家庭电脑。
239 位读者喜欢这篇文章。
Getting started with Perlbrew

freephotocc via Pixabay CC0

几个月前,我在 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 会记录你的工作并随时准备应用,这样你就可以继续处理其他更新鲜有趣的事情,而无需调查和重新学习一大堆你已经解决的事情!

接下来阅读什么
James Farrell
我是一位长期的 UNIX 系统管理员和开源倡导者。近年来,我的主要重点是 Linux 和 FreeBSD 系统管理、网络、电信和 SAN/存储管理。我喜欢构建基础设施、将系统连接在一起、创建流程以及将人们聚集在一起以支持他们的技术努力。

3 条评论

Ansible 用法不错!感谢分享! \o/

很棒的故事 James,感谢分享!我有一个问题……你说“我记得当时认为这看起来像是得不偿失”。我真的很想知道你为什么在表面上认为它看起来像那样?是有一种直觉,还是只是因为它是新的东西?过去我曾谈到人们为什么不自动化 (https://www.slideshare.net/MarkPhillips16/migrating-the-runbook-from-le…),我想知道你的直觉是否属于这些原因中的任何一个,或者是否有其他原因?谢谢!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.