相同点:
- 代码即基础设置,均采用DSL
- 都可用于状态管理,版本管理
都可以通过插件实现全覆盖
不同点:
- Terraform偏重于不可变环境,如docker,vm(镜像部署模式,read only),Ansible/Saltstack/Puppet偏重于可变环境(如传统部署模式,状态幂等)
- 前者偏重于任务编排管理(如扩容缩容),后者偏重于配置管理(节点版本变更)
- 前者记录变更历史和结果,后者侧重于当前状态,无历史跟踪

因此使用何种工具取决于你业务中的场景,主要有以下四点:
- Configuration Management vs Orchestration
- Mutable Infrastructure vs Immutable Infrastructure
- Procedural vs Declarative
- Client/Server Architecture vs Client-Only Architecture
ref:
- https://blog.gruntwork.io/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c
- https://blog.gruntwork.io/a-comprehensive-guide-to-terraform-b3d32832baca
- https://www.itculate.io/2017/02/ansible-vs-terraform-vs-salt/
- https://selleo.com/blog/terraform-vs-ansible