介绍
配置管理系统旨在使管理员和操作团队能够轻松控制大量服务器,它们允许您从一个中心位置自动控制多种不同的系统。
虽然 Linux 系统中有很多流行的配置管理系统,如 Chef 和 Puppet,但这些系统往往比许多人想要或需要的更为复杂。
在本指南中,我们将讨论如何在Ubuntu 14.04机器上安装Ansible,并讨论如何使用该软件的一些基本知识。
Ansible是如何工作的?
Ansible 通过从安装和配置了 Ansible 组件的计算机配置客户端机器。
它通过正常的 SSH 渠道进行通信,以便从远程机器中获取信息,发出命令和复制文件. 因此,Ansible 系统不需要在客户端计算机上安装任何额外的软件。
任何具有 SSH 端口曝光的服务器都可以被带入 Ansible 的配置伞中,无论其生命周期的哪个阶段。
您可以通过 SSH 管理的任何计算机,您也可以通过 Ansible 管理。
Ansible采用模块化方法,使其易于扩展,以使用主系统的功能来处理特定的场景。
配置文件主要以YAML数据序列化格式写作,因为其表达性质和与流行的标记语言的相似性,Ansible可以通过命令行工具或其称为Playbooks的配置脚本与客户端进行交互。
在 Ubuntu 14.04 上安装 Ansible
要开始探索Ansible作为管理我们的各种服务器的手段,我们需要在至少一台机器上安装Ansible软件。
获取Ubuntu Ansible的最佳方法是将项目的PPA(个人包档案)添加到您的系统中。
要做到这一点,我们需要安装software-properties-common
包,这将使我们能够轻松地使用PPA(这个包在Ubuntu的旧版本上被称为python-software-properties
。
1sudo apt-get update
2sudo apt-get install software-properties-common
安装后,我们可以通过键入以下命令添加 Ansible PPA:
1sudo apt-add-repository ppa:ansible/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 密钥
按钮:
在您的 Ansible VPS 实例中,键入此,以获取您的公共密钥的内容:
1cat ~/.ssh/id_rsa.pub
1[label Example public key]
2ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0
返回给你的字符串是你需要粘贴到DigitalOcean控制面板的第二个字段:
点击创建 SSH 密钥
以将你的密钥添加到控制面板上。现在,每次你创建一个新的 dropplet,你将能够将你的公共 SSH 密钥嵌入到新的服务器中,允许你与你的 Ansible 实例进行通信。你只需要在 dropplet 创建过程的添加可选 SSH 密钥
部分中选择该密钥:
将现有的 SSH 密钥对转移到 Ansible
如果您已经有一个 SSH 密钥对,您正在使用它来通过您的 dropplets 进行身份验证,您可以将凭据转移到新的 Ansible 密钥对,而不是创建一个新的密钥对。
在您配置 SSH 密钥身份验证的计算机上,请通过键入:
1cat ~/.ssh/id_rsa.pub
1[label Example public key]
2ssh-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
将您自家计算机的公钥输出粘贴到此文件中:
1[label Example id_rsa.pub]
2ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0
保存和关闭文件 我们将通过键入确保此文件具有正确的权限:
1chmod 644 id_rsa.pub
现在,回到配置为 SSH 密钥访问的本地计算机上,键入:
1cat ~/.ssh/id_rsa
1[label Example private key]
2-----BEGIN RSA PRIVATE KEY-----
3MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
4N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
5kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
6ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
7. . .
8. . .
9cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
101VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
11qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
12-----END RSA PRIVATE KEY-----
产量将相当长。
回到您的 Ansible 滴,我们需要在 ~/.ssh
目录中创建一个新的文件:
1nano id_rsa
在内部,在本地计算机上粘贴上次命令的结果:
1[label id_rsa]
2-----BEGIN RSA PRIVATE KEY-----
3MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
4N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
5kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
6ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
7. . .
8. . .
9cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
101VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
11qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
12-----END RSA PRIVATE KEY-----
请确保包含第一行和最后一个标记行. 它们是必要的,以便密钥文件是有效的. 保存和关闭文件。
我们需要更改权限以保持此文件的安全:
1chmod 600 id_rsa
在此时,Ansible将能够使用这些SSH密钥与嵌入密钥的任何服务器进行通信。
配置 Ansible 主机
Ansible通过一个主机
文件来跟踪它所知道的所有服务器,我们需要先设置此文件,才能开始与我们的其他计算机进行通信。
打开 root 特权的文件,如下:
1sudo nano /etc/ansible/hosts
您将看到一个具有许多示例配置的文件,其中没有一个实际上为我们工作,因为这些主机是组成的。
我们将将这些示例保存在文件中,以帮助我们在未来实现更复杂的场景时进行配置。
一旦所有的行被评论,我们可以开始添加我们的实际主机。
主机文件相当灵活,可以以几种不同的方式配置,但我们将使用的语法看起来像这样:
1[label Example hosts file]
2[group_name]
3alias ansible_ssh_host=your_server_ip
group_name 是一个组织标签,允许您用一个单词参考其下列的任何服务器。
因此,在我们的场景中,我们想象我们有三个服务器,我们将使用Ansible来控制这些服务器。
1ssh root@your_server_ip
如果您设置了密码,您不应该被要求使用密码。我们将假定我们的 dropplets 的 IP 地址为192.0.2.1
,192.0.2.2
和192.0.2.3
。
这是我们应该添加到我们的主机文件来实现这一点的块:
1[droplets]
2host1 ansible_ssh_host=192.0.2.1
3host2 ansible_ssh_host=192.0.2.2
4host3 ansible_ssh_host=192.0.2.3
主机可以分为多个组,组可以为所有成员配置参数。
使用当前设置,如果我们尝试使用 Ansible 连接到这些主机中的任何一个,该命令将失败(假设您不是 root 用户)。
1[label Ansible connection error]
2host1 | 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[label /etc/ansible/group_vars/droplets]
2---
3ansible_ssh_user: root
保存并关闭此文件,当你完成。
如果您想指定每个服务器的配置细节,无论群组关联,您可以将这些细节放到一个文件中,在 /etc/ansible/group_vars/all
. 单个主机可以通过在 /etc/ansible/host_vars
的目录下创建文件来配置。
使用简单的可理解命令
现在我们有我们的主机设置和足够的配置细节,使我们能够成功连接到我们的主机,我们可以尝试我们的第一个命令。
Ping您通过键入配置的所有服务器:
1ansible -m ping all
1[label Ping output]
2host1 | success >> {
3 "changed": false,
4 "ping": "pong"
5}
6
7host3 | success >> {
8 "changed": false,
9 "ping": "pong"
10}
11
12host2 | success >> {
13 "changed": false,
14 "ping": "pong"
15}
这是一个基本的测试,以确保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
1[label Shell output]
2host1 | success | rc=0 >>
3 total used free shared buffers cached
4Mem: 3954 227 3726 0 14 93
5-/+ buffers/cache: 119 3834
6Swap: 0 0 0
结论
到目前为止,您应该将您的 Ansible 服务器配置为与您想要控制的服务器进行通信,我们已经验证了 Ansible 可以与每个主机进行通信,我们已使用ansible
命令远程执行简单任务。
虽然这是有用的,但我们没有在本文中涵盖Ansible最强大的功能:Playbooks. 我们已经为通过Ansible与我们的服务器合作奠定了很好的基础,但重大的提升将在未来的文章中完成,当我们涵盖如何使用Playbooks来自动配置您的远程计算机时。