Rocky Linux 9安装与配置Ansible:完整指南

引言

配置管理系统旨在使管理员和操作团队能够轻松控制大量服务器。它们允许您从一个集中位置以自动化的方式控制许多不同的系统。虽然对于Linux系统有许多流行的配置管理系统可用,如Chef和Puppet,但这些系统往往比许多人想要或需要的要复杂。Ansible是这些选项的一个很好的替代品,因为它具有更低的入门成本。

Ansible的工作原理是通过从安装了Ansible组件的计算机对客户端进行配置。它通过普通的SSH通道与远程机器进行信息检索、发出命令和拷贝文件。因此,Ansible系统不需要在客户端计算机上安装任何额外的软件。这是Ansible实现服务器管理的一种方式。只要服务器的SSH端口暴露,就可以将其纳入Ansible的配置范围,而无论其在生命周期的哪个阶段。

Ansible采用模块化的方法,使得可以利用主系统的功能来处理特定场景。模块可以使用任意语言编写,并以标准的JSON进行通信。由于YAML数据序列化格式的表达能力以及其与流行标记语言的相似性,配置文件主要以YAML格式编写。Ansible可以通过命令行工具或称为Playbooks的配置脚本与客户端进行交互。

在本指南中,您将在Rocky Linux 9服务器上安装Ansible并学习如何使用该软件的基础知识。

先决条件

要按照本教程进行操作,你需要准备以下物品:

  • 一个Ansible控制节点:Ansible控制节点是您将用于通过SSH连接和控制Ansible主机的机器。您的Ansible控制节点可以是您的本地机器,也可以是专门用于运行Ansible的服务器,尽管本指南假设您的控制节点是Rocky Linux 9系统。请确保控制节点具备:
    • 一个具有sudo权限的非root用户。要进行此设置,您可以遵循我们《Rocky Linux 9初始服务器设置指南》的第2步和第3步。但是,请注意,如果您使用远程服务器作为Ansible控制节点,则应遵循本指南的每一个步骤。
    • 与此用户关联的SSH密钥对。要进行此设置,您可以遵循我们《如何在Rocky Linux 9上设置SSH密钥》指南的第1步。
  • 一个或多个Ansible主机:Ansible主机是您的Ansible控制节点配置为自动化的任何机器。本指南假设您的Ansible主机是远程Rocky Linux 9服务器。请确保每个Ansible主机具备:
    • Ansible控制节点的SSH公钥已添加到系统用户的authorized_keys文件中。此用户可以是root用户或具有sudo权限的普通用户。要进行此设置,您可以遵循《如何在Rocky Linux 9上设置SSH密钥》的第2步。

一切准备就绪后,您可以开始第一步。

第一步 – 安装Ansible

要开始探索Ansible作为管理各种服务器的手段,首先需要在至少一台机器上安装Ansible软件。

要在Rocky Linux 9上获取Ansible,首先使用dnf确保安装了Rocky Linux 9 EPEL仓库。

  1. sudo dnf install epel-release

 

一旦仓库安装完毕,请安装Ansible。

  1. sudo dnf install ansible

 

现在你已经拥有了通过Ansible管理服务器所需的所有软件。

第二步 – 配置Ansible主机

Ansible 通过一个 hosts 文件来跟踪它所了解的所有服务器。在与其他机器通信之前,您需要先设置好这个文件。

以root权限打开文件,可以按照以下步骤进行。请记住,Rocky Linux 9 的默认文本编辑器是vi

  1. sudo vi /etc/ansible/hosts

 

请注意,该文件中有很多示例配置已经被注释掉了。在文件中保留这些示例,以帮助您学习Ansible的配置,如果您希望在将来实施更复杂的场景。

主机文件非常灵活,可以以几种不同的方式进行配置。您将要使用的语法结构如下所示:

示例主机文件

[group_name]
alias ansible_ssh_host=your_server_ip

群组名称是一个组织标签,让您只需一个词汇便能提及该群组下的任何服务器。别名则是指代该服务器的名称。

例如,想象一下你想用Ansible来控制三台服务器。Ansible通过SSH与客户端机器进行通信,所以你想管理的每个服务器都可以从Ansible服务器访问到。如果你按照先决条件中的一个或多个Ansible主机选项进行操作,你的主机将通过运行以下命令来设置并可访问SSH密钥:

  1. ssh root@your_server_ip

 

您不需要输入密码。虽然Ansible可以处理基于密码的SSH身份验证,但SSH密钥可以使事情更加简单无缝。

