本教程适用于以下操作系统版本
- 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 的教程就结束了。如果你有任何问题,请在下方评论区留言。