# 简介

# 配置信息

项目的配置信息分为多种,管理措施也不同:

  • 源代码
    • 用 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 年停止更新。

# GitOps

:一种配置文件的管理方案,于 2017 年提出。

  • 特点:
    • 将全部软件的配置文件存储在 Git 仓库中,能够据此重新部署项目。
    • 当用户修改 Git 仓库中的配置文件时,可以自动触发 CI/CD 脚本。
  • 优点:
    • 记录每次修改的版本,可以将配置文件回滚到任意历史时刻的状态。
    • 多个用户操作时,可以通过 PR 请求的方式,修改 master 分支的配置文件,实现审批。