在您的文件已经打开的情况下,您可以将以下服务器的IP地址作为示例:203.0.113.111,203.0.113.112和203.0.113.113。确保用您自己的IP地址替换这些IP地址。接下来,设置这样的环境,以便您可以单独将每个服务器称为host1,host2和host3,或者作为组称为servers。为了配置这个,您需要将以下区块添加到您的hosts文件中。您可以按i键插入文本,完成后按ESC键退出。

/etc/ansible/hosts的主机清单文件

[servers]
host1 ansible_ssh_host=203.0.113.111
host2 ansible_ssh_host=203.0.113.112
host3 ansible_ssh_host=203.0.113.113

加入完模块之后,请保存并退出文件。可以通过输入 :wq,然后按下回车键来完成此操作。

主机可以同时属于多个组,而组可以为其所有成员配置参数。您可以尝试通过运行以下命令来实现这一点:

  1. ansible -m ping host1

 

Ansible连接错误

host1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: sammy@203.0.113.111: Permission denied (publickey).", "unreachable": true }

默认情况下,Ansible会尝试使用当前用户名连接到远程主机。上述错误表明,如果远程系统上不存在该用户,连接将会失败。

因此,让我们明确告诉Ansible使用sammy用户连接服务器组中的服务器。首先,在Ansible配置结构中创建一个名为group_vars的目录。

  1. sudo mkdir /etc/ansible/group_vars

 

在这个文件夹中,您可以为想要配置的每个组创建以YAML格式编写的文件。之前,您使用vi文本编辑器编辑了该文件。或者,您也可以使用nano编辑该文件,但需要使用以下命令进行安装:

  1. sudo dnf -y install nano

 

如果您喜欢使用nano,安装完成后将打开/etc/ansible/group_vars/servers文件来编辑配置。

  1. sudo nano /etc/ansible/group_vars/servers

 

在文件中添加以下代码。YAML文件以---开头,所以不要忘记这一部分。

这应该是 /etc/ansible/group_vars/servers 这个路径的意思。

---
ansible_ssh_user: sammy

当你完成后,保存并退出文件。在nano中,你可以通过按下CTRL +X,然后按YENTER来完成操作。

现在Ansible将始终使用sammy用户来管理服务器群组,无论当前用户如何。

如果您想为每个服务器指定配置详细信息,而不管其所属的群组,您可以将这些详细信息放入位于/etc/ansible/group_vars/all的文件中。通过在/etc/ansible/host_vars目录下创建文件,可以配置单个主机。

步骤3 – 使用基本的Ansible命令

现在,你已经设置好了你的主机,并且有足够的配置细节可以让你成功连接主机,你可以尝试一些命令。

首先,对你配置的所有服务器进行ping测试。命令中的"-m ping"部分是告诉Ansible使用ping模块进行操作。这些是你可以在远程主机上运行的常用命令。ping模块的操作方式与Linux中的ping实用程序类似,但其检查的是Ansible的连通性。

  1. ansible -m ping all

 

Ansible 将返回如下输出:

输出

host3 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } host1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } host2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }

这个输出是一个基本测试,用于确认Ansible与所有主机的连接。

除了all命令之外,还有其他命令可以针对不同的服务器集合进行操作。您还可以指定一个组。

  1. ansible -m ping servers

 

您还可以指定一个单独的主机:

  1. ansible -m ping host1

 

另外,您可以通过用冒号分隔它们来指定多个主机。

  1. ansible -m ping host1:host2

 

shell模块允许您向远程主机发送终端命令并检索结果。例如,要了解host1机器上的内存使用情况,您可以使用以下命令:

  1. ansible -m shell -a ‘free -m’ host1

 

你可能会注意到,通过使用-a开关将参数传递到脚本中。这里是可能返回的输出内容。

输出

host1 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 7951 234 6768 0 948 7461 Swap: 0 0 0

你现在已经成功在你的各个主机上运行了几个基本的Ansible命令。

结论

您的Ansible服务器现在已经配置好,可以与您希望控制的服务器进行通信。您可以使用ansible命令远程执行基本任务,以验证Ansible能够与每个主机进行通信。

你已经通过Ansible为与服务器工作打下了坚实的基础,所以你的下一步是学习如何使用Playbooks来为你承担大部分工作。你可以在我们的《配置管理101:编写Ansible Playbooks》指南中了解更多信息。

bannerAds