Infra:管理基础设施的实用工具

v1.4.0 2020-08-22 08:30 UTC

This package is auto-updated.

Last update: 2024-09-22 17:49:03 UTC


README

介绍

Infra 允许您以您可以在 GraphQL 服务中加载的方式定义您的所有基础设施对象。例如:主机、主机组、用户、DNS、监控、备份规则、部署等,以及它们的所有关系。

将您的基础设施作为图形访问允许您做几件有趣的事情

  • 从单个源(ansible、puppet、rundeck 等)生成多个库存定义
  • 生成备份和监控服务的配置文件
  • 生成复杂的防火墙脚本
  • 在上下文中配置对象。例如,将 DNS 记录作为您的部署的一部分配置,或将监控规则作为您的主机组的一部分配置
  • 根据基础设施对象生成仪表板配置
  • 生成全面的基础设施文档
  • 创建脚本,以语言无关的方式操作您的基础设施数据
  • 由于您的配置仅由 YAML 文件组成,因此一切都可以通过脚本进行大量脚本化(导入和导出所有相关系统的数据)并通过版本控制进行管理。

资源

您将在 YAML 文件中将基础设施定义为一系列资源。格式大量受到 Kubernetes 的启发。以下是一个示例

---
kind: Host
metadata:
  name: my-app-server
  description: This my application server
spec:
  os: Ubuntu 16.04
  publicIp: 192.168.1.1
  privateIp: 10.0.1.1
  hostGroups: app-servers
---
kind: HostGroup
metadata:
  name: app-servers
  description: All my application server
  labels:
    color: green
spec: ~

对于更全面的示例,请参阅此存储库中的 example/ 目录。

您可以在独立的 YAML 文件中定义资源,或者(如本例所示)使用 YAML 的 多文档功能 在一个文件中配置多个资源

如果您熟悉 Kubernetes,您会感到非常自在。

每个资源都使用 kind 键指定其类型。以下列出了可用的资源类型列表。

资源包含一个 metadata 键,允许您指定资源名称、描述、一组标签和注解(有关元数据的更多信息见下文)。

spec 键配置资源,其可用的键取决于您创建的资源 kind

安装

cd /opt
git clone git@github.com:linkorb/infra.git
cd infra
composer install # See https://getcomposer.org.cn/download/ if you don't have composer installed yet

注意:强烈建议将 bin/ 添加到您环境变量的 PATH 中,这样您就可以轻松地从系统中的任何位置调用 infra 命令行工具。

如果您正在使用 Bash,可以通过将以下行添加到您的 ~/.bashrc 文件来完成此操作

PATH=/opt/infra/bin:$PATH

不要忘记打开新的 bash 会话以使更改生效(关闭您的终端或再次运行 bash)。

配置

Infra 根据环境变量 INFRA_CONFIG 决定加载其基础设施数据的位置。它应包含一个目录的路径,其中包含描述您的基础设施的一组 YAML 文件。

您可以在任何位置定义该变量。例如,在您的 ~/.bashrc 中,或在 infra 目录根目录中的 .env 文件中(即 /opt/infra/.env)。提供了一个 .env.dist 文件。

如果 INFRA_CONFIG 未定义,它将默认指向 example/ 目录。

示例项目

example/ 目录包含示例基础设施配置(您可以通过查看 example/README.md 了解其详情)。要加载它,请确保您的 INFRA_CONFIG 变量指向 example/ 目录(需要绝对路径),或者简单地将 INFRA_CONFIG 保持未定义:默认加载示例项目。

在用 infra 配置您自己的基础设施之前,建议首先探索示例项目。示例配置将包含所有相关资源类型的示例,以合理的方式配置,以展示所有可用功能。

一旦您准备好定义自己的基础设施,只需将 INFRA_CONFIG 指向一个新目录(理想情况下是一个 git 仓库),然后开始在那里创建配置文件。

使用方法

只需键入 infra listinfra 即可获取可用命令列表。

使用 get 命令探索。

