简介
配置管理系统旨在使管理员和运维团队轻松控制大量服务器。它们允许您从一个中央位置以自动化的方式控制许多不同的系统。
虽然对于 Linux 系统有许多流行的配置管理系统,比如 Chef 和 Puppet,但这些系统通常比许多人想要或需要的要复杂得多。Ansible 是这些选项的一个很好的替代方案,因为它的启动开销要小得多。
在本指南中,我们将讨论如何在 Ubuntu 16.04 服务器上安装 Ansible,并介绍如何使用该软件的一些基础知识。
Ansible 是如何工作的?
Ansible 通过从安装和配置了 Ansible 组件的计算机配置客户端机器来工作。
它通过普通的 SSH 通道进行通信,以从远程机器检索信息、发出命令和复制文件。由于这一点,Ansible 系统不需要在客户端计算机上安装任何额外的软件。
这是 Ansible 简化服务器管理的一种方式。任何暴露了 SSH 端口的服务器都可以被纳入 Ansible 的配置范围,而不管它在生命周期的哪个阶段。
任何您可以通过 SSH 管理的计算机,您也可以通过 Ansible 管理。
Ansible 采用模块化方法,使其易于扩展以使用主系统的功能来处理特定场景。模块可以用任何语言编写,并以标准 JSON 进行通信。
由于其表达能力和与流行标记语言的相似性,配置文件主要采用 YAML 数据序列化格式。Ansible 可以通过命令行工具或称为 Playbooks 的配置脚本与客户端进行交互。
先决条件
要按照本教程操作,您需要:
- 一个安装了 sudo 非根用户和 SSH 密钥的 Ubuntu 16.04 服务器,您可以按照初始服务器设置教程中的步骤 4 进行设置。
步骤 1 — 安装 Ansible
要开始探索 Ansible 作为管理各种服务器的手段,我们需要在至少一台机器上安装 Ansible 软件。我们将在本节中使用 Ubuntu 16.04 服务器。
在 Ubuntu 上获取 Ansible 的最佳方式是将该项目的 PPA(个人软件包存档)添加到您的系统中。我们可以通过输入以下命令来添加 Ansible PPA:
sudo apt-add-repository ppa:ansible/ansible
按 ENTER
接受 PPA 添加。
接下来,我们需要刷新系统的软件包索引,以便它知道 PPA 中可用的软件包。之后,我们可以安装软件:
sudo apt-get update sudo apt-get install ansible
正如我们上面提到的,Ansible 主要通过 SSH 与客户端计算机进行通信。虽然它当然有处理基于密码的 SSH 认证的能力,但 SSH 密钥有助于保持事情简单。如果您还没有设置 SSH 密钥,可以按照先决条件中链接的教程进行设置。
现在我们已经拥有了通过 Ansible 管理我们的服务器所需的所有软件。
步骤 2 — 配置 Ansible 主机
Ansible 通过一个“hosts”文件跟踪它所知道的所有服务器。在我们开始与其他计算机通信之前,我们需要首先设置这个文件。
像这样以 root 权限打开文件:
sudo nano /etc/ansible/hosts
您将看到一个文件,其中有许多示例配置,但这些配置对我们来说实际上都不起作用,因为这些主机都是虚构的。因此,首先让我们通过在每行前面添加“#”来注释掉此文件中的所有行。
我们将保留这些示例配置,以帮助我们在将来实施更复杂的场景时进行配置。
一旦所有行都被注释掉,我们就可以开始添加我们的实际主机。
主机文件相当灵活,可以以几种不同的方式进行配置。我们将使用的语法看起来像这样:
[group_name] alias ansible_ssh_host=your_server_ip
group_name 是一个组织标记,让您可以用一个词来引用其下列出的任何服务器。alias 只是一个用于引用该服务器的名称。
因此,在我们的场景中,我们想象我们有三台服务器将使用 Ansible 进行控制。这些服务器可以通过在 Ansible 服务器上键入以下内容来访问:
ssh root@your_server_ip
如果您已经正确设置,您不应该被要求输入密码。我们假设我们的服务器 IP 地址分别为 192.0.2.1
、192.0.2.2
和 192.0.2.3
。我们将设置这样,以便我们可以单独将其称为 host1
、host2
和 host3
,或者作为一个组称为 servers
。
这是我们应该添加到我们的主机文件中以实现此目的的块:
[servers] host1 ansible_ssh_host=192.0.2.1 host2 ansible_ssh_host=192.0.2.2 host3 ansible_ssh_host=192.0.2.3
主机可以属于多个组,组可以为其所有成员配置参数。现在让我们试一下。
根据我们当前的设置,如果我们尝试使用 Ansible 连接到这些主机中的任何一个,该命令将失败(假设您不是以 root 用户身份操作)。这是因为您的 SSH 密钥嵌入在远程系统的 root 用户中,而 Ansible 默认会尝试以当前用户身份连接。连接尝试将得到以下错误:
host1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true }
在 Ansible 服务器上,我们使用一个名为 demo 的用户。Ansible 将尝试使用 ssh demo@server
连接到每个主机。如果远程系统上没有 demo 用户,这将不起作用。
我们可以创建一个文件,告诉“servers”组中的所有服务器使用 root 用户进行连接。
为此,我们将在 Ansible 配置结构中创建一个名为 group_vars
的目录。在此文件夹中,我们可以为要配置的每个组创建 YAML 格式的文件:
sudo mkdir /etc/ansible/group_vars sudo nano /etc/ansible/group_vars/servers
我们可以在这里放置我们的配置。YAML 文件以“—”开头,因此确保您不要忘记这一部分。
--- ansible_ssh_user: root
完成配置后保存并关闭此文件。
如果要为每台服务器指定配置详细信息,而不管其组关联如何,可以将这些详细信息放在 /etc/ansible/group_vars/all
下的文件中。可以通过在 /etc/ansible/host_vars
目录下创建文件来配置单个主机。
第三步 — 使用简单的 Ansible 命令
现在我们已经设置好了我们的主机,并且有足够的配置细节可以让我们成功连接到我们的主机,我们可以尝试我们的第一个命令。
通过输入以下命令来 ping 所有配置的服务器:
ansible -m ping all
host1 | SUCCESS => { "changed": false, "ping": "pong" } host3 | SUCCESS => { "changed": false, "ping": "pong" } host2 | SUCCESS => { "changed": false, "ping": "pong" }
这是一个基本测试,以确保 Ansible 与所有主机建立了连接。
“all” 表示所有主机。我们也可以轻松指定一个组:
ansible -m ping servers
我们也可以指定一个单独的主机:
ansible -m ping host1
我们可以通过用冒号分隔它们来指定多个主机:
ansible -m ping host1:host2
命令中的 -m ping
部分是对 Ansible 使用 “ping” 模块的指示。这些基本上是你可以在远程主机上运行的命令。ping 模块在许多方面类似于 Linux 中的普通 ping 实用程序,但它是用来检查 Ansible 连通性的。
ping 模块实际上并不接受任何参数,但我们可以尝试另一个命令来看看它是如何工作的。我们通过输入 -a
将参数传递给脚本。
“shell” 模块让我们向远程主机发送终端命令并检索结果。例如,要查找我们的 host1 机器上的内存使用情况,我们可以使用:
ansible -m shell -a 'free -m' host1
host1 | SUCCESS | rc=0 >> total used free shared buffers cached Mem: 3954 227 3726 0 14 93 -/+ buffers/cache: 119 3834 Swap: 0 0 0
结论
到目前为止,您应该已经配置好了您的 Ansible 服务器,可以与您想要控制的服务器进行通信。我们已经验证了 Ansible 可以与每个主机通信,并且我们已经使用 ansible
命令远程执行了简单的任务。
尽管这很有用,但在本文中我们还没有涵盖 Ansible 最强大的功能:Playbooks。我们已经为通过 Ansible 使用我们的服务器打下了良好的基础,但在未来的文章中,当我们介绍如何使用 Playbooks 自动配置远程计算机时,重要的工作将会完成。