介绍
配置管理系统旨在为管理员和运营团队简化控制大量服务器的过程。 它们允许您从一个中央位置以自动化方式控制许多不同的系统。
虽然有许多流行的配置管理工具可用于 Linux 系统,例如 Chef 和 Puppet,但这些工具通常比许多人想要或需要的复杂。 Ansible 是这些选项的绝佳替代方案,因为它提供了一个简单的架构,不需要在节点上安装特殊软件,使用 SSH 执行自动化任务并使用 YAML 文件来定义配置细节。
在本指南中,我们将讨论如何在 Ubuntu 18.04 服务器上安装 Ansible,并介绍如何使用该软件的一些基础知识。
Ansible 是如何工作的?
Ansible 通过从安装和配置了 Ansible 组件的计算机(称为 Ansible 控制节点 )配置客户端计算机(称为 托管节点 )来工作。
它通过正常的 SSH 通道进行通信,以从远程系统检索信息、发出命令和复制文件。 因此,Ansible 系统不需要在客户端计算机上安装任何其他软件。
这是 Ansible 简化服务器管理的一种方式。 任何暴露了 SSH 端口的服务器都可以归入 Ansible 的配置保护伞,无论它处于生命周期的哪个阶段。 这意味着您可以通过 SSH 管理的任何计算机,也可以通过 Ansible 进行管理。
Ansible 采用模块化方法,使您能够扩展主系统的功能以处理特定场景。 模块可以用任何语言编写并以标准 JSON 进行通信。
配置文件主要以 YAML 数据序列化格式编写,因为它的表达性和与流行标记语言的相似性。 Ansible 可以通过命令行工具或其配置脚本(称为 Playbooks)与主机交互。
先决条件
要遵循本教程,您将需要:
- 一个 Ansible 控制节点:Ansible 控制节点是我们将用来通过 SSH 连接和控制 Ansible 主机的机器。 您的 Ansible 控制节点可以是您的本地计算机或专用于运行 Ansible 的服务器,但本指南假定您的控制节点是 Ubuntu 18.04 系统。 确保控制节点具有:
- 具有 sudo 权限的非 root 用户。 要进行此设置,您可以按照我们的 Ubuntu 18.04 初始服务器设置指南的 步骤 2 和 3 。 但是,请注意,如果您使用远程服务器作为 Ansible 控制节点,则应遵循本指南的 每一步 。 这样做将使用
ufw
在服务器上配置防火墙并启用对您的非 root 用户配置文件的外部访问,这两者都将有助于保持远程服务器的安全。 - 与此用户关联的 SSH 密钥对。 要进行设置,您可以按照我们关于 如何在 Ubuntu 18.04 上设置 SSH 密钥的指南中的 Step 1 进行操作。
- 具有 sudo 权限的非 root 用户。 要进行此设置,您可以按照我们的 Ubuntu 18.04 初始服务器设置指南的 步骤 2 和 3 。 但是,请注意,如果您使用远程服务器作为 Ansible 控制节点,则应遵循本指南的 每一步 。 这样做将使用
- 一个或多个 Ansible 主机:Ansible 主机是您的 Ansible 控制节点配置为自动化的任何机器。 本指南假定您的 Ansible 主机是远程 Ubuntu 18.04 服务器。 确保每个 Ansible 主机具有:
- Ansible 控制节点的 SSH 公钥添加到系统用户的
authorized_keys
中。 此用户可以是 root 或具有 sudo 权限的普通用户。 要进行此设置,您可以按照 如何在 Ubuntu 18.04 上设置 SSH 密钥的 步骤 2。
- Ansible 控制节点的 SSH 公钥添加到系统用户的
第 1 步 — 安装 Ansible
要开始使用 Ansible 作为管理服务器基础架构的一种方式,您需要在将用作 Ansible 控制节点的机器上安装 Ansible 软件。
从您的控制节点,运行以下命令以将官方项目的 PPA(个人包存档)包含在系统的源列表中:
sudo apt-add-repository ppa:ansible/ansible
当提示接受 PPA 添加时,按 ENTER
。
接下来,刷新系统的包索引,以便它知道新包含的 PPA 中可用的包:
sudo apt update
在此更新之后,您可以安装 Ansible 软件:
sudo apt install ansible
您的 Ansible 控制节点现在拥有管理主机所需的所有软件。 接下来,我们将讨论如何将您的主机添加到控制节点的清单文件中,以便它可以控制它们。
第 2 步 — 设置库存文件
库存文件 包含有关您将使用 Ansible 管理的主机的信息。 您可以在清单文件中包含从一台到数百台服务器的任意位置,并且可以将主机组织成组和子组。 清单文件还经常用于设置仅对特定主机或组有效的变量,以便在剧本和模板中使用。 一些变量也会影响 playbook 的运行方式,例如我们稍后会看到的 ansible_python_interpreter
变量。
要编辑默认 Ansible 清单的内容,请在 Ansible 控制节点上使用您选择的文本编辑器打开 /etc/ansible/hosts
文件:
sudo nano /etc/ansible/hosts
注意:一些 Ansible 安装不会创建默认清单文件。 如果您的系统中不存在该文件,您可以在 /etc/ansible/hosts
处创建一个新文件,或者在运行命令和 playbook 时使用 -i
参数提供自定义库存路径。
Ansible 安装提供的默认清单文件包含许多示例,您可以将它们用作设置清单的参考。 以下示例定义了一个名为 [servers]
的组,其中包含三个不同的服务器,每个服务器由自定义别名标识:server1、server2 和 server3[X177X ]。 请务必将突出显示的 IP 替换为 Ansible 主机的 IP 地址。
/etc/ansible/主机
[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 步 — 运行临时命令(可选)
在确认您的 Ansible 控制节点能够与您的主机通信后,您可以开始在您的服务器上运行临时命令和 playbook。
您通常通过 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
可以替换为您想要的任何命令。
您还可以通过 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 的更多信息,包括如何执行 playbook 以自动设置服务器,您可以查看我们的 Ansible 参考指南 。
结论
在本指南中,您已经安装了 Ansible 并设置了一个清单文件以从 Ansible 控制节点执行临时命令。
一旦您确认您能够从中央 Ansible 控制器机器连接和控制您的基础设施,您就可以在这些主机上执行您想要的任何命令或剧本。 对于新服务器,Initial Server Setup 社区手册是一个很好的起点。 您还可以通过我们的指南 Configuration Management 101: Writing Ansible Playbooks 学习如何编写自己的 playbook。
有关如何使用 Ansible 的更多信息,请查看我们的 Ansible 备忘单指南 。