Ansible 在控制节点运行,通过 SSH/WinRM 等连接受管节点,默认不要求在目标机安装常驻 Agent。它的价值是使用幂等模块把重复运维操作变成可审计自动化。
## 项目结构
```text
ansible-project/
├── ansible.cfg
├── inventories/
│ ├── dev/
│ └── prod/
├── group_vars/
├── host_vars/
├── playbooks/
├── roles/
└── collections/requirements.yml
```
配置、Inventory、Playbook 和依赖都进入版本控制,但 Vault 密码和 SSH 私钥不能提交。
## Inventory
```ini
[web]
web01 ansible_host=192.0.2.11
web02 ansible_host=192.0.2.12
[db]
db01 ansible_host=192.0.2.21
[production:children]
web
db
```
主机应按 What、Where、When 分组,例如应用、区域和环境。连接账号、端口等行为变量可以放 group_vars,但 Secret 使用 Vault 或外部 Secret 插件。
验证:
```bash
ansible-inventory -i inventories/dev --graph
ansible-inventory -i inventories/dev --host web01
ansible all -i inventories/dev -m ansible.builtin.ping
```
## Ad Hoc 命令
```bash
ansible web -i inventories/dev -m ansible.builtin.command -a 'uptime'
ansible all -i inventories/dev -m ansible.builtin.setup -a 'filter=ansible_distribution*'
ansible web -i inventories/dev -b -m ansible.builtin.package -a 'name=nginx state=present'
ansible web -i inventories/dev -m ansible.builtin.service -a 'name=nginx state=started'
```
优先使用完全限定模块名和专用模块。command 不经过 shell;只有确实需要管道、重定向时才使用 shell,并严格控制变量输入。
## 幂等与 check mode
好的任务重复执行不会产生无意义变更。修改生产前使用:
```bash
ansible-playbook -i inventories/prod site.yml --syntax-check
ansible-playbook -i inventories/prod site.yml --check --diff --limit web01
```
并非所有模块都完全支持 check mode,所以仍需要测试环境和小批量 limit。
## 安全连接
- 为自动化使用专用、可审计账号。
- SSH Key 设置口令或由凭证系统托管。
- sudo 只允许所需操作。
- 保持 host key checking,避免连接到伪造主机。
- 控制节点等同高权限管理面,需要补丁、MFA、最小人员访问和日志。
- 不在命令行通过 extra-vars 传明文密码。
## 学习顺序
Inventory 与连接→常用模块→Playbook→变量和模板→Handlers/Blocks→Vault→Roles/Collections→动态 Inventory 与自动化平台。每一步都用“执行两次是否仍正确、失败是否可恢复”验证。
参考:https://docs.ansible.com/projects/ansible/latest/getting_started/