一、环境说明

系统:Ubuntu

控制节点(Control Node):安装 Ansible,发号施令

受管节点(Managed Node)×2:被控制、被部署的机器

# 控制节点安装
sudo apt update && sudo apt install -y ansible

# 生成 SSH 密钥并分发(免密登录前提)
ssh-keygen -t rsa -b 4096
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
# 验证免密
ssh root@192.168.1.101 hostname

二、编写 Inventory(主机清单)

/etc/ansible/hosts 或项目里 hosts.ini:

[web]
node1 ansible_host=192.168.1.101
node2 ansible_host=192.168.1.102

[web:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa

测试连通:ansible web -m ping

三、一键部署 Nginx 的 Playbook

install_nginx.yml:

---
- name: 部署 Nginx
  hosts: web
  become: yes
  tasks:
    - name: 安装 nginx
      apt:
        name: nginx
        state: present

    - name: 写入自定义首页
      copy:
        content: "Hello from Ansible - {{ inventory_hostname }}"
        dest: /var/www/html/index.html

    - name: 启动并设置开机自启
      service:
        name: nginx
        state: started
        enabled: yes

执行:ansible-playbook -i hosts.ini install_nginx.yml

为什么用 Ansible? 声明式写法、幂等(跑多少遍结果一致)、可批量、可复用——一台和一百台花的时间一样。

四、排障实录:netplan 网卡配置错误导致节点失联

这是我最深刻的一个坑:

现象: 给节点配置静态 IP 时,我改了 /etc/netplan/50-cloud-init.yaml,把网卡节点名写错(写成了和系统实际网卡名不符),执行后 SSH 断开、节点失联,Ansible 也连不上,整台机器”变砖”。

排查与解决:

# 1. 从虚拟机控制台 / 本地会话进入系统,确认实际生效的网卡名
ip link
ip addr

# 2. 查看 netplan 配置,核对里面写的网卡名是否一致
cat /etc/netplan/50-cloud-init.yaml

# 3. 修正网卡名和 IP/网关字段,先用 netplan try 安全应用
#    (try 会等待确认,如果配置错误导致失联,超时后自动回滚,避免二次失联!)
sudo netplan try

# 4. 确认没问题后正式应用
sudo netplan apply

# 5. 验证网络互通
ping -c 4 192.168.1.101
  • 配置网卡前先 ip link 看实际网卡名(ens33 / ens192 / eth0…),不同系统不一样。
  • 改静态 IP 这类”会断网”的操作,永远优先用 netplan try / nmcli 的安全应用方式,别直接 apply 把自己关在门外。
  • 手边留一个控制台(KVM/VMware/VNC)入口,网断了也能进去救。

五、Ansible 常见故障排查

现象原因解决
unreachable网络不通 / 端口没开 / IP 配错ping、ssh 手测;查网卡和防火墙
Permission deniedSSH 免密没配好用 ssh-copy-id 重新分发公钥
Host key verification failed目标主机指纹变了ssh-keygen -R 192.168.1.101 清除旧指纹
模块找不到 / 语法错Playbook 缩进或字段错误检查 YAML 缩进(每层用 2 空格)
节点失联(网卡写错)50-cloud-init.yaml 网卡名错误控制台进入 → netplan try 回滚 → 修正后 apply

分类: Ansible