infra get 命令让您探索基础设施配置。键入 infra get --help 以查看其选项。所有参数都是可选的,您指定的参数越多,您的响应就越具体。以下是一些示例:

  • infra get:返回可用资源类型(及其别名)的列表。
  • infra get hosts:返回该资源类型定义的所有对象。
  • infra get hg:您可以使用任何可用的资源类型别名作为快捷方式:hg、hostGroup、HostGroup、hostGroups、HostGroups 在这里都是等效的。
  • infra get Host app0:根据类型和名称返回资源定义。
  • infra get HostGroup db hosts:根据类型、名称和属性名称从资源返回计算属性。

运行 GraphQL 查询

infra query 命令让您对基础设施配置执行 GraphQL 查询。它从 stdin 读取查询并将响应(作为 json)输出到 stdout

例如

infra query < /opt/infra/example/graphql/example.graphql

还启用了内省功能,因此您可以执行以下命令以获取所有支持类型及其详细信息的完整导出

infra query < /opt/infra/example/graphql/introspection.graphql

列出主机(主机扩展算法)

infra host:list <hosts> 允许您列出一系列主机。您可以提供的列表非常灵活。它使用主机扩展算法,该算法在 infra 中所有可以指定一组主机的地方使用。一些命令行实用程序允许您指定一组主机,但也可以通过资源定义中的 spec 部分的链接来指定主机。此命令有助于您测试此功能。以下是一些示例:

  • app0:(即主机名)返回仅包含 app0 主机的列表。
  • db:(即主机组名)返回包含该主机组中所有主机的列表。
  • app0,db0m:(即两个主机名)返回包含这些特定主机的列表。
  • app0,db:(即主机名和主机组名)返回包含 db 主机组的列表,以及特定的 app0 主机。
  • db0m,db:(即主机组名和已在该主机组中的主机名)返回包含 db 主机组的列表,不列出主机 db0m 两次。
  • prod-east:(即 prod 的子主机组名)返回 prod-east 主机组中的列表。
  • prod-west:(即 prod 的子主机组名)返回 prod-west 主机组中的列表。
  • prod:(即父主机组名)返回直接链接到 prod 主机组或通过其子主机组(prod-eastprod-west)链接到的所有主机列表。

如您所见,您可以自由混合和匹配主机名、主机组名并利用主机组中的层次结构。

通过 SSH 批量执行命令

infra host:exec <hosts> <command> 命令允许您批量在单个或多个主机上执行标准 shell 命令。

第一个参数是要执行命令的主机列表(遵循之前描述的 主机扩展算法),第二个参数是实际命令。

生成防火墙规则

Infra 可以根据非常简单的规则定义生成复杂的防火墙配置。例如,它允许您设置一个规则,允许从组 X 中的所有主机通过公共或私有 IP 地址访问指定端口到组 Y 中的所有主机。它将根据您的 infra 图动态生成所需的规则。您可以使用之前描述的主机扩展算法的全功能来指定源和远程目标主机列表。

运行 infra firewall:show <hosts>(或简写 infra f:s <hosts>)让 infra 为指定的主机生成防火墙规则。

运行 infra f:s db0m 将将生成的 iptables 规则输出到控制台,如下所示

#### iptables boilerplate removed for brevity ####

# rule=allow-mysql hosts='db' remoteHosts='app'
-A INPUT -d 10.0.2.1 -s 10.0.1.1 -p tcp --dport 3306 -j ACCEPT -m comment --comment "host='db1m' remoteHost='app1' rule='allow-mysql'"
-A INPUT -d 10.0.2.1 -s 10.0.1.2 -p tcp --dport 3306 -j ACCEPT -m comment --comment "host='db1m' remoteHost='app2' rule='allow-mysql'"

# rule=allow-ssh hosts='prod' remoteHosts=''
-A INPUT -d 10.0.2.1 -s 192.168.99.99 -p tcp --dport 22 -j ACCEPT -m comment --comment "host='db1m' rule='allow-ssh'"

COMMIT

将这些与 example/resources/FirewallRule/ 中的定义进行比较;

注意您将找到为 "db" 主机组(其中 db0m 是直接成员)定义的规则,以及为 "prod" 主机组(其中 db0m 通过 "prod" 子主机组 "prod-east" 间接成员)定义的规则。

此外,您还会注意到 db0m 服务器为 2 个应用服务器(app1 和 app2)生成了 2 条规则。如果您将添加 5 个更多应用服务器,Infra 将自动为每个服务器生成规则(总共 7 条)。

安装防火墙规则

运行 infra firewall:install <hosts> 来安装防火墙。Infra 将通过 ssh 登录到主机(

  1. 使用 iptables-save 备份当前的 iptable 规则。备份创建在 /tmp,确切文件名将在控制台上显示。
  2. 将防火墙规则复制到服务器
  3. 在规则文件上运行 iptables-restore 并输出结果。

脚本(您选择的语言)

如果您想用您选择的语言(php、node、python、ruby、bash 等)构建利用您的基础设施图的工具,脚本就是您的解决方案。

创建自己的脚本

要创建自己的自定义脚本

  1. 在您的设施配置存储库的 scripts/ 目录中添加一个可执行脚本
  2. 请确保为文件执行 chmod 755,因为只有可执行文件才会被 infra 识别
  3. 让您的脚本使用 infra query 命令执行 GraphQL 查询(通过 stdin 传递查询,从 stdout 获取响应 json)
  4. 使用返回的数据应用您认为合适的任何逻辑:导出到常用配置格式、调用一组 API、生成文档等。

SDKs

SDK 不是必需的,但它可以使您作为 infra 脚本开发者的生活更加方便。目前可用的 SDK

如果您为其他语言创建了 SDK,请告诉我们,我们将很高兴从本节中链接到它。

示例脚本

示例包含在 example/scripts 目录中。(欢迎通过 PR 添加更多语言的示例!)

核心脚本

一组“核心”脚本包含在此存储库的 scripts/ 目录中。核心脚本适用于许多 infra 用户将使用的常用应用程序。如果您已创建可重用的脚本并希望将其包含在核心脚本中,请确保发送 PR!

待办事项

  • 命令:添加 infra script 命令以列出和执行发现的脚本
  • 命令:添加 infra serve 命令以启动 GraphQL 服务器
  • 功能:允许内联资源,以便将资源定义为它们的容器的一部分(即 DnsRecord 作为 Deployment 的一部分等)
  • 功能:允许在资源配置中执行变量扩展(即访问父容器变量)
  • 特性:设置资源索引值(增量,从1开始)并在资源列表中输出。允许通过索引获取资源。这应该可以简化使用get命令的探索。
  • 特性:为脚本创建最小化的PHP SDK以简化查询
  • 特性:脚本发现
  • 特性:基础变量、目录引用、批量脚本命令等的基础架构清单文件
  • 特性:在主机扩展算法中支持通配符(即使用fnmatch)
  • 重构:将sensu命令提取到脚本中
  • 重构:将ansible命令提取到脚本中
  • 重构:外部类中的加载器
  • 重构:SSH或其他基础架构特定方法在外部服务中(使基础架构成为通用的资源容器)
  • 脚本:添加从基础架构生成HTML文档的脚本
  • 脚本:添加获取主机事实的脚本
  • 脚本:添加Grafana仪表板生成器
  • 脚本:添加DNS区域发布者
  • 脚本:添加Rundeck清单生成器
  • 特性:添加选项以通过标签增强加载的资源(例如,用于主机事实)
  • 资源:BackupRule + BackupPC、rsync或类似脚本的脚本
  • 资源:CronJob + conf.d/infra文件生成器
  • 资源:DockerEngine、DockerApp。使用docker-compose YAML作为内联规范
  • 资源:Secret
  • 资源:DatabaseCluster或MysqlCluster以设置和监控复制
  • 资源:Database或MysqlDatabase
  • 资源:Ingress或NginxSite或ApacheVhost以进行入口配置
  • 资源:GitRepository
  • 资源:Deployment / Ansistrano / Capistrano / DeployerPHP配置
  • 资源:用于管理部署配置文件的文件

许可证

MIT。请参阅许可证文件以获取详细信息。

由LinkORB工程团队提供


在我们的linkorb.com/engineering查看我们的其他项目。

顺便说一句,我们在招聘!