Ansible 如何为我的家带来和平

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

freephotocc 通过 Pixabay CC0

几个月前,我在 Opensource.com 上阅读了 Marco Bravo 的文章 如何使用 Ansible 记录流程。我承认,当时我并没有完全理解。我当时没有积极使用 Ansible,并且我记得当时觉得它看起来像是事倍功半。但我保持着开放的心态,并决定花时间深入了解 Ansible。

我很快找到了一个借口开始我的第一次真正的 Ansible 冒险:像 如何让旧电脑再次发挥作用 中那样重新利用旧笔记本电脑。我一直喜欢玩旧电脑,并且使用现代方法自动化某些东西的前景引起了我的兴趣。

任务

今年早些时候,我给了我七岁的女儿一台重新利用的戴尔 Mini 9,它运行着某种 Ubuntu 版本。起初,我六岁的女儿不太在意,但随着音乐响起,她发现了有趣的程序,她的兴趣就来了。

我意识到我很快就需要为她再造一台。任何有年龄相近的幼儿的父母都可能理解我的困境。如果两个孩子没有得到相同的东西,就会产生冲突。相似的玩具、相似的衣服、相似的鞋子……有时颜色、形状和闪烁的灯光都必须相同。我确信她们会注意到笔记本电脑配置上的任何差异,这会成为争论的焦点。因此,我需要这些笔记本电脑具有相同的功能。

此外,由于还有小孩在其中,我怀疑我需要多次重建这些东西。故障、事故、升级、损坏……这有可能成为时间黑洞。

由于两个小女孩共用一台戴尔 Mini 9 并不是一个可行的解决方案,我从我的旧硬件堆里抓了一台戴尔 D620,升级了 RAM,装上了一个廉价的 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 文件仍在不断发展。它包括一组用于系统管理员的基本实用程序,然后是我的用户需要的东西。这主要包括确保每台机器上都安装了相同的图形用户界面 (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,并升级了 RAM。这是让旧硬件焕发新生的又一个完美例子。

我从源代码控制中拉取了我的 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…),我想知道你的直觉是否属于这些原因中的任何一个,还是有其他原因?谢谢!

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.