如何在Ubuntu 18.04上安装和配置Ansible

介绍

配置管理系统旨在使管理员和运营团队轻松控制大量服务器。它们允许您从一个中心位置以自动方式控制许多不同的系统。

虽然有许多流行的配置管理系统可用于Linux系统,例如Chef和Puppet,但这些系统通常比许多人想要或需要的更复杂。Ansible是这些选项的绝佳替代品,因为它需要更小的开销才能开始。

在本教程中,我们将讨论如何在Ubuntu 18.04服务器上安装Ansible,并介绍如何使用该软件的一些基础知识。

Ansible如何运作?

Ansible通过安装和配置了Ansible组件的配置客户端计算机来工作。

它通过正常的SSH通道进行通信,以从远程计算机检索信息,发出命令和复制文件。因此,Ansible系统不需要在客户端计算机上安装任何其他软件。

这是Ansible简化服务器管理的一种方式。任何暴露了SSH端口的服务器都可以置于Ansible的配置保护伞下,无论它在生命周期中处于什么阶段。这意味着您可以通过SSH管理的任何计算机,您也可以通过Ansible进行管理。

Ansible采用模块化方法,可以轻松扩展以使用主系统的功能来处理特定的场景。模块可以用任何语言编写,并以标准JSON进行通信。

配置文件主要以YAML数据序列化格式编写,因为它具有表现性和与流行标记语言的相似性。Ansible可以通过命令行工具或其配置脚本(称为Playbooks)与主机进行交互。

准备

要学习本教程,您需要:

  • 两个或更多Ubuntu 18.04服务器。其中一个将用作Ansible服务器,其余部分将用作Ansible主机。每个人都应该拥有一个具有权限且配置了基本防火墙的可使用sudo权限的非root用户。请注意,本教程中的示例指定了三个Ansible主机,但显示的命令和配置可以针对任意数量的客户端进行调整。
  • 为Ansible服务器上的非root用户生成的SSH密钥。出于本教程的目的,您可以将密钥对保存到默认位置(~/.ssh/id_rsa),而无需对其进行密码保护。

没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

第1步 - 安装Ansible

要开始使用Ansible作为管理各种服务器的方法,您需要在至少一台计算机上安装Ansible软件。

要获取最新版本的Ansible for Ubuntu,您可以将项目的PPA(个人包存档)添加到您的系统。但是,在执行此操作之前,您应首先更新软件包索引并安装software-properties-common软件包。该软件可以更轻松地管理这个和其他独立的软件存储库:

sudo apt update
sudo apt install software-properties-common

然后键入以下命令添加Ansible PPA:

sudo apt-add-repository ppa:ansible/ansible

ENTER接受PPA添加。

接下来,再次刷新系统的包索引,以便它知道PPA中可用的包:

sudo apt update

在此更新后,您可以安装Ansible软件:

sudo apt install ansible

您的Ansible服务器现在拥有管理主机所需的所有软件。

步骤2 - 配置对Ansible主机的SSH访问

如前所述,Ansible主要通过SSH与客户端计算机通信。虽然它当然能够处理基于密码的SSH身份验证,但使用SSH密钥可以让事情变得更简单。

在Ansible服务器上,使用cat命令将非root用户的SSH公钥文件的内容打印到终端的输出:

cat ~/.ssh/id_rsa.pub

将生成的输出复制到剪贴板,然后打开一个新终端并使用SSH连接到您的一个Ansible主机:

ssh sammy@ansible_host_ip

切换到客户端计算机的root用户:

su -

作为root用户,在~/.ssh目录中打开authorized_keys

nano ~/.ssh/authorized_keys

在文件中,粘贴Ansible服务器用户的SSH密钥,然后保存文件并关闭编辑器(按CTRL + XY然后按ENTER)。然后运行exit命令以返回主机的非root用户:

exit 

最后,因为Ansible使用位于/usr/bin/python中的python解释器来运行其模块,所以您需要在主机上安装Python 2,以便Ansible与之通信。运行以下命令以更新主机的软件包索引并安装python软件包:

sudo apt update
sudo apt install python

在此之后,您可以再次运行exit命令以关闭与客户端的连接:

exit

对要使用Ansible服务器控制的每台服务器重复此过程。接下来,我们将Ansible服务器配置为使用Ansible的hosts文件连接到这些主机。

第3步 - 设置Ansible主机

Ansible通过hosts文件跟踪它所知道的所有服务器。在我们开始与其他计算机通信之前,我们需要先设置此文件。

使用sudo权限打开文件,如下所示:

sudo nano /etc/ansible/hosts

