导航指南:初始环境设置
注意:这是《导航指南》内容的早期版本,由 DigitalOcean 解决方案工程师提供。 本书的目标是帮助企业客户规划他们的基础设施需求,提供沿途的工作示例,并包括技术细微差别和使某些决策比其他决策更好的“原因”。
这本书和随附的代码将在 GitHub 存储库中公开提供。 因为这是一个早期版本,所以这本书还没有完成,存储库还没有公开,但请继续关注!
这是本书的第一个动手部分。
首先,我们将回顾我们将使用的工具,它们如何组合在一起,以及当您开始在 DigitalOcean 上创建和管理您的基础设施时它们如何对您有益。 之后,我们将设置一个单独的 Droplet,我们将使用它作为控制器来运行和使用我们的其余工具。
我们的工具带
我们将主要使用 Terraform、Ansible、terraform-inventory 和 Git。
地形
Terraform 是一个开源工具,可让您轻松地将基础架构描述为代码。 这意味着您可以像编写程序一样对资源进行版本控制,如果遇到错误,您可以回滚到工作状态。
Terraform 使用声明性语法 (HCL),旨在让人类和计算机都易于理解。 HCL 让您可以规划您的更改以供审核,并自动为您处理基础架构依赖项。
我们将使用 Terraform 创建 我们的基础架构——即创建 Droplet、浮动 IP、防火墙、块存储卷和 DigitalOcean 负载均衡器——但我们不会使用它来 配置 那些资源。 这就是 Ansible 的用武之地。
如果您想了解有关 Terraform 的更多信息,我们推荐一些资源:
Ansible
Ansible 是一个 配置管理 工具,它允许您系统地处理对系统的更改,并随着时间的推移保持其完整性。 Ansible 的标准模块库非常广泛,其架构也允许您创建自己的插件。
Ansible playbook 是 YAML 文件,它定义了您要管理的自动化。 与 Terraform 一样,您可以对剧本进行版本控制。 与 Terraform 不同,资源配置的更改不需要销毁和重新创建该资源; Ansible 将配置推送到您的基础架构。
Ansible 使用 SSH 连接,因此您无需在目标节点上安装代理即可使用它。 但是,这确实意味着 Ansible 需要知道要连接到哪些端点,这通常是使用清单文件定义的。 因为我们使用 Terraform 进行部署,并且它在文件中维护您的基础设施状态,所以我们将使用 terraform-inventory 动态地为 Ansible 提供其目标机器列表。
Ansible playbook 调用模块来进行配置更改或执行命令。 Ansible 有许多内置模块可以控制流行的软件或云供应商,包括 DigitalOcean。 在命令行中工作时,ansible-doc
命令是查看模块选项和详细信息的简便方法。 例如 ansible-doc -l
列出模块或调用特定模块来查看文档 ansible-doc digital_ocean
。 Playbooks 可以打包成角色以便于共享。 角色的主要公共存储库是 Ansible Galaxy。 本书中的代码示例利用多个角色来应用配置。
值得注意的是,Ansible 没有强制执行状态。 执行剧本只会运行剧本中的命令。 直接对 Ansible 管理的服务器进行更改可能会导致意想不到的后果。
如果您想了解有关 Ansible 的更多信息,我们推荐一些资源。 红帽拥有 Ansible 项目并提供培训选项。 这包括免费的精彩介绍视频课程以及更高级的课程:
terraform-库存
terraform-inventory
是一个动态清单脚本,它从 Terraform 的状态文件中提取资源信息,并以 Ansible 在执行 playbook 时可以用来定位特定主机的方式输出它。 它比这要复杂一些,但关键是 terraform-inventory
使您可以更轻松地同时使用 Terraform 和 Ansible。
吉特
我们将使用 Git 作为我们的版本控制系统。 您不需要特别深入了解 Git,但需要了解 提交更改、跟踪和克隆 。 因为我们可以对 Terraform 和 Ansible 文件进行版本控制,所以我们可以通过指定 Terraform 模块或 Ansible 角色的版本来在不同版本的基础设施上运行测试。
本书的存储库托管在 GitHub 上,但您可以使用任何 Git 托管服务进行自己的部署,例如 GitHub、GitLab 或 Bitbucket。
可选工具
DigitalOcean CLI 实用程序 doctl
通常有助于通过 API 快速访问您的帐户以创建或检索资源信息。 您可以在 项目 README 中找到设置 doctl
的说明,并在其 官方文档 中找到完整的使用信息。
设置控制器 Droplet
我们的控制器机器是我们将用来运行我们的工具的服务器。 我们将使用 Ubuntu 18.04 x64 (Bionic Beaver) Droplet,我们将对其进行配置以在创建 Droplet 时安装我们需要的所有工具。
注意:如果您更习惯使用其他操作系统(例如本地计算机上的 macOS),您可以这样做,只要它满足 Ansible 的系统要求。
首先,您需要:
- 一个 DigitalOcean 帐户。 您可以在 https://www.digitalocean.com/ 创建一个。
- 一个 SSH 密钥添加到您的 DigitalOcean 帐户 。
- 具有读/写权限的 DigitalOcean API 令牌。
现在是创建Droplet的时候了。 我们将使用以下选项:
- 图像: Ubuntu 18.04 x64。
- 尺寸: 1GB 标准液滴。
- 数据中心区域: 你的选择。
- 附加选项:私有网络、备份、用户数据和监控。
- SSH 密钥:选择你的。
当您选择用户数据选项时,将打开一个文本字段。 用户数据是用户可以在创建时提供给Droplet的任意数据。 CloudInit 通常在首次启动云服务器期间使用用户数据,以以 root 用户身份执行任务或运行脚本。
我们将使用 cloud-config 脚本来安装 Python 2.7、pip
(Python 包管理器)、Git、zip
、Terraform、terraform-inventory
和 Ansible。
注意:如果您愿意,您也可以手动安装此软件。 Terraform 和
terraform-inventory
是需要放在$PATH
中的 Go 二进制文件。 我们建议使用 Pip 安装 Ansible,而不是像 APT 这样的系统包管理器,因为它会保持最新状态并允许您将其安装在virtualenv
中。
#cloud-config # Source: https://git.io/nav-guide-cloud-config package_upgrade: true packages: - python - python-pip - git - zip - jq runcmd: - [curl, -o, /tmp/terraform.zip, "https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_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/digtialocean/navigators-guide.git"]
在此处,单击 创建 。 Droplet 本身将快速启动并运行,但其用户数据中的命令将需要一点时间才能完成运行。 您可以 登录到 Droplet 并查看 /var/log/cloud-init-output.log
以检查其状态。
最后一步是为控制器 Droplet 创建一个 SSH 密钥。 稍后我们将把它放在我们基础设施中的每个节点上。 您可以在登录到您的服务器时运行此单行程序以创建一个密钥并使用您的 Droplet 的主机名对其进行注释:
ssh-keygen -t rsa -C $(hostname -f)
您将能够在 /home/your_username/.ssh/
中看到公钥和私钥对。
下一步是什么?
您的控制器 Droplet 已设置,这意味着您可以开始使用这些工具。 在下一章中,我们将向您展示如何使用这些工具开始创建高度可用的基础架构。 这样做,您将开始看到 Ansible 和 Terraform 之间的区别。