本教程适用于以下操作系统版本

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)
  • Ubuntu 18.04(Bionic Beaver)

本页内容

  • 先决条件
  • 安装 Ansible
  • 配置 Inventory 文件 将服务器分组到组和子组中
  • 配置 SSH 密钥 在已存在公钥的节点上配置 SSH 密钥
  • 测试连接
  • 运行一些基本命令 检查磁盘使用情况 针对单个主机和组 更新所有服务器
  • 结论
  • 将服务器分组到组和子组中
  • 在已存在公钥的节点上配置 SSH 密钥
  • 检查磁盘使用情况
  • 针对单个主机和组
  • 更新所有服务器

Ansible 是一款非常流行的配置管理工具,旨在简化管理大量服务器的流程。你可以通过单个节点控制任意数量的服务器,并同时在它们上面运行进程。

Ansible 不需要在服务器节点上安装任何特殊软件,便可以经由 SSH 对它们进行控制。

在本指南中,我们将学习如何在 Ubuntu 20.04 服务器上安装并配置 Ansible。

先决条件

  • 两台或更多安装了 OpenSSH 服务器的、基于 Ubuntu 20.04 的服务器系统。
  • 服务器和节点均可通过公网 IP 地址访问。
  • 在 Ansible 服务器上配置一个拥有 sudo 权限的非 root 用户,并在 Ansible 客户端上配置一个设置了密码的 root 用户。

安装 Ansible

在撰写本教程时,由于 Ubuntu 的 python 库中存在一个 bug,Ansible 的官方仓库尚不支持 Ubuntu 20.04。

幸运的是,Ubuntu 自带了 Ansible 2.9,这正是我们将要安装的版本。运行以下命令来安装 Ansible。

$ sudo apt install ansible -y

运行以下命令来测试你的安装。

$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/username/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

配置 Inventory 文件

为了能够连接多台主机,你需要一个记录节点详细信息的文件。这个文件被称为 Inventory 文件(清单文件)。

根据你想要控制的服务器数量,Ansible 的 Inventory 文件还允许你将它们编排到组和子组之中。你还可以设置适用于特定主机或组的自定义变量,这些变量在传递指令时可以进一步使用。

Ansible 自带一个位于 /etc/ansible/hosts 的默认 Inventory 文件。使用 Nano 编辑器打开它。

$ sudo nano /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

servers 部分定义了你想要连接到的节点列表。你可以创建任意数量的组,将服务器安排到多个组中。

all:vars 组为清单中的所有主机设置 ansible_python_interpreter 参数。它可以确保 Ansible 使用 Python 3 可执行文件,而不是已从近期的 Ubuntu 版本中移除的 Python 2。

完成后,按下 CTRL+X,然后按 Y 和 ENTER 来确认保存更改并关闭文件。

注意:你也可以在自己选择的任何位置创建自己的 Inventory 文件,然后在运行 Ansible 命令时通过 -i 参数指定它。

你可以通过下列命令查看你的清单列表。

$ ansible-inventory --list -y
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: {}

将服务器分组到组和子组中

如果你拥有大量执行特定功能的服务器,这是一个有用的技巧。例如,你可以使用这种方法将 Web 服务器和数据库服务器分别归组。你甚至可以让一台主机同时属于多个组。你甚至可以让一台主机同时属于多个组。要实现这一点,你的清单文件应类似以下内容。

[webservers]
203.0.113.111
203.0.113.112

[dbservers]
203.0.113.113
server_hostname

[development]
203.0.113.111
203.0.113.113

[production]
203.0.113.112
server_hostname

配置 SSH 密钥

为了让 Ansible 能够连接到服务器,你必须在 Ansible 服务器与清单文件中指定的主机之间配置 SSH 密钥。这仅在 Ansible 客户端尚未启用公钥、且启用了带密码的 root 账户时才有效。

使用以下步骤为 Ansible 及其节点创建并配置 SSH 密钥。

为 Ansible 创建密钥。

$ ssh-keygen -t rsa -b 4096 -C "Ansible key"

将公钥复制到远程服务器上的你的账户中。为此,我们将使用 ssh-copy-id 命令。

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
[email protected]

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
[email protected]

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
[email protected]

