我有一个秘密要坦白——虽然我的职位头衔中带有“云”这个词,但我曾经认为云只是一些流行语、炒作和虚无缥缈的东西,没有任何实质内容。最终,Ansible 成了我通往云端的门户。在本文中,我将介绍如何使用 Ansible 进行 DevOps。
在 Ansible 出现之前,我是一名系统管理员,乐于部署裸机服务器和虚拟机,每个新项目都需要自己定制的基础设施。当然,初始操作系统的部署是通过 Kickstart 自动化的,但随后需要进行一系列手动步骤,才能让服务器为应用程序所有者做好准备。这是一个缓慢的过程,但我知道,当我完成时,我交付的是一个经过微调的系统,它将在未来几年像冠军一样运行。
我为所有事情编写了 bash 脚本,其中一些甚至有适当的错误检查。我对自己知道的和所做的事情充满信心,并且看不到任何改变的理由。我很舒适。然后我开始越来越频繁地从我们的各种供应商那里听到这个词:云。云是什么意思?问十个人来定义它,你会得到十个不同的答案。由于对云没有具体的概念,我和我的系统管理员团队将其归为无稽之谈。
通往云端的门户
然后我开始使用 Ansible。这种联系可能一开始并不明显,但它确实成为了通往云端的一个门户。当我第一次开始使用 Ansible 时,对我来说它只是一个美化版的 bash+SSH 包装器,但这是在好的方面。playbook 语法很容易理解,而且编写起来很有趣。随着时间的推移,我将所有那些老旧的 bash 脚本翻译成了优雅的、具有错误检查功能的、幂等的 Ansible playbook。
像这样的垃圾代码
#!/bin/bash
user_exists=$(grep -c davidc /etc/passwd)
if [[ $user_exists -eq 0 ]]; then
useradd -m -s /bin/bash davidc
echo PASSWORD | passwd davidc --stdin
fi
变成简洁的一行代码
- user: name=davidc shell=/bin/bash password=$6$
rounds=656000$47cizb4beOY.uB9c$w
TlFCrP62g/M0.UNl0IHLOOw.fuWvJwCQLLS
8UeruI1T/tbAdKd8Wzhsy7SandrOtROwBn7F
BZHTaZcZciXMd
我不再需要每次部署新服务器时都使用 SCP(安全复制)来复制一堆脚本。从一个中心位置,我可以突然管理和自动化数千台服务器。我扩展了规模!而且没有通常在每次系统管理员被要求安装“又一个第三方代理”时出现的眼部抽搐。
上面是一个使用 user 模块的示例。Ansible 有大量的模块。我意识到,仅仅将 Ansible 用作 bash 替代品,我只是触及了皮毛。随着我对 Ansible 的深入了解,我找到了在 libvirt 上部署虚拟机 (VM)、在 Kubernetes 中部署容器以及在 OpenStack 中部署 Nova 实例的模块。后两者尤其引起了我的兴趣。Ansible 使将我的数据中心视为代码变得非常容易,并为编排新兴技术(如容器和云实例)提供了一个友好的界面。所有这些都成为可能,因为这些平台通过公开可访问的 API 端点公开其服务。
那时我才恍然大悟:云实际上并没有那么虚无缥缈。当你深入了解其核心时,云只是一堆服务,它们结合在一起提供一个平台来完成工作。它将我所了解和热爱的 Unix 哲学提升到了更大的规模:编写只做一件事并把它做好的程序。调用一个网络服务来配置软件定义的端口,另一个调用计算服务来获取容器或虚拟机,从 Git 中拉取一些代码,然后就弹出一个正在运行的应用程序。“云”和“DevOps”现在被揭开了神秘面纱。微服务?将 cat(5)
包装在一个 API 中,你就编写了你的第一个微服务。通过 Ansible,我理解了这一切。
构建个人 DevOps 测试实验室
我一直认为,要成为一名伟大的系统管理员——扩展你的知识并保持与时俱进——应该运行某种形式的个人网络。这个网络应该有一个目的,以保持管理员的兴趣。就我而言,我是一个狂热的唱片收藏家。自从大学以来,我一直在运行某种形式的 LAMP 堆栈,其中包含我的自制唱片数据库。该项目最初是用 PHP 和 MySQL 开发的。在重建的情况下,需要一天的时间来配置新的虚拟机,拉取(希望是)最新的数据库和代码备份,并祈祷它不会太损坏。凭借我通过 Ansible 学到的知识,我决定重建整个系统。我会重新做一遍,考虑到 DevOps,这样当应用程序所有者开始提出要求时,我就知道我在说什么了。
在这个过程中,我学到了很多东西。我偶然发现了我认为的 DevOps 的三大支柱
- 源代码控制
- 编排
- 平台
如果你能让这三件事协同工作,你就会成为摇滚明星。开源的美妙之处在于,这些支柱有很多不同的实现方式,你可以自由选择最适合你的堆栈。
对于我的实验,我选择了 Git、Ansible 和 Kubernetes。在一个存储库中,我的应用程序代码与我的基础设施代码并存,Ansible 充当粘合剂,将它们粘合在一起。其中有一个 Docker 文件以及我的 Kubernetes 环境的所有配置文件(卷、pod、路由等)。通过 Ansible playbook,应用程序的容器镜像被构建并推送到注册表。进一步的 Ansible 任务负责将 pod 和支持基础设施部署到 Kubernetes 集群上。
当对 repo 进行 Git 提交时,Git post-commit hook 会触发 Ansible play 以利用 Kubernetes 中的 ReplicationController 对象。该 play 会拆除现有的应用程序 pod,强制使用最新代码重建容器。一个廉价的持续集成/持续部署平台!它可能不适合企业级使用,但对于实验室和学习所有这些新技术来说非常棒。
我还没有完成。现在我可以学习 Jenkins 和自动化测试了。Ansible 也在不断发展。Ansible-container 模块最近发布了,我渴望看到它如何改进我的工作流程。
因此,对于所有对“云”持怀疑态度的系统管理员来说,他们认为“云”只不过是流行语和炒作,我鼓励你们深入研究并亲自尝试一下。试用 Ansible,并细细品味当你从单个命令行部署你的第一个完整堆栈时的那种满足感。
David Critch 将在 8 月 23 日在多伦多举行的 ContainerCon 演讲中更详细地介绍 使用 Ansible 和 Kubernetes 进行 DevOps。
3 条评论