Ansible 批量执行与 playbook
场景
要在几十台 Linux 上统一装包、推配置、重启服务,SSH 一台台敲太慢。
前置条件
- 控制机到目标机 SSH 免密
- 目标机有 python
- 目标机清单(分组、地址)
配置
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 示例:
# 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
ansible-playbook site.yml --check # 先演练
ansible-playbook site.yml --limit 10.0.0.21
验证
ansible-playbook site.yml --syntax-check
ansible all -m command -a "systemctl is-active nginx"
回滚
playbook 本身没有统一回滚,靠写反向任务或者备份原文件。
- 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,服务还是旧配置。