注意 :这是DigitalOcean解决方案工程师提供的导航指南手册内容的早期版本。 本书的目标是帮助企业客户规划他们的基础设施需求,提供工作示例,并包括技术细微差异和“为什么”使某些决策比其他决策更好。
本书和附带代码将在GitHub存储库中公开提供。 由于这是早期版本,本书尚未完成,存储库尚未公开,但敬请期待!
这是本书的第一个动手部分。 首先,我们将详细介绍我们将使用的工具,它们如何组合在一起,以及在您开始在DigitalOcean上创建和管理基础架构时如何对您有所帮助。
然后,我们将设置一个Droplet,我们将使用它作为控制器来运行并使用我们工具带的其余部分。
我们的工具带
我们将主要使用Terraform , Ansible , terraform-inventory
和Git 。
Terraform
Terraform是一款开源工具,可让您轻松地将您的基础架构描述为代码。 这意味着您可以使用与编写程序时相同的方式对版本进行版本控制,从而在出现错误时允许您回滚到工作状态。
Terraform使用一种声明性语法( HCL ),它被设计为易于人类和计算机都能理解。 HCL允许您计划您的更改以供审阅,并自动为您处理基础架构依赖关系。
我们将使用Terraform 创建我们的基础架构 - 即创建Droplet,浮动IP,防火墙,块存储卷和DigitalOcean负载平衡器 - 但我们不会使用它来配置这些资源。 这就是Ansible进来的地方。
Ansible
Ansible是一种配置管理工具,它允许您以保持其完整性的方式系统地处理系统更改。 Ansible的标准模块库非常丰富,其架构允许您创建自己的插件。
Playbooks是YAML文件,用于定义您想用Ansible管理的自动化。 像Terraform一样,您可以版本控制您的剧本。 与Terraform不同,资源配置的更改不需要销毁和重新创建该资源。
Ansible创建的目的是向外推进配置更改,这与Puppet和Chef等其他配置管理工具不同。 它也不要求预先在目标节点上安装代理程序,因为Ansible利用简单的ssh连接来配置基础结构。 然而Ansible确实需要知道它需要接触什么端点。 这通常由一个简单的库存文件来处理。 由于我们使用Terraform进行部署,并将其基础架构状态保存在文件中,因此我们将使用terraform-inventory为Ansible动态地提供其目标机器列表。
terraform-inventory
terraform-inventory
是一个动态库存脚本,它从Terraform的状态文件中提取资源信息,并以Ansible在执行剧本时可用于定位特定主机的方式输出。 它比这更复杂一点,但关键是, terraform-inventory
使您更容易将Terraform和Ansible一起使用。
Git
我们将使用Git作为我们的版本控制系统。 您不需要深入了解Git,但需要了解更改,跟踪和克隆 。 因为我们可以对Terraform和Ansible文件进行版本控制,所以我们可以通过指定Terraform模块或Ansible角色的版本来在不同版本的基础架构上运行测试。
本书的存储库托管在GitHub上 。 编写自己的模块和角色时,可以使用其他Git服务,例如GitLab或Bitbucket ,但指定模块和角色源的方式因服务而异。
可选工具
DigitalOcean CLI实用程序doctl
通常有助于通过API快速访问您的帐户以创建或检索资源信息。 您可以在项目README中找到说明来设置doctl
,并在其官方文档中找到完整的使用信息。 与输入和运行curl
命令相比,它使抓取图像和SSH密钥ID变得更加简单快捷。
设置控制器Droplet
我们将使用Ubuntu 16.04 x64(Xenial Xerus)Droplet作为我们的控制器机器。 这是我们将运行我们的工具的服务器。
首先,您需要:
- DigitalOcean账户。 您可以在https://www.digitalocean.com/上创建一个。
- 添加到您的DigitalOcean帐户的SSH密钥。 您可以在安全帐户设置页面中添加现有帐户 。 如需更多帮助, 如何在DigitalOcean Droplets上使用SSH密钥有一步一步的说明。
- 具有读/写权限的DigitalOcean API令牌 。 如何生成 API使用文档 的个人访问令牌部分有分步说明。
现在是创建Droplet的时候了 。 您可以使用进行详细演练。 我们将使用以下选项:
- 图片: Ubuntu 16.04 x64。
- 尺寸: 1GB标准Droplet。
- 数据中心地区 :您的选择。
- 其他选项:专用网络,备份,用户数据和监控。
- SSH密钥 :选择你的。
当您选择用户数据选项时,将打开一个文本字段。 用户数据是用户在创建时可以提供给Droplet的任意数据。 CloudInit使用用户数据,通常是在第一次启动云服务器期间,以root用户身份执行任务或运行脚本。
将以下脚本复制并粘贴到用户数据文本字段中。 它安装Python 2.7, pip
(Python包管理器),Git, zip
,Terraform, terraform-inventory
和Ansible。 您需要对此文件进行的唯一修改是设置您所需的用户名和公用SSH密钥。
#cloud-config
# Source: https://github.com/{{ config.nav-repo }}/example-code/01-intro/ch03/cloud-config.yaml
users:
- name: your_desired_username_here # <-- Specify your username here.
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh-authorized-keys:
- your_public_key_here # <-- Specify your public SSH key here.
package_upgrade: true
packages:
- python
- python-pip
- git
- zip
runcmd:
- [curl, -o, /tmp/terraform.zip, "https://releases.hashicorp.com/terraform/0.11.3/terraform_0.11.3_linux_amd64.zip"]
- [unzip, -d, /usr/local/bin/, /tmp/terraform.zip]
- [curl, -L, -o, /tmp/terraform-inventory.zip, "https://github.com/adammck/terraform-inventory/releases/download/v0.7-pre/terraform-inventory_v0.7-pre_linux_amd64.zip"]
- [unzip, -d, /usr/local/bin/, /tmp/terraform-inventory.zip]
- [pip, install, -U, pip, ansible]
- [git clone https://github.com/digitalocean/navigators-guide.git]
从这里,点击创建 。 Droplet本身将快速启动并运行,但其用户数据中的命令需要一点时间才能完成运行。 您可以并查看/var/log/cloud-init-output.log
以检查其状态。
注意 :如果您更喜欢其他操作系统,比如本地计算机上的Linux / BSD发行版或macOS,那么只要符合Ansible的系统要求 ,您就可以使用它。
如果您愿意,您也可以手动安装此软件。 Terraform和
terraform-inventory
是需要放在$PATH
中的Go二进制文件。 我们建议使用Pip安装Ansible,而不是像APT这样的系统软件包管理器,因为它保持最新并允许您在virtualenv
安装它。
最后一步是为控制器Droplet创建一个SSH密钥。 我们稍后将把它放在我们基础设施中的每个节点上。 您可以在登录到服务器时运行这一行程来创建密钥并使用Droplet的主机名对其进行注释:
ssh-keygen -t rsa -C $(hostname -f)
您将能够在/home/your_username/.ssh/
看到公钥和私钥对。 稍后,我们将使用这些来配置我们的Terraform变量。
现在我们可以开始使用我们刚刚设置的工具和控制器Droplet来开始创建一些可用的基础设施。 到下一章结束时,您将开始看到Ansible和Terraform之间的差异,并更好地了解它们如何适用于您的部署。