在文件内部,您将看到许多已注释掉的示例配置(有#的前面各行)。这些示例实际上对我们不起作用,因为每个主机中列出的主机都已组成。但是,如果我们希望将来实现更复杂的方案,我们将在文件中保留这些示例以帮助我们进行配置。

hosts文件非常灵活,可以通过几种不同的方式进行配置。我们将要使用的语法如下所示:

[group_name]
alias ansible_ssh_host=your_server_ip

在此示例中,group_name是一个组织标记,它允许您使用一个单词引用其下列出的任何服务器,而alias只是引用一个特定服务器的名称。

因此,在我们的场景中,我们想象我们将使用Ansible控制三台服务器。此时,可以通过键入以下内容从Ansible服务器访问这些服务器:

ssh root@ansible_host_ip

如果您已正确设置密码,则不应提示您输入密码。出于演示的目的,我们将假设我们的主机的IP地址是203.0.113.1203.0.113.2203.0.113.3。我们将这样设置以便我们可以把这些单独引用为host1host2host3,或作为名为servers的一组。

这是我们应该添加到hosts文件中以实现此目的的块:

[servers]
host1 ansible_ssh_host=203.0.113.1
host2 ansible_ssh_host=203.0.113.2
host3 ansible_ssh_host=203.0.113.3

主机可以位于多个组中,组可以为其所有成员配置参数。我们现在试试吧。

使用我们当前的设置,如果我们尝试使用Ansible连接到任何这些主机,该命令将失败(假设您不是以root用户身份运行)。这是因为您的SSH密钥是为远程系统上的root用户嵌入的,Ansible默认情况下会尝试以当前用户身份进行连接。连接尝试将收到此错误:

host1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh.",
    "unreachable": true
}

在Ansible服务器上,我们使用的是一个名为sammy的用户。Ansible将尝试用ssh sammy@server连接到每个主机。如果sammy用户也不在远程系统上,这将不起作用。

我们可以创建一个文件,告诉“服务器”组中的所有服务器以root用户身份进行连接。

为此,我们将在Ansible配置结构中创建一个名为group_vars的目录。在此文件夹中,我们可以为要配置的每个组创建YAML格式的文件:

sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/servers

我们可以将配置放在这里。YAML文件以“---”开头,因此请确保您不要忘记该部分。

---
ansible_ssh_user: root

完成后保存并关闭此文件。

如果要为每个服务器指定配置详细信息,无论组关联如何,都可以将这些详细信息放在文件/etc/ansible/group_vars/all中。可以通过在/etc/ansible/host_vars的目录下创建以别名命名的文件来配置各个主机。

第4步 - 使用简单的Ansible命令

既然我们已经设置了主机并且有足够的配置细节来允许我们成功连接到我们的主机,我们可以尝试我们的第一个命令。

通过键入以下命令ping您配置的所有服务器:

ansible -m ping all
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
​
host3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
​
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

这是一个基本测试,以确保Ansible与其所有主机的连接。

all意味着所有主机。我们可以轻松指定一个组:

ansible -m ping servers

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

ansible -m ping host1

我们可以通过用冒号分隔多个主机来指定:

ansible -m ping host1:host2

-m ping命令的一部分是Ansible使用“ping”模块的指令。这些基本上是可以在远程主机上运行的命令。ping模块以多种方式运行,如Linux中的普通ping实用程序,但它会检查Ansible连接。

ping模块并不真正接受任何参数,但我们可以尝试另一个命令来查看它是如何工作的。我们通过输入-a将参数传递给脚本。

“shell”模块允许我们将终端命令发送到远程主机并检索结果。例如,要找出host1机器上的内存使用情况,我们可以使用:

ansible -m shell -a 'free -m' host1
host1 | 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的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How to Install and Configure Ansible on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏情情说

RabbitMQ实战:扩展RabbitMQ与系列总结

本篇是「RabbitMQ实战」系列的最后一篇,主要介绍RabbitMQ插件,了解如何安装和启用它,列举一些常用的插件,以及如何自定义。

27970
来自专栏猛牛哥的博客

ks3c开的nat小鸡解决ftp的PASV端口问题

23440
来自专栏Linyb极客之路

消息中间件之RcoketMQ单机版安装

一、RocketMQ安装环境 64bit linux 64bit jdk1.8+ maven 3.2.x git(不一定需要) 本文安装环境为centos7....

42690
来自专栏容器云生态

怎样快速将网络repo源中的软件包缓存到本地

首先使用wget命令下载网络源:     比如下载CDH的源:wget -c http://archive.cloudera.com/cm4/redhat/6/...

32660
来自专栏性能与架构

RocketMQ 分布式事务

在单体服务中,比较好解决,一个数据库事务就完成了,但在分布式系统中,这2个步骤可能是由不同的子服务分别处理,这就涉及到了分布式事务的概念。

62520
来自专栏耕耘实录

Ansible的安装与使用初探

受控端:192.168.237.202、192.168.237.203(一共2台)

8740
来自专栏互联网大杂烩

Structs框架

Structs框架结构采用MVC设计模式,同时包含客户端(client),请求以及业务逻辑处理(Business Logic),而MVC模式主要由模型(Mode...

8420
来自专栏zcqshine's blog

CentOS yum 升级php(5.4-5.5)

53570
来自专栏性能与架构

Web安全 - 跨站请求伪造攻击CSRF

跨站请求伪造攻击,简称CSRF(Cross-site request forgery),CSRF通过伪装来自受信任用户的请求实现攻击 CSRF的原理 CSRF主...

38470
来自专栏Hadoop实操

如何永久删除Kafka的Topic

使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新...

64060

扫码关注云+社区

领取腾讯云代金券