如何在 Ubuntu 12.04 VPS 上安装和配置 Ansible

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


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

虽然 Linux 系统中有很多流行的配置管理系统,如 Chef 和 Puppet,但这些系统往往比许多人想要或需要的更为复杂。

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

Ansible是如何工作的?


Ansible 通过从安装和配置了 Ansible 组件的计算机配置客户端机器。

它通过正常的 SSH 渠道进行通信,以便从远程机器中获取信息,发出命令和复制文件. 因此,Ansible 系统不需要在客户端计算机上安装任何额外的软件。

任何具有 SSH 端口曝光的服务器都可以被带入 Ansible 的配置伞中,无论其生命周期的哪个阶段。

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

Ansible采用模块化方法,使其易于扩展,以使用主系统的功能来处理特定的场景。

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

在 Ubuntu 12.04 VPS 上安装 Ansible


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

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

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

1sudo apt-get update
2sudo apt-get install python-software-properties

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

1sudo add-apt-repository ppa:rquillo/ansible

按 Enter 以接受 PPA 添加。

接下来,我们需要更新我们的系统的包索引,以便它知道PPA中可用的包。

1sudo apt-get update
2sudo apt-get install ansible

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

设置 SSH 密钥


正如我们上面提到的,Ansible主要通过SSH与客户端计算机进行通信,虽然它确实有能力处理基于密码的SSH身份验证,但SSH密钥有助于使事情变得简单。

我们可以以两种不同的方式设置SSH密钥,取决于您是否已经拥有您想要使用的密钥,我们将假定您想要管理的服务器将是DigitalOcean dropplets。

创建一个新的 SSH 密钥对


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

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

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

1ssh-keygen

您将被要求指定创建的密钥对的文件位置,一个passsphrase和passsphrase确认。

您的新密钥可在您的用户 ~/.ssh 目录中找到。 公共密钥(您可以共享的密钥)称为 id_rsa.pub. 私钥(您保密的密钥)称为 id_rsa

您可以将它们添加到您的 DigitalOcean 控制面板中,以便您可以将您的 SSH 密钥嵌入新创建的 dropplets 中。

要做到这一点,请点击左侧导航菜单上的SSH 密钥链接,在新屏幕上,点击右上角的添加 SSH 密钥按钮:

DigitalOcean add key

在您的 Ansible VPS 实例中,键入此,以获取您的公共密钥的内容:

1cat ~/.ssh/id_rsa.pub

1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

返回给你的字符串是你需要粘贴到DigitalOcean控制面板的第二个字段:

DigitalOcean Ansible key

点击创建 SSH 密钥以将你的密钥添加到控制面板上。现在,每次你创建一个新的 dropplet,你将能够将你的公共 SSH 密钥嵌入到新的服务器中,允许你与你的 Ansible 实例进行通信。你只需要在 dropplet 创建过程的添加可选 SSH 密钥部分中选择该密钥:

DigitalOcean embed key

将现有的 SSH 密钥对转移到 Ansible


如果您已经有一个 SSH 密钥对,您正在使用它来通过您的 dropplets 进行身份验证,您可以将凭据转移到新的 Ansible 密钥对,而不是创建一个新的密钥对。

在您配置 SSH 密钥身份验证的计算机上,请通过键入:

1cat ~/.ssh/id_rsa.pub

1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

在您的 Ansible 服务器上,您需要创建一个隐藏的目录来存储您的密钥。

1mkdir ~/.ssh

我们应该锁定该目录的访问,以便只有您可以输入或写入它:

1chmod 700 ~/.ssh

现在,进入目录,并在文本编辑器中打开名为id_rsa.pub的文件:

1cd ~/.ssh
2nano id_rsa.pub

将您自家计算机的公钥输出粘贴到此文件中:

1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

保存和关闭文件 我们将通过键入确保此文件具有正确的权限:

1chmod 644 id_rsa.pub

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

1cat ~/.ssh/id_rsa

 1-----BEGIN RSA PRIVATE KEY-----
 2MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
 3N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
 4kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
 5ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
 6. . .
 7. . .
 8cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
 91VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
10qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
11-----END RSA PRIVATE KEY-----

产量将相当长。

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

1nano id_rsa

