如何在CentOS7上安装和配置Ansible
介绍
配置管理系统旨在使管理员和运营团队能够轻松控制大量服务器。 它们允许您从一个中央位置以自动化方式控制许多不同的系统。 虽然有许多流行的配置管理系统可用于 Linux 系统,例如 Chef 和 Puppet,但这些系统通常比许多人想要或需要的复杂。 Ansible 是这些选项的绝佳替代品,因为它的启动开销要小得多。
Ansible 通过在安装和配置了 Ansible 组件的计算机上配置客户端计算机来工作。 它通过正常的 SSH 通道进行通信,以便从远程机器检索信息、发出命令和复制文件。 因此,Ansible 系统不需要在客户端计算机上安装任何其他软件。 这是 Ansible 简化服务器管理的一种方式。 任何暴露了 SSH 端口的服务器都可以归入 Ansible 的配置保护伞,无论它处于生命周期的哪个阶段。
Ansible 采用模块化方法,可以轻松扩展以使用主系统的功能来处理特定场景。 模块可以用任何语言编写并以标准 JSON 进行通信。 配置文件主要以 YAML 数据序列化格式编写,因为它的表达性和与流行标记语言的相似性。 Ansible 可以通过命令行工具或称为 Playbooks 的配置脚本与客户端交互。
在本指南中,您将在 CentOS 7 服务器上安装 Ansible,并了解如何使用该软件的一些基础知识。
先决条件
要遵循本教程,您将需要:
- 一台 CentOS 7 服务器。 按照Initial Server Setup with CentOS 7中的步骤创建一个非root用户,并确保您可以在没有密码的情况下连接到服务器。
第 1 步 — 安装 Ansible
要开始探索 Ansible 作为管理我们各种服务器的一种方式,我们需要在至少一台机器上安装 Ansible 软件。
要获得适用于 CentOS 7 的 Ansible,首先确保安装了 CentOS 7 EPEL 存储库:
sudo yum install epel-release
安装存储库后,使用 yum
安装 Ansible:
sudo yum install ansible
我们现在拥有通过 Ansible 管理服务器所需的所有软件。
第 2 步 — 配置 Ansible 主机
Ansible 通过“主机”文件跟踪它知道的所有服务器。 我们需要先设置此文件,然后才能开始与其他计算机进行通信。
使用 root 权限打开文件,如下所示:
sudo vi /etc/ansible/hosts
您将看到一个文件,其中包含许多注释掉的示例配置。 将这些示例保存在文件中,以帮助您了解 Ansible 的配置,以便将来实现更复杂的场景。
hosts 文件相当灵活,可以通过几种不同的方式进行配置。 我们将使用的语法看起来像这样:
示例主机文件
[group_name] alias ansible_ssh_host=your_server_ip
group_name
是一个组织标签,让您可以用一个词来引用它下面列出的任何服务器。 别名只是引用该服务器的名称。
想象一下,您有三台服务器要使用 Ansible 控制。 Ansible 通过 SSH 与客户端计算机通信,因此您要管理的每个服务器都应该可以通过键入以下内容从 Ansible 服务器访问:
ssh root@your_server_ip
不应提示您输入密码。 虽然 Ansible 确实有能力处理基于密码的 SSH 身份验证,但 SSH 密钥有助于让事情变得简单。 如果您还没有,您可以按照教程 How To Use SSH Keys with DigitalOcean Droplets 在每个主机上设置 SSH 密钥。
我们将假设我们服务器的 IP 地址是 192.0.2.1
、192.0.2.2
和 192.0.2.3
。 让我们进行设置,以便我们可以将它们单独称为 host1
、host2
和 host3
,或者作为一个组称为 servers
。 要配置它,您可以将此块添加到主机文件中:
/etc/ansible/主机
[servers] host1 ansible_ssh_host=192.0.2.1 host2 ansible_ssh_host=192.0.2.2 host3 ansible_ssh_host=192.0.2.3
主机可以在多个组中,并且组可以为其所有成员配置参数。 现在让我们试试这个。
默认情况下,Ansible 会尝试使用您当前的用户名连接到远程主机。 如果远程系统上不存在该用户,则连接尝试将导致此错误:
Ansible connection errorhost1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true }
让我们特别告诉 Ansible 它应该使用 sammy 用户连接到“servers”组中的服务器。 在 Ansible 配置结构中创建一个名为 group_vars
的目录。
sudo mkdir /etc/ansible/group_vars
在此文件夹中,我们可以为要配置的每个组创建 YAML 格式的文件:
sudo nano /etc/ansible/group_vars/servers
将此代码添加到文件中:
/etc/ansible/group_vars/servers
--- ansible_ssh_user: sammy
YAML 文件以“-”开头,因此请确保不要忘记该部分。
完成后保存并关闭此文件。 现在 Ansible 将始终将 sammy 用户用于 servers
组,而不管当前用户是谁。
如果您想为每个服务器指定配置详细信息,而不管组关联如何,您可以将这些详细信息放在 /etc/ansible/group_vars/all
的文件中。 可以通过在 /etc/ansible/host_vars
的目录下创建文件来配置各个主机。
第三步——使用简单的 Ansible 命令
现在我们已经设置了主机和足够的配置详细信息以允许我们成功连接到主机,我们可以尝试我们的第一个命令。
通过键入以下命令 ping 您配置的所有服务器:
ansible -m ping all
Ansible 将返回如下输出:
Outputhost1 | SUCCESS => { "changed": false, "ping": "pong" } host3 | SUCCESS => { "changed": false, "ping": "pong" } host2 | SUCCESS => { "changed": false, "ping": "pong" }
这是确保 Ansible 与其所有主机建立连接的基本测试。
命令的 -m ping
部分是 Ansible 使用“ping”模块的指令。 这些基本上是您可以在远程主机上运行的命令。 ping 模块的运行方式与 Linux 中的普通 ping 实用程序类似,但它检查 Ansible 连接。
all
部分表示“所有主机”。 您可以轻松地指定一个组:
ansible -m ping servers
您还可以指定单个主机:
ansible -m ping host1
您可以通过用冒号分隔多个主机来指定它们:
ansible -m ping host1:host2
shell
模块让我们向远程主机发送终端命令并检索结果。 例如,要找出我们 host1 机器上的内存使用情况,我们可以使用:
ansible -m shell -a 'free -m' host1
如您所见,您可以使用 -a
开关将参数传递到脚本中。 输出可能如下所示:
Outputhost1 | SUCCESS | rc=0 >> total used free shared buffers cached Mem: 3954 227 3726 0 14 93 -/+ buffers/cache: 119 3834 Swap: 0 0 0
结论
现在,您应该已将 Ansible 服务器配置为与您想要控制的服务器进行通信。 您可以验证 Ansible 是否可以与您知道如何使用 ansible
命令远程执行简单任务的每个主机进行通信。
尽管这很有用,但我们没有在本文中介绍 Ansible 最强大的功能:Playbooks。 您已经为通过 Ansible 处理服务器奠定了良好的基础,因此下一步是学习如何使用 Playbooks 为您完成繁重的工作。 您可以在 配置管理 101:编写 Ansible Playbooks 和 如何创建 Ansible Playbooks 以在 Ubuntu 上自动化系统配置中了解更多信息