这样就完成了。现在 Ansible 应该能够与你的服务器进行通信了。

在已存在公钥的节点上配置 SSH 密钥

如果客户端已经启用了公钥,那么你将需要执行一些额外的步骤。为此,你需要在每台节点服务器上创建一个仅由 Ansible 访问的新用户。该用户将拥有无需密码即可使用的 sudo 权限,并且只能从你的 Ansible 服务器访问。

要创建 ansible 用户,请运行以下命令。

$ sudo adduser ansible

设置一个强密码,并将所有其他字段留空。

现在,通过以下命令为该用户配置免密码 sudo 访问。

$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

既然你已经添加并配置好了新用户,就可以通过下列命令将 SSH 密钥从你的 Ansible 服务器复制到节点服务器。

$ ssh-copy-id 
[email protected]

系统会提示你输入 ansible 用户的密码。输入后,SSH 密钥就会被复制过去。

接下来,在节点服务器上禁用 ansible 用户的基于密码的登录方式。

$ sudo usermod -L ansible

现在,你的节点服务器只能从 Ansible 服务器访问,因为只有那台服务器拥有它的公钥;同时由于密码登录已被禁用,你也无法直接在节点服务器上以 sudo 权限使用它。

你需要为每台节点服务器重复这些步骤。此外,在本教程中请将 root 用户替换为 ansible 用户。

测试连接

在配置好清单文件和 SSH 密钥之后,我们应该检查一下 Ansible 是否能够连接到服务器。

输入以下命令来检查连接。该命令将对清单文件中的所有服务器进行连接测试。

$ ansible all -m ping -u root

该命令使用 Ansible 的 ping 模块对所有服务器进行连通性测试。你应该会得到类似以下的输出。

server1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

如果这是你第一次使用 Ansible,系统会要求你确认所有服务器的真实性。当系统提示时,输入 yes 并按 ENTER 确认。

运行一些基本命令

让我们使用 Ansible 在服务器上运行一些基本命令。要在服务器上运行任何命令,可使用以下格式。

$ ansible all -a "command" -u <username>

检查磁盘使用情况

首先,让我们检查所有服务器的磁盘使用情况。

$ ansible all -a "df -h" -u root
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

针对单个主机和组

到目前为止,我们都是在所有远程服务器上同时运行命令。但实际情况并非总是如此。若要在单台服务器上运行命令,你应该使用以下格式。

$ ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
 21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

上述命令会检查清单组中 server1 的运行时长(uptime)。

你也可以使用以下格式来针对多台服务器。

$ ansible server1:server2 -m ping -u root

你也可以直接从清单文件中针对组或子组。

$ ansible groupname -m ping -u <username>

更新所有服务器

在本教程中,我们假设所有远程服务器都运行着 Debian 或 Ubuntu 操作系统。

运行以下命令来更新所有服务器上的软件。

$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

-m 参数定义了 Ansible 要运行的模块。-a 指代相关联模块的参数或命令。这里,我们使用 Ansible 的 apt 模块来更新服务器,就像在上一个示例中我们使用 ping 模块一样。update_cache 会更新服务器上的 APT 缓存,而 upgrade=yes 会指示 Ansible 运行 apt upgrade 命令。

要更新你的 CentOS 服务器,可以使用相同的命令,只需将 apt 替换为 yum;对于 Fedora 服务器,则可以将 apt 替换为 dnf。

如果你使用的是上文所述的 ansible 用户,则需要修改 Ansible 命令,使其以提升的 sudo 权限运行。

$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

这里,-K 会请求提权密码。-b 会以 become 方式运行 Ansible 操作,从而让你切换为另一个用户。这两个参数结合使用,能够让 Ansible 以提升的 sudo 权限运行。对于所有需要 sudo 权限的命令,你都需要使用这种方式。

有时,某些更新命令可能需要重启,因此请运行以下命令来重启你的所有服务器。

$ ansible all -a "reboot" -u root

以上仅是你可以使用 Ansible 运行的一些基本命令。

结论

至此,我们关于在基于 Ubuntu 20.04 的服务器上安装并配置 Ansible 的教程就结束了。如果你有任何问题,请在下方评论区留言。