在内部,在本地计算机上粘贴上次命令的结果:

 1-----BEGIN RSA PRIVATE KEY-----
 2MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
 3N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
 4kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
 5ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
 6. . .
 7. . .
 8cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
 91VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
10qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
11-----END RSA PRIVATE KEY-----

请确保包含第一行和最后一个标记行. 它们是必要的,以便密钥文件是有效的. 保存和关闭文件。

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

1chmod 600 id_rsa

在此时,Ansible将能够使用这些SSH密钥与嵌入密钥的任何服务器进行通信。

配置 Ansible 主机


Ansible通过一个主机文件来跟踪它所知道的所有服务器,我们需要先设置此文件,才能开始与我们的其他计算机进行通信。

打开 root 特权的文件,如下:

1sudo nano /etc/ansible/hosts

您将看到一个具有许多示例配置的文件,其中没有一个实际上为我们工作,因为这些主机是组成的。

我们将将这些示例保存在文件中,以帮助我们在未来实现更复杂的场景时进行配置。

一旦所有的行被评论,我们可以开始添加我们的实际主机。

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

[group_name]
alias ansible_ssh_host=server_ip_address

group_name 是一个组织标签,允许您用一个单词参考其下列的任何服务器。

因此,在我们的场景中,我们想象我们有三个服务器,我们将使用Ansible来控制这些服务器。

ssh root@server_ip_address

如果您设置了密码,您不应该被要求使用密码。我们将假定我们的 dropplets 的 IP 地址为192.0.2.1,192.0.2.2192.0.2.3

这是我们应该添加到我们的主机文件来实现这一点的块:

[droplets]
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 用户)。

1host1 | 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 计算机上,我正在使用一个名为演示的用户。 Ansible 将尝试通过ssh demo@server连接到每个主机。

我们可以创建一个文件,告诉 dropplets组中的所有服务器使用根用户进行连接。

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

1sudo mkdir /etc/ansible/group_vars
2sudo nano /etc/ansible/group_vars/droplets

YAML文件以---开始,所以请确保您不忘记该部分。

1---
2ansible_ssh_user: root

保存并关闭此文件,当你完成。

如果您想指定每个服务器的配置细节,无论群组关联,您可以将这些细节放到一个文件中,在 /etc/ansible/group_vars/all. 单个主机可以通过在 /etc/ansible/host_vars 的目录下创建文件来配置。

使用简单的可理解命令


现在我们有我们的主机设置和足够的配置细节,使我们能够成功连接到我们的主机,我们可以尝试我们的第一个命令。

Ping您通过键入配置的所有服务器:

1ansible -m ping all

 1host1 | success >> {
 2    "changed": false,
 3    "ping": "pong"
 4}
 5
 6host3 | success >> {
 7    "changed": false,
 8    "ping": "pong"
 9}
10
11host2 | success >> {
12    "changed": false,
13    "ping": "pong"
14}

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

所有是指所有主机,我们可以很容易地指定一个组:

1ansible -m ping droplets

我们还可以指定个别主机:

1ansible -m ping host1

我们可以通过将它们与殖民地分开来指定多个主机:

1ansible -m ping host1:host2

命令的-m ping部分是向 Ansible 指示使用ping模块. 这些基本上是您可以在远程主机上运行的命令。

ping模块实际上没有任何参数,但我们可以尝试另一个命令,看看它是如何工作的。

模块允许我们将终端命令发送到远程主机并获取结果,例如,要找出我们主机1上的内存使用量,我们可以使用:

1ansible -m shell -a 'free -m' host1

1host1 | success | rc=0 >>
2             total used free shared buffers cached
3Mem:          3954 227 3726 0 14 93
4-/+ buffers/cache:        119 3834
5Swap:            0 0 0

结论


到目前为止,您应该将您的 Ansible 服务器配置为与您想要控制的服务器进行通信,我们已经验证了 Ansible 可以与每个主机进行通信,我们已使用ansible命令远程执行简单任务。

虽然这是有用的,但我们没有在本文中涵盖Ansible最强大的功能:Playbooks. 我们已经为通过Ansible与我们的服务器合作奠定了很好的基础,但重大的提升将在未来的文章中完成,当我们涵盖如何使用Playbooks来自动配置您的远程计算机时。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus