0aa8fe6
这次没有正文改动。
这是 automation/Ansible 批量执行与 playbook.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
e4d2cd0
@@ -0,0 +1,105 @@ +--- +tags: [Ansible, 自动化, 批量] +order: 10 +--- + +# Ansible 批量执行与 playbook + +## 场景 + +要在几十台 Linux 上统一装包、推配置、重启服务,SSH 一台台敲太慢。 + +## 前置条件 + +- 控制机到目标机 SSH 免密 +- 目标机有 python +- 目标机清单(分组、地址) + +## 配置 + +```bash +dnf install -y ansible-core # 或 pip install ansible + +# 清单 +cat >/etc/ansible/hosts <<'EOF' +[web] +10.0.0.21 +10.0.0.22 + +[db] +10.0.0.31 + +[all:vars] +ansible_user=deploy +ansible_ssh_private_key_file=/home/deploy/.ssh/id_ed25519 +EOF + +# 连通性 +ansible all -m ping +ansible web -m shell -a "uptime" +``` + +playbook 示例: + +```yaml +# site.yml +- hosts: web + become: yes + tasks: + - name: 装 nginx + dnf: + name: nginx + state: present + + - name: 推配置 + copy: + src: files/nginx.conf + dest: /etc/nginx/nginx.conf + mode: "0644" + notify: reload nginx + + - name: 确保服务启动 + service: + name: nginx + state: started + enabled: yes + + handlers: + - name: reload nginx + service: + name: nginx + state: reloaded +``` + +```bash +ansible-playbook site.yml --check # 先演练 +ansible-playbook site.yml --limit 10.0.0.21 +``` + +## 验证 + +```bash +ansible-playbook site.yml --syntax-check +ansible all -m command -a "systemctl is-active nginx" +``` + +## 回滚 + +playbook 本身没有统一回滚,靠写反向任务或者备份原文件。 + +```yaml +- name: 备份 + copy: + src: /etc/nginx/nginx.conf + dest: /etc/nginx/nginx.conf.bak + remote_src: yes +``` + +## 坑 + +- **`--check` 不等于安全**,用 `shell` 模块时 check 也会真跑。 +- 用 `shell` 而不是 `command`/`copy`/`template`,就丢掉了幂等性。 +- 忘记 `become: yes`,任务全报权限不足。 +- 目标机没 python,`ping` 直接失败。 +- `gather_facts` 在几百台时很慢,可以关掉。 +- 改完配置不 `handlers` 触发 reload,服务还是旧配置。