# 简介
# 配置信息
项目的配置信息分为多种,管理措施也不同:
- 源代码
- 用 Git 或 SVN 服务器管理。
- 运行环境
- 比如运行项目需要的操作系统、依赖软件。
- 如果项目部署在虚拟机上,可用 Ansible 批量管理主机。
- 如果项目部署在容器中,可用 Dockerfile 配置运行环境。
- 配置文件
- 有的项目没有准备配置文件,而是将配置信息直接写在代码中。这样不方便管理配置信息,仅适用于开发阶段。
- 配置文件可能包含服务器密码等敏感信息,因此不应该保存在项目的 Git 仓库中,否则会被所有人看见。
- 常见需求:
- 静态配置
- :该配置只需在程序启动时读取一次,在程序运行时不会变化。
- 如果存在大量非私密的静态配置信息,可以保存到一个独立的 Git 仓库中,并进行版本控制。
- 动态配置
- :该配置在程序运行时会多次读取,需要经常更新,甚至实时更新。
- 用传统的 Ansible 等脚本工具不方便管理动态配置,建议使用 Consul 等配置管理工具。
- 服务发现
- :有的程序需要获取其它服务的数量、地址等配置信息。
- 可能属于静态配置,也可能属于动态配置。
- 静态配置
- artifact
- :泛指项目的构建产物,又称为工件、制品。
- 建议根据 artifact 的文件格式,选用合适类型的仓库。例如 jar 包、JS 包存储到 Nexus 服务器,Docker 镜像存储到 Harbor 服务器。
# 配置管理工具
适合批量管理主机、静态配置的工具:
- Ansible
- 一个命令行工具。
- 采用 Python 语言开发,于 2012 年发布。
- 采用主从架构。以 SSH 方式控制远程主机,可以执行任意命令、传输文件。
- Saltstack
- 一个命令行工具。
- 采用 Python 语言开发,于 2011 年发布。
- 采用 C/S 架构。需要在主控主机上运行 master 进程,在受控主机上运行 minion 进程。它们之间通过消息队列 ZeroMQ 进行通信。
- Puppet
- 一个 Web 服务器。
- 采用 Ruby 语言开发,于 2005 年发布。
- 采用 C/S 架构、HTTP 通信。需要在主控主机上运行 master 进程,在受控主机上运行 agent 进程。
- Chef
- 一个 Web 服务器。
- 采用 Ruby 语言开发,于 2009 年发布。
- 采用 C/S 架构、HTTP 通信。
- Terraform
- 一个命令行工具。
- 2014 年由 HashiCorp 公司开源,采用 Golang 语言开发。
- 可用 HCL 格式的配置文件定义 VPS、VPC、S3 Bucket 等基础设施,便于批量创建、管理。
- AWS、Azure 等云平台已允许用户使用 terraform 管理云资源。
适合动态配置的工具:
- confd
- 一个命令行工具,采用 Golang 语言开发,用于自动生成配置文件。
- 原理:从 zk、etcd、consul、redis 等后端轮询配置参数,根据 Golang 模板文件,渲染出配置文件。
- Apollo
- 一个 Web 服务器。提供了丰富的配置管理功能,支持划分环境、版本回滚、安全审计。
- 由携程公司开源,采用 Java 语言开发。
适合服务发现的工具:
- Zookeeper
- etcd
- Consul
- Nacos
- Eureka :2014 年由 Netflix 公司开源,2021 年停止更新。