导航指南:初始环境设置

这是本书的第一个动手部分。首先,我们将详细介绍我们将使用的工具,它们如何组合在一起,以及在您开始在DigitalOcean上创建和管理基础架构时如何对您有所帮助。然后,我们将设置一个Droplet,我们将使用它作为控制器来运行并使用我们工具带的其余部分。

注意 :这是DigitalOcean解决方案工程师提供的导航指南手册内容的早期版本。 本书的目标是帮助企业客户规划他们的基础设施需求,提供工作示例,并包括技术细微差异和“为什么”使某些决策比其他决策更好。

本书和附带代码将在GitHub存储库中公开提供。 由于这是早期版本,本书尚未完成,存储库尚未公开,但敬请期待!

这是本书的第一个动手部分。 首先,我们将详细介绍我们将使用的工具,它们如何组合在一起,以及在您开始在DigitalOcean上创建和管理基础架构时如何对您有所帮助。

然后,我们将设置一个Droplet,我们将使用它作为控制器来运行并使用我们工具带的其余部分。

我们的工具带

我们将主要使用TerraformAnsibleterraform-inventoryGit

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服务,例如GitLabBitbucket ,但指定模块和角色源的方式因服务而异。

可选工具

DigitalOcean CLI实用程序doctl通常有助于通过API快速访问您的帐户以创建或检索资源信息。 您可以在项目README中找到说明来设置doctl ,并在其官方文档中找到完整的使用信息。 与输入和运行curl命令相比,它使抓取图像和SSH密钥ID变得更加简单快捷。

设置控制器Droplet

我们将使用Ubuntu 16.04 x64(Xenial Xerus)Droplet作为我们的控制器机器。 这是我们将运行我们的工具的服务器。

首先,您需要:

现在是创建Droplet的时候 您可以使用如何创建您的第一个DigitalOceanDroplet进行详细演练。 我们将使用以下选项:

  • 图片: 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本身将快速启动并运行,但其用户数据中的命令需要一点时间才能完成运行。 您可以登录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之间的差异,并更好地了解它们如何适用于您的部署。