配置管理是服务器管理和 DevOps 非常重要的方面。“基础设施即代码”方法使得在各种配置中部署服务器以及动态扩展组织的资源以满足用户需求变得容易。但是,对于希望自动化设置自己的笔记本电脑和台式机(工作站)的个人管理员,关注较少。
在本系列中,我将向您展示如何通过 Ansible 自动化您的工作站设置,这将使您在想要或需要重新加载机器时轻松恢复您的整个配置。此外,如果您有多个工作站,您可以使用相同的方法使每个工作站上的配置相同。在第一篇文章中,我们将为我们的个人或工作计算机设置基本的配置管理,并为本系列的其余部分奠定基础。在本文结束时,您将拥有一个可以立即从中受益的工作设置。每篇文章都将自动化更多的事情,并在复杂性方面不断增长。
[阅读本系列文章的第二部分。]
为什么选择 Ansible?
有许多配置管理解决方案可用,包括 Salt Stack、Chef 和 Puppet。我更喜欢 Ansible,因为它在资源利用方面更轻量级,其语法更易于阅读,并且如果正确利用,它可以彻底改变您的配置管理。Ansible 的轻量级特性与手头的主题尤其相关,因为我们可能不想仅仅为了自动化设置我们的笔记本电脑和台式机而运行整个服务器。理想情况下,我们想要一些快速的东西;如果我们需要恢复我们的工作站或在多台机器之间同步我们的配置,我们可以用它来快速启动并运行。我针对 Ansible 的特定方法(我将在本文中演示)非常适合这一点——无需维护服务器。您只需下载您的配置并运行它。
我的方法
通常,Ansible 从中央服务器运行。它利用一个清单文件,该文件是一个文本文件,其中包含我们希望 Ansible 管理的所有主机及其 IP 地址或域名列表。这对于静态环境非常有用,但对于工作站来说并不理想。原因是我们真的不知道我们的工作站在任何时刻的状态。也许我关闭了我的台式机,或者我的笔记本电脑可能处于挂起状态并放在我的包里。在任何一种情况下,Ansible 服务器都会抱怨,因为它无法访问离线的机器。我们需要一种更按需的方法,我们将通过使用 ansible-pull
来完成。ansible-pull
命令是 Ansible 的一部分,允许您从 Git 存储库下载您的配置并立即应用它。您无需维护服务器或清单列表;您只需运行 ansible-pull
命令,向其提供 Git 存储库 URL,它就会为您完成剩下的工作。
开始入门
首先,在您要管理的计算机上安装 Ansible。一个问题是许多发行版都附带旧版本。我可以根据经验告诉您,您肯定需要最新的可用版本。新功能经常被引入 Ansible,如果您运行的是旧版本,您在网上找到的示例语法可能无法使用,因为它使用的是您已安装版本中未实现的功能。即使是小版本更新也有很多新功能。其中一个例子是 dconf
模块,它是 Ansible 2.4 的新功能。如果您尝试使用利用此模块的语法,除非您拥有 2.4 或更新版本,否则它将失败。在 Ubuntu 及其衍生版本中,我们可以使用官方个人软件包存档 (PPA) 轻松安装最新版本的 Ansible。以下命令将完成这项工作
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
如果您没有使用 Ubuntu,请查阅 Ansible 的文档,了解如何为您的平台获取它。
接下来,我们将需要一个 Git 存储库来保存我们的配置。满足此要求的最简单方法是创建一个空存储库,或者如果您有自己的 Git 服务器,则可以使用您自己的 Git 服务器。为了保持简单,我假设您正在使用 GitHub,因此如果您使用其他工具,请调整命令。在 GitHub 中创建一个存储库;您最终将得到一个类似于此的存储库 URL
git@github.com:<your_user_name>/ansible.git
将该存储库克隆到您的本地工作目录(忽略任何抱怨存储库为空的消息)
git clone git@github.com:<your_user_name>/ansible.git
现在我们有了一个可以使用的空存储库。将您的工作目录更改为存储库内(例如 cd ./ansible
),并在您喜欢的文本编辑器中创建一个名为 local.yml
的文件。将以下配置放在该文件中
- hosts: localhost
become: true
tasks:
- name: Install htop
apt: name=htop
您刚刚创建的文件被称为剧本 (playbook),安装 htop
的指令(我随意选择的一个包作为示例)被称为任务 (play)。剧本本身是一个 YAML 格式的文件,YAML 是一种易于阅读的标记语言。YAML 的完整演练超出了本文的范围,但您不需要对其有专业的了解才能精通 Ansible。配置易于阅读;只需查看此文件,您就可以轻松地了解到我们正在安装 htop
软件包。特别注意最后一行的 apt
模块,它仅适用于基于 Debian 的系统。如果您使用的是 Red Hat 平台,您可以将此更改为 yum
而不是 apt
,如果您使用的是 Fedora,则将其更改为 dnf
。name
行只是提供有关我们任务的信息,并将在输出中显示。因此,您需要确保名称具有描述性,以便在需要排除多个任务的故障时易于查找。
接下来,让我们将我们的新文件提交到我们的存储库
git add local.yml
git commit -m "initial commit"
git push origin master
现在,我们的新剧本应该出现在我们在 GitHub 上的存储库中。我们可以使用以下命令应用我们创建的剧本
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
如果执行正确,htop
软件包应该安装在您的系统上。您可能在开始时看到了一些关于缺少清单文件的警告。这很好,因为我们没有使用清单文件(对于此用例我们也不需要)。在输出的末尾,它将为您提供它所做事情的概述。如果 htop
安装正确,您应该在输出的最后一行看到 changed=1
。
这是如何工作的?ansible-pull
命令使用 -U
选项,该选项期望一个存储库 URL。我为它提供了存储库 URL 的 https
版本,以出于安全目的,因为我不希望任何主机对存储库具有写访问权限(默认情况下 https
是只读的)。假定剧本名称为 local.yml
,因此我们不需要为剧本提供文件名——如果它在存储库的根目录中找到名为 local.yml
的剧本,它将自动运行它。接下来,我们在命令前面使用了 sudo
,因为我们正在修改系统。
让我们继续向我们的剧本添加其他软件包。我将添加两个额外的软件包,使其看起来像这样
- hosts: localhost
become: true
tasks:
- name: Install htop
apt: name=htop
- name: Install mc
apt: name=mc
- name: Install tmux
apt: name=tmux
我为安装另外两个软件包 mc
和 tmux
添加了额外的任务(plays)。您选择让此剧本安装哪些软件包并不重要;我只是随意选择了这些。您应该安装您希望所有系统都拥有的任何软件包。唯一的注意事项是您必须提前知道您的发行版的存储库中存在这些软件包。
在我们提交并应用此更新的剧本之前,我们应该清理它。它按原样工作得很好,但(说实话)它看起来有点混乱。让我们尝试在一个任务中安装所有三个软件包。将您的 local.yml
的内容替换为此
- hosts: localhost
become: true
tasks:
- name: Install packages
apt: name={{item}}
with_items:
- htop
- mc
- tmux
现在这样看起来更干净、更高效。我们使用 with_items
将我们的软件包列表整合到一个任务中。如果我们想添加其他软件包,我们只需添加另一行,其中包含连字符和软件包名称。将 with_items
视为类似于 for
循环。我们将列出的每个软件包都将被安装。
将我们的新更改提交回存储库
git add local.yml
git commit -m "added additional packages, cleaned up formatting"
git push origin master
现在,我们可以运行我们的剧本以从新配置中受益
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
诚然,这个例子现在还做不了太多;它所做的只是安装一些软件包。您可以使用您的软件包管理器更快地安装这些软件包。但是,随着本系列的继续,这些示例将变得更加复杂,我们将自动化更多的事情。到最后,您将创建的 Ansible 配置将自动化越来越多的任务。例如,我使用的配置自动化了数百个软件包的安装,设置了 cron
从我们目前完成的工作来看,您可能已经看到了全局。我们所要做的就是创建一个存储库,将一个剧本放入该存储库,然后使用 ansible-pull
命令来拉取该存储库并将其应用于我们的机器。我们不需要设置服务器。将来,如果我们想更改我们的配置,我们可以拉取存储库,更新它,然后将其推送回我们的存储库并应用它。如果我们正在设置新机器,我们只需要安装 Ansible 并应用配置即可。
在下一篇文章中,我们将通过 cron
和一些其他项目进一步自动化此过程。与此同时,我已经将本文的代码复制到我的 GitLab 存储库中,以便您可以对照我的代码检查您的语法。我将随着我们的进展更新代码。
想要了解更多关于 Ansible 的信息?了解如何使用 Ansible 在此免费白皮书中自动化您的 CI/CD 管道。
4 条评论