首页/系统与基础设施/自动化运维速查/期望状态描述与实现分离
配置管理与编排60 条

期望状态描述与实现分离

期望状态描述与实现分离是声明式配置的核心:你只写「目标应该是什么」,由工具自己决定「怎么做到」。分离带来幂等重跑、可重复与可校验三件好处,代价是必须有人真正理解中间过程,工具覆盖不到的地方仍要落回命令式并单独标注。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

描述与实现分离是什么

声明式配置里,描述文件只表达结果:这个包要装、这个服务要启动、这个文件内容应为这样。达到结果的步骤——先检测再安装、先备份再替换、失败要不要重试——交给工具的实现层决定。分离的价值是同一份描述可以反复执行而不重复动作(幂等),也能作为校验依据:执行完读回实际状态与描述比对,不一致就是漂移。代价是工具不认识的自定义动作需要落回命令式,而命令式容易破坏幂等性,必须显式声明收敛条件。

基本信息

适用平台Ansible 模块、Terraform 资源、Kubernetes spec 与控制器、Puppet/Chef/Salt 资源
描述载体清单与 Playbook、资源定义文件、CRD、状态与类定义
实现层模块、Provider、控制器与调和循环、资源提供者
关键约束描述中不得夹带执行步骤;命令式补丁须声明幂等保证

典型使用场景

  • 跨环境一致:同一份描述在生产与预发落地相同状态
  • 幂等重跑:首次执行做变更,二次执行报告无变化
  • 漂移检测:描述文件本身就是比对的期望值来源
  • 自动纠偏:控制器按周期调和,把被手工改动的资源拉回期望状态
  • 变更评审:描述文件可 diff、可版本化,评审对象就是将要生效的内容
  • 替换一次性脚本:把「怎么装」的历史脚本转成「应该装什么」的长期描述

写法对照

写法对照
# 声明式:只说结果,工具负责检测与安装
- name: 确保依赖包存在
  ansible.builtin.package:
    name: nginx
    state: present

# 命令式补丁:必须自带幂等条件,否则每次执行都算变更
- name: 仅在文件缺失时才初始化
  ansible.builtin.command:
    cmd: /usr/local/bin/app --init
    creates: /var/lib/app/initialized

# 另一种收敛条件:用 changed_when 修正变更判定
- name: 查询状态并据结果决定后续
  ansible.builtin.command: /usr/local/bin/app status
  register: app_status
  changed_when: false            # 只读命令,不应被记成变更

# 校验:执行完读回实际状态,与描述比对
# 示例:kubectl get -o yaml 与清单 diff,或对配置文件做 checksum 比对

分层职责对照

层面写什么好处代价
描述层期望状态与约束可评审、可版本化、可复用表达能力受工具限制
实现层模块与调和逻辑幂等、自带重试与检测黑盒化,需理解关键行为
命令式补丁具体命令与条件覆盖一切特殊场景幂等需自己保证
校验层读回与比对确认描述真的生效需要额外采集成本
判断一条描述是否合格,看它能否连续执行两次:第一次报告变更、第二次报告无变化。若第二次仍报变更,说明描述里混入了每次都执行的命令式动作,需要补收敛条件。
声明式不等于安全:删除类语义(状态为缺席、按清单裁剪多余资源)一旦写错,会按描述忠实删掉真实数据。写这类描述前先做差异预览,并确认目标范围。

易错点

  • 描述文件里塞满 shell 命令:每次执行都判定为变更,幂等性丧失,也无法判断是否真的收敛
  • 只描述不校验:以为工具报成功就等于生效,实际服务起没起、端口通不通没人确认
  • 把实现细节写进描述层(指定包管理器与选项):换发行版或换工具时描述整体失效
  • 描述文件与生效状态脱节:有人手工改过且未回写,下次调和把改动覆盖,出现「改完自己变回去」
  • 控制器或调和循环不在位(无权、被停用、崩溃):描述看着正确,实际长期无人执行

数据来源与参考

  • Kubernetes 官方文档:声明式配置与控制器调和机制
  • Ansible 官方文档:模块化任务与幂等性说明
  • Terraform 官方文档:期望状态与 Provider 模型

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/desired-state-description-implementation-separation.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​