Skip to main content

如何在 Ubuntu 22.04 上安装和配置 Ansible

作者 Erika Heidi, Jamon Camisso

导言

配置管理系统是为简化管理员和运营团队控制大量服务器的过程而设计的。该系统允许你从中心位置以自动化的方式控制许多不同的系统。 虽然有许多流行的配置管理工具可用于 Linux 系统,如 Chef 和 Puppet,但这些工具往往比许多人想要或需要的更加复杂。相对于这些选择,Ansible 是一个很好的替代方案,因为它提供了一种不需要在节点上安装特殊软件的架构,这种架构使用 SSH 来执行自动化任务,使用YAML 文件来定义配置细节。 在本指南中,我们将讨论如何在 Ubuntu 22.04 服务器上安装 Ansible,并介绍如何使用这个软件的一些基本知识。

前期准备

要学习本教程,你将需要:

  • 一个 Ansible 控制节点:Ansible 控制节点是我们用来通过 SSH 连接和控制 Ansible 主机的机器。Ansible 控制节点可以是你的本地机器,也可以是专门用于运行 Ansible 的服务器,不过本指南假设你的控制节点是 Ubuntu 22.04 系统。请确保控制节点有:
    • 一个具有 sudo 权限的非 root 用户。
    • 一个与该用户关联的 SSH 密钥对。
  • 一个或多个 Ansible 主机。Ansible 主机指的是任何 Ansible 控制节点被配置为自动化的机器。本指南假设你的 Ansible 主机是远程 Ubuntu 22.04 服务器。请确保每个 Ansible 主机都:
    • 将 Ansible 控制节点的 SSH 公钥添加到系统用户的 authorized_keys 中。这个用户可以是 root,也可以是有 sudo 权限的普通用户。

第1步 - 安装Ansible

$ sudo apt-add-repository ppa:ansible/ansible

当提示接受PPA的添加时,按 ENTER 键。 接下来,刷新你的系统的软件包索引,这样它就得知新加入 PPA 中的软件包了:

$ sudo apt update

更新之后,你可以用以下代码安装 Ansible 软件:

$ sudo apt install ansible

现在,你的 Ansible 控制节点已经拥有了管理主机所需的所有软件。接下来,我们将讨论如何将你的主机添加到控制节点的 inventory 文件中,以便能够控制它们。

第2步 - 设置 inventory 文件

Inventory 文件包含了你要用 Ansible 管理的主机的信息。你可以在 inventory 文件中包括一台到几百台服务器,而且主机可以被分成群组和子群组。Inventory 文件也经常被用来设置变量,这些变量只对特定的主机或群组有效,以便在 playbook 和模板中使用。有些变量也会影响到 playbook 的运行方式,比如我们稍后会看到的 ansible_python_interpreter 变量。 要编辑默认的Ansible清单的内容,在Ansible控制节点上用你选择的文本编辑器打开 /etc/ansible/hosts 文件:

$ sudo nano /etc/ansible/hosts

注意:尽管 Ansible 通常是在 etc/ansible/hosts 创建一个默认的 inventory 文件,但你可以自由地在任何位置创建 inventory 文件,以更好地满足你的需求。如果这样做,你需要在运行 Ansible 命令和 playbook 时,用 -i 参数提供你的自定义 inventory 文件的路径。不同的项目使用不同的 inventory 文件是一种很好的实践,这样可以尽量减少在错误的服务器群组上运行 playbook 的风险。 Ansible安装时提供的默认 inventory 文件包含一些例子,你可以把它们作为设置 inventory 的参考。下面的例子定义了一个名为 [services] 的群组,其中有三个不同的服务器,每个都有自定义的别名标识:server1、server2 和 server3。注意确保用你自己的 Ansible 主机的 IP 地址替换下面例子的 IP: /etc/ansible/hosts

[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 主机参数。这个参数对这个 inventory 中的所有主机都有效,确保远程服务器使用 /usr/bin/python3 ,即 Python 3 可执行程序,而不是 /usr/bin/python (Python 2.7),后者在最近的 Ubuntu 版本中不存在。 完成后,保存并关闭文件,按 CTRL+X 然后按 YENTER 确认更改。 每当你想检查你的 inventory 时,可以运行:

$ ansible-inventory --list -y

你会看到与下面类似的输出,不过你的输出会包含你自己的服务器基础设施,比如 inventory 文件中定义的那些。

Output
all:
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: {}

现在你已经配置好了 inventory 文件,万事俱备,可以开始测试到你的 Ansible 主机的连接了。

第3步 - 测试连接

在设置好 inventory 文件,将你的服务器包括在内后,现在是时候检查 Ansible 是否能够连接到这些服务器并通过 SSH 运行命令了。 在本指南中,我们将使用 Ubuntu root 账户,因为这通常是新创建的服务器上唯一可用的默认账户。如果你的 Ansible 主机已经创建了一个普通的 sudo 用户,我们鼓励你使用 sudo 账户。 使用参数 -u 来指定远程系统用户。如果没有提供远程系统用户,Ansible 将尝试以控制节点上的你的当前系统用户进行连接。 从你的本地机器或 Ansible 控制节点运行以下代码:

$ ansible all -m ping -u root

这条命令将使用 Ansible 内置的 ping 模块对默认清单中的所有节点以 root 身份连接并进行连接测试。 ping 模块将测试:

  • 主机是否可访问;
  • 是否有有效的 SSH 凭证;
  • 主机是否能够使用 Python 运行 Ansible 模块。 你应该会得到类似这样的输出:
Output
server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}

如果这是你第一次通过 SSH 连接到这些服务器,你会被要求确认通过 Ansible 连接的主机的真实性。当出现提示时,输入 yes,然后点击 ENTER 确认。 一旦从主机上得到 "pong " 这个回复,意味着已经准备好在该服务器上运行 Ansible 命令和 playbook 了。

第4步 - 运行 Ad-Hoc 命令(可选)

在确认你的 Ansible 控制节点能够与你的主机通信后,就可以开始在你的服务器上运行 Ad-Hoc 命令和 playbook 了。 任何你通常会通过 SSH 在远程服务器上执行的命令,都可以用 Ansible 在 inventory 文件中指定的服务器上运行。例如,你可以在所有的服务器上检查磁盘使用情况:

$ 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 。 你也可以通过 ad-hoc 命令来执行 Ansible 模块,类似于我们之前用 ping 模块来测试连接的做法。例如,我们可以用 apt 模块在所有服务器上安装最新版本的 vim

$ ansible all -m apt -a "name=vim state=latest" -u root

你也可以针对单个主机以及群组和子群组运行 Ansible 命令。例如,你可以这样检查 servers 群组中每台主机的 uptime

$ ansible servers -a "uptime" -u root

可以指定多个主机,中间用冒号隔开:

$ ansible server1:server2 -m ping -u root

结语

在本指南中,你学会了安装 Ansible 并设置 inventory 文件,以便从 Ansible 控制节点执行临时命令。 一旦你确认你能够从中央 Ansible 控制器机器上连接并控制你的基础设施,你就可以在这些主机上执行任何你想要的命令或 playbook。