介绍
配置管理系统旨在为管理员和运营团队简化控制大量服务器的过程。它们允许您从一个中心位置以自动化方式控制许多不同的系统。
尽管有许多可用于 Linux 系统的流行配置管理工具,例如Chef和Puppet,但这些工具通常比许多人想要或需要的更复杂。Ansible是这些选项的一个很好的替代方案,因为它提供的架构不需要在节点上安装特殊软件,使用 SSH 执行自动化任务和 YAML 文件来定义配置细节。
在本指南中,我们将讨论如何在 Ubuntu 20.04 服务器上安装 Ansible,并介绍如何使用该软件的一些基础知识。有关 Ansible 作为配置管理工具的更高级概述,请参阅An Introduction to Configuration Management with Ansible。
先决条件
要学习本教程,您需要:
-
一个 Ansible 控制节点:Ansible 控制节点是我们用来通过 SSH 连接和控制 Ansible 主机的机器。您的 Ansible 控制节点可以是您的本地机器,也可以是专用于运行 Ansible 的服务器,但本指南假设您的控制节点是 Ubuntu 20.04 系统。确保控制节点具有:
- 具有 sudo 权限的非 root 用户。要进行设置,您可以按照我们的 Ubuntu 20.04 初始服务器设置指南的第2 步和第 3 步进行操作。但是,请注意,如果您使用远程服务器作为 Ansible Control 节点,则应遵循本指南的每一步。这样做将在服务器上配置防火墙,
ufw
并启用对非 root 用户配置文件的外部访问,这两者都有助于保持远程服务器的安全。 - 与此用户关联的 SSH 密钥对。要进行设置,您可以按照我们关于如何在 Ubuntu 20.04 上设置 SSH 密钥的指南的第 1 步进行操作。
- 具有 sudo 权限的非 root 用户。要进行设置,您可以按照我们的 Ubuntu 20.04 初始服务器设置指南的第2 步和第 3 步进行操作。但是,请注意,如果您使用远程服务器作为 Ansible Control 节点,则应遵循本指南的每一步。这样做将在服务器上配置防火墙,
-
一个或多个 Ansible 主机:Ansible 主机是您的 Ansible 控制节点配置为自动化的任何机器。本指南假设您的 Ansible 主机是远程 Ubuntu 20.04 服务器。确保每个 Ansible 主机都具有:
- Ansible 控制节点的 SSH 公钥添加到
authorized_keys
系统用户的。该用户可以是root用户,也可以是具有 sudo 权限的普通用户。要进行设置,您可以按照如何在 Ubuntu 20.04 上设置 SSH 密钥的步骤 2进行操作。
- Ansible 控制节点的 SSH 公钥添加到
步骤 1 — 安装 Ansible
要开始使用 Ansible 作为管理服务器基础架构的一种方式,您需要在将用作 Ansible 控制节点的机器上安装 Ansible 软件。为此,我们将使用默认的 Ubuntu 存储库。
首先,使用以下命令刷新系统的包索引:
- sudo apt update
在此更新之后,您可以通过以下方式安装 Ansible 软件:
- sudo apt install ansible
Y
在提示确认安装时按下。
您的 Ansible 控制节点现在拥有管理主机所需的所有软件。接下来,我们将讨论如何设置清单文件,以便 Ansible 可以与您的托管节点进行通信。
步骤 2 — 设置库存文件
该清单文件包含有关你会Ansible管理的主机信息。您可以在清单文件中包含一台到数百台服务器,并且可以将主机组织成组和子组。库存文件还经常用于设置仅对特定主机或组有效的变量,以便在剧本和模板中使用。一些变量也会影响剧本的运行方式,比如ansible_python_interpreter
我们稍后会看到的变量。
要编辑默认 Ansible 清单的内容,请/etc/ansible/hosts
使用您选择的文本编辑器在 Ansible 控制节点上打开文件:
- sudo nano /etc/ansible/hosts
注意:虽然 Ansible 通常会在 中创建默认清单文件etc/ansible/hosts
,但您可以在任何更适合您需求的位置自由创建清单文件。在这种情况下,您需要-i
在运行 Ansible 命令和 playbook 时使用参数提供自定义清单文件的路径。使用每个项目的清单文件是一种很好的做法,可以最大限度地降低在错误的服务器组上运行剧本的风险。
Ansible 安装提供的默认清单文件包含许多示例,您可以将它们用作设置清单的参考。以下示例定义了一个名为的组,[servers]
其中包含三个不同的服务器,每个服务器由一个自定义别名标识: server1、server2和server3。请务必将突出显示的 IP 替换为 Ansible 主机的 IP 地址。
[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
[all:vars]
ansible_python_interpreter=/usr/bin/python3
在all:vars
分组设置 ansible_python_interpreter
主机参数的有效期为包括在这个清单中的所有主机。此参数确保远程服务器使用/usr/bin/python3
Python 3 可执行文件而不是/usr/bin/python
(Python 2.7),后者在最近的 Ubuntu 版本中不存在。
完成后,按CTRL+X
然后Y
和ENTER
确认更改以保存并关闭文件。
每当你想检查你的库存时,你可以运行:
- ansible-inventory --list -y
您将看到与此类似的输出,但包含在您的清单文件中定义的您自己的服务器基础设施:
Outputall:
children:
servers:
hosts:
server1:
ansible_host: 203.0.113.111
ansible_python_interpreter: /usr/bin/python3
server2:
ansible_host: 203.0.113.112
ansible_python_interpreter: /usr/bin/python3
server3:
ansible_host: 203.0.113.113
ansible_python_interpreter: /usr/bin/python3
ungrouped: {}
现在您已经配置了清单文件,您拥有了测试与 Ansible 主机的连接所需的一切。
第 3 步 – 测试连接
设置清单文件以包含您的服务器后,是时候检查 Ansible 是否能够连接到这些服务器并通过 SSH 运行命令。
对于本指南,我们将使用 Ubuntu root帐户,因为这通常是新创建的服务器上默认情况下唯一可用的帐户。如果您的 Ansible 主机已经创建了一个普通的 sudo 用户,我们鼓励您改用该帐户。
您可以使用该-u
参数来指定远程系统用户。如果未提供,Ansible 将尝试在控制节点上以您当前的系统用户身份进行连接。
从您的本地机器或 Ansible 控制节点,运行:
- ansible all -m ping -u root
此命令将使用 Ansible 的内置ping
模块在默认清单中的所有节点上运行连接测试,以root身份连接。该ping
模块将测试:
- 如果主机可以访问;
- 如果您有有效的 SSH 凭据;
- 如果主机能够使用 Python 运行 Ansible 模块。
你应该得到类似这样的输出:
Outputserver1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
如果这是您第一次通过 SSH 连接到这些服务器,系统会要求您确认通过 Ansible 连接的主机的真实性。出现提示时,键入yes
然后点击ENTER
确认。
一旦收到"pong"
主机的回复,就意味着您已准备好在该服务器上运行 Ansible 命令和剧本。
注意:如果您无法从服务器获得成功的响应,请查看我们的Ansible 备忘单指南以获取有关如何使用不同连接选项运行 Ansible 命令的更多信息。
第 4 步 – 运行 Ad-Hoc 命令(可选)
在确认您的 Ansible 控制节点能够与您的主机通信后,您可以开始在您的服务器上运行临时命令和剧本。
您通常通过 SSH 在远程服务器上执行的任何命令都可以在清单文件中指定的服务器上使用 Ansible 运行。例如,您可以使用以下命令检查所有服务器上的磁盘使用情况:
- ansible all -a "df -h" -u root
Output
server1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 798M 624K 798M 1% /run
/dev/vda1 155G 2.3G 153G 2% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 798M 0 798M 0% /run/user/0
server2 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 608K 394M 1% /run
/dev/vda1 78G 2.2G 76G 3% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 395M 0 395M 0% /run/user/0
...
突出显示的命令df -h
可以替换为您想要的任何命令。
您还可以通过临时命令执行Ansible 模块,类似于我们之前对ping
模块进行的测试连接。例如,以下是我们如何使用该apt
模块vim
在您库存中的所有服务器上安装最新版本的:
- ansible all -m apt -a "name=vim state=latest" -u root
在运行 Ansible 命令时,您还可以针对单个主机以及组和子组。例如,这是您检查组uptime
中每个主机的方式servers
:
- ansible servers -a "uptime" -u root
我们可以通过用冒号分隔它们来指定多个主机:
- ansible server1:server2 -m ping -u root
有关如何使用 Ansible 的更多信息,包括如何执行 playbook 以自动设置服务器,您可以查看我们的Ansible 参考指南。
结论
在本指南中,您已经安装了 Ansible 并设置了一个清单文件以从 Ansible 控制节点执行临时命令。
一旦您确认您能够从中央 Ansible 控制器机器连接和控制您的基础设施,您就可以在这些主机上执行您想要的任何命令或剧本。
有关如何使用 Ansible 的更多信息,请查看我们的Ansible 备忘单指南。