介绍
配置管理系统旨在简化对大量服务器的控制过程,面向管理员和运维团队。它们允许您从一个中央位置以自动化方式控制许多不同的系统。
虽然有许多流行的适用于Linux系统的配置管理工具,例如Chef和Puppet,但这些工具通常比许多人想要或需要的更复杂。Ansible是这些选项的一个很好的替代方案,因为它提供了一种架构,不需要在节点上安装特殊软件,使用SSH来执行自动化任务,并使用YAML文件定义配置详细信息。
在本指南中,我们将讨论如何在Ubuntu 20.04服务器上安装Ansible,并介绍如何使用此软件的一些基础知识。有关Ansible作为配置管理工具的更高级概述,请参阅使用Ansible进行配置管理的简介。
先决条件
要按照本教程进行操作,您需要:
-
一个 Ansible 控制节点:Ansible 控制节点是我们将用于通过 SSH 连接和控制 Ansible 主机的机器。您的 Ansible 控制节点可以是您的本地机器或专用于运行 Ansible 的服务器,尽管本指南假定您的控制节点是一个 Ubuntu 20.04 系统。确保控制节点具备以下条件:
- 具有 sudo 权限的非 root 用户。要设置这个,请按照我们的 第 2 和第 3 步执行我们的 Ubuntu 20.04 初始服务器设置指南。但是,请注意,如果您将远程服务器用作 Ansible 控制节点,则应该按照 每一步执行本指南。这样将在服务器上使用
ufw
配置防火墙并启用对非 root 用户配置的外部访问,这两者都有助于保护远程服务器。 - 与该用户关联的 SSH 密钥对。要设置这个,请按照我们的 第 1 步执行我们的 在 Ubuntu 20.04 上设置 SSH 密钥的指南。
- 具有 sudo 权限的非 root 用户。要设置这个,请按照我们的 第 2 和第 3 步执行我们的 Ubuntu 20.04 初始服务器设置指南。但是,请注意,如果您将远程服务器用作 Ansible 控制节点,则应该按照 每一步执行本指南。这样将在服务器上使用
-
一个或多个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 软件。
从您的控制节点运行以下命令,将官方项目的 PPA(个人软件包存档)包含在系统的源列表中:
- sudo apt-add-repository ppa:ansible/ansible
按下 ENTER
以接受 PPA 添加时的提示。
接下来,刷新系统的软件包索引,使其了解新添加的 PPA 中可用的软件包:
- sudo apt update
完成此更新后,您可以使用以下命令安装 Ansible 软件:
- sudo apt install ansible
您的 Ansible 控制节点现在拥有管理主机所需的所有软件。接下来,我们将介绍如何将您的主机添加到控制节点的清单文件中,以便对其进行控制。
步骤2 — 设置清单文件
清单文件包含有关您将使用Ansible管理的主机的信息。您可以在清单文件中包含从一个到几百台服务器,并且主机可以组织成组和子组。清单文件还经常用于设置仅对特定主机或组有效的变量,以便在playbook和模板中使用。有些变量还可以影响playbook的运行方式,比如我们马上会看到的ansible_python_interpreter
变量。
要编辑默认Ansible清单的内容,请使用您选择的文本编辑器在您的Ansible控制节点上打开/etc/ansible/hosts
文件:
- sudo nano /etc/ansible/hosts
注意:虽然Ansible通常会在etc/ansible/hosts
创建一个默认清单文件,但您可以自由选择在任何更适合您需求的位置创建清单文件。在这种情况下,当运行Ansible命令和playbook时,您需要使用-i
参数提供自定义清单文件的路径。使用每个项目的清单文件是一种很好的做法,可以最大限度地减少在错误的服务器组上运行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命令和playbook。
注意:如果您无法从服务器获得成功的响应,请查阅我们的Ansible速查表指南,了解如何使用不同的连接选项运行Ansible命令的更多信息。
第4步 — 运行即席命令(可选)
在确认您的Ansible控制节点能够与主机通信后,您可以开始在服务器上运行即席命令和Playbooks。
您在远程服务器上通常执行的任何命令都可以在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命令时,您还可以针对单个主机、组和子组进行操作。例如,这是您检查servers
组中每个主机的uptime
的方式:
- ansible servers -a "uptime" -u root
通过用冒号分隔它们,我们可以指定多个主机:
- ansible server1:server2 -m ping -u root
关于如何使用Ansible的更多信息,包括如何执行playbooks以自动设置服务器,您可以查看我们的Ansible参考指南。
结论
在本指南中,您已安装了Ansible并设置了一个清单文件,以从Ansible控制节点执行临时命令。
一旦确认您能够从中央Ansible控制器机器连接和控制基础设施,您可以在这些主机上执行任何命令或playbook。
有关如何使用Ansible的更多信息,请查看我们的Ansible速查表指南。