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

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

在本指南中,我们将讨论如何在Ubuntu 12.04机器上安装Ansible,并讨论如何使用该软件的一些基础知识。


Ansible如何工作?

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

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

这是Ansible简化服务器管理的一种方法。任何暴露了SSH端口的服务器都可以被带到Ansible的配置伞下,无论它的生命周期处于什么阶段。

您可以通过SSH管理的任何计算机,也可以通过Ansible管理。

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

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


在Ubuntu 12.04 VPS上安装Ansible

要开始探索Ansible作为管理我们的各种服务器的方法,我们需要在至少一台机器上安装Ansible软件。我们将在本节中使用Ubuntu 12.04 VPS实例。

为Ubuntu获取Ansible的最佳方法是将项目的PPA(个人包存档)添加到系统中。

为了有效地做到这一点,我们需要安装software-properties-common软件包,这将使我们能够轻松地使用PPA:

在早期的Ubuntu发行版中,software-properties-common名为python-software-properties

sudo apt-get update
sudo apt-get install software-properties-common    //早期版本为 python-software-properties

安装软件包后,我们可以通过键入以下命令添加Ansible PPA:

sudo add-apt-repository ppa:rquillo/ansible

ENTER回车键接受PPA添加。

接下来,我们需要刷新系统的包索引,以便它知道PPA中可用的包。之后,我们可以安装软件:

sudo apt-get update
sudo apt-get install ansible

我们现在拥有通过Ansible管理我们的服务器所需的所有软件。

设置SSH密钥

如上所述,Ansible主要通过SSH与客户端计算机通信。虽然它当然有能力处理基于密码的SSH身份验证,SSH密钥帮助保持简单。

点击文章一对多台主机ssh 密钥设置

创建新的SSH密钥对

如果您还没有要用于Ansible管理的SSH密钥对,我们可以立即在您的Ansible VPS上创建一个SSH密钥对。

我们将在我们的Ansible液滴上创建一个SSH密钥对,以与将管理的主机进行身份验证。

作为您将控制Ansible的用户,通过键入以创建RSA密钥对:

ssh-keygen 将要求您指定创建的密钥对的文件位置,密码和密码短语确认。按所有这些键的ENTER接受默认值。

您的新密钥可以在用户的~/.ssh目录中找到。公钥(可以共享的密钥)被调用id_rsa.pub。将调用私钥(您保持安全的私钥)id_rsa。

您可以将它们添加到您的DigitalOcean控制面板,以允许您将SSH密钥嵌入新创建的液滴。这将允许您的Ansible液滴立即SSH到您的新水滴,没有任何其他身份验证。

为此,请点击左侧导航菜单上的“SSH Keys”链接。在新屏幕中,点击右上角的“添加SSH密钥”按钮:

DigitalOcean添加键

在顶部字段中输入要与此键相关联的名称。在您的Ansible VPS实例上,键入此以获取您的公钥的内容:

cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0 返回给您的字符串是您需要粘贴在DigitalOcean控制面板的第二个字段中的字符串:

DigitalOcean Ansible密钥

单击“创建SSH密钥”将您的密钥添加到控制面板。现在,无论何时创建新的小滴,您都将能够将公共SSH密钥嵌入到新服务器中,从而允许您与您的Ansible实例进行通信。您只需要在液滴创建过程的“添加可选SSH密钥”部分中选择密钥:

DigitalOcean嵌入密钥

将现有SSH密钥对传输到Ansible

如果您已经有一个SSH密钥对,您正在使用它来认证您的水滴,您可以将凭据转移到您的新Ansible液滴,而不是创建一个新的对。这具有使其能够自动使用已配置为使用密钥的任何服务器的优点。

在您为小滴配置SSH密钥身份验证的计算机上,键入以下内容获取公钥:

cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0 在您的Ansible服务器上,您需要创建一个隐藏目录来存储您的密钥。调用它.ssh,以便SSH程序知道在哪里找到它:

mkdir ~/.ssh 我们应该锁定对此目录的访问,以便只有您可以输入或写入:

chmod 700 ~/.ssh 现在,移动到目录并打开id_rsa.pub在文本编辑器中调用的文件:

cd ~/.ssh nano id_rsa.pub 将您的公钥的输出从家用计算机粘贴到此文件中:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0 保存并关闭文件。我们将通过键入以下内容确保此文件具有正确的权限:

chmod 644 id_rsa.pub 现在,回到配置为SSH密钥访问的本地计算机上,键入:

cat ~/.ssh/id_rsa —–BEGIN RSA PRIVATE KEY—– MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq . . . . . . cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7 1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo —–END RSA PRIVATE KEY—– 输出将相当长。

回到你的Ansible水滴,我们需要在目录中创建一个新文件~/.ssh:

nano id_rsa 在里面,将上一个命令的结果粘贴到本地计算机上:

—–BEGIN RSA PRIVATE KEY—– MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq . . . . . . cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7 1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo —–END RSA PRIVATE KEY—– 确保包括第一个和最后一个标记线。它们是必需的,以便密钥文件有效。保存并关闭文件。

我们需要更改权限以确保此文件安全:

chmod 600 id_rsa 在这一点上,Ansible将能够使用这些SSH密钥与嵌入了密钥的任何服务器进行通信。

配置Ansible主机

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

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

sudo nano /etc/ansible/hosts 您将看到一个有很多示例配置的文件,这些配置对我们来说都不起作用,因为这些主机是组成的。因此,首先,我们通过在每行之前添加一个“#”来注释掉这个文件中的所有行。

我们将在文件中保留这些示例,以帮助我们进行配置,如果我们希望在将来实现更复杂的场景。

一旦所有的行都注释掉,我们可以开始添加我们的实际主机。

hosts文件是相当灵活的,可以用几种不同的方式配置。我们将使用的语法看起来像这样:

[ group_name ] alias ansible_ssh_host = server_ip_address group_name是一个组织标记,可让您使用一个字来引用其下列出的任何服务器。别名只是一个引用该服务器的名称。

所以在我们的场景中,我们想象我们有三个服务器,我们将要控制与Ansible。这些服务器可以从Ansible液滴输入:

ssh root @ server_ip_address 如果您已正确设置此密码,则不应提示您输入密码。我们假设我们的液滴的IP地址192.0.2.1,192.0.2.2和192.0.2.3。我们将设置它,这样我们可以参考这些独特的host1,host2和host3,或为一组的droplets。

这是我们应该添加到我们的hosts文件来完成这个块:

[ drops ] 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连接到任何这些主机,命令将失败(假设您不是以root用户身份操作)。这是因为您的SSH密钥是为远程系统上的root用户嵌入的,并且Ansible将默认尝试作为当前用户连接。连接尝试将获得此错误:

host1 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue 在我的Ansible电脑上,我使用的是一个叫用户demo。Ansible将尝试连接到每个主机ssh demo@server。如果演示用户不在远程系统上,这将不工作。

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

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

sudo mkdir /etc/ansible/group_vars sudo nano /etc/ansible/group_vars/droplets 我们可以把我们的配置在这里。YAML文件以“—”开头,因此请确保不要忘记该部分。


ansible_ssh_user: root 保存并在完成后关闭此文件。

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

使用简单的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 droplets 我们还可以指定单个主机:

ansible -m ping host1 我们可以通过用冒号分隔它们来指定多个主机:

ansible -m ping host1:host2 该-m ping命令的部分是Ansible指令使用“平”模块。这些基本上是可以在远程主机上运行的命令。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的最强大的功能在这篇文章:Playbooks。我们已经通过Ansible为我们的服务器建立了一个很好的基础,但是在将来的一篇文章中,我们将介绍如何使用Playbooks来自动配置远程计算机。