Ansible 自动化部署环境搭建:零基础配置第一台管理机

概述

你手头有五台以上的服务器吗?每次都要一台台ssh进去装软件、改配置、重启服务?Ansible 就是来解决这个痛点的。

Ansible 是一个基于 Python 的自动化运维工具。它不需要在被控服务器上装任何客户端,只要 SSH 能通就行。你用 YAML 写好剧本(Playbook),一条命令就能让一百台服务器同时执行。

这篇教程教你从零开始搭建 Ansible 环境,写第一个 Playbook,搞定日常运维。

准备工作

你需要这些:

  • 一台作为控制机的机器(可以是你的笔记本、Mac、或者一台 VPS),推荐 Ubuntu 22.04+ 或 macOS
  • 至少一台被管理的目标服务器(同样推荐 Ubuntu/Debian)
  • SSH 密钥登录已经配好,控制机能免密 ssh 到目标机
  • 控制机上有 Python 3.8+

先确认 Python 版本:

python3 --version

看到 3.8 以上的输出就行。

步骤

第1步:安装 Ansible

在控制机上执行:

sudo apt update
sudo apt install -y ansible

装完后检查版本:

ansible --version

输出类似 ansible [core 2.17.x] 就说明装好了。

如果你用的是 macOS:

brew install ansible

如果是 Python pip 方式安装(任何系统通用):

pip3 install ansible

第2步:配置主机清单

Ansible 需要一个文件来知道要管理哪些机器。编辑主机清单文件:

nano ~/.ansible/hosts

如果目录不存在先创建:

mkdir -p ~/.ansible

在里面写入你的服务器列表,按功能分组:

[webservers]
192.168.1.10 ansible_user=ubuntu
192.168.1.11 ansible_user=ubuntu

[databases]
192.168.1.20 ansible_user=root

你也可以用域名代替 IP。关键是要写对用户名,Ansible 会用这个用户 SSH 登录。

保存后,测试连通性:

ansible all -m ping

如果每台机器都返回 SUCCESS,说明 SSH 密钥登录配置正确。看到 UNREACHABLE 就回去检查 SSH 密钥和防火墙。

第3步:创建第一个 Playbook

在项目目录下新建文件:

mkdir -p ~/ansible-playbooks && cd ~/ansible-playbooks
nano deploy.yaml

写入以下内容:

---
- name: 基础环境配置
  hosts: webservers
  become: yes
  tasks:
    - name: 更新系统软件包
      apt:
        update_cache: yes
        upgrade: dist

    - name: 安装常用工具
      apt:
        name:
          - curl
          - wget
          - git
          - htop
          - nginx
        state: present

    - name: 创建部署用户
      user:
        name: deployer
        groups: sudo
        shell: /bin/bash

    - name: 设置防火墙规则
      ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop:
        - 22
        - 80
        - 443

这个 Playbook 做了四件事:更新系统、装常用工具和 Nginx、创建部署用户、开防火墙端口。

第4步:执行 Playbook

运行刚才写的剧本:

ansible-playbook deploy.yaml -u ubuntu --key-file ~/.ssh/id_rsa

参数说明:

  • -u ubuntu 指定 SSH 登录用户
  • --key-file 指定私钥路径(如果用默认密钥可以省略)

你会看到类似这样的输出:

PLAY [基础环境配置] *******************************

TASK [Gathering Facts] ***************************
ok: [192.168.1.10]
ok: [192.168.1.11]

TASK [更新系统软件包] ****************************
changed: [192.168.1.10]
changed: [192.168.1.11]

TASK [安装常用工具] ******************************
changed: [192.168.1.10] => (item=[...])
changed: [192.168.1.11] => (item=[...])

PLAY RECAP ***************************************
192.168.1.10 : ok=4 changed=3 unreachable=0 failed=0
192.168.1.11 : ok=4 changed=3 unreachable=0 failed=0

changed 表示执行了实际操作,ok 表示任务已通过无需变更。全部 failed=0 就说明成功了。

第5步:编写变量文件

把敏感信息抽离出来,保持 Playbook 干净。创建变量文件:

nano vars/main.yaml
---
deploy_username: deployer
firewall_ports:
  - 22
  - 80
  - 443
packages:
  - curl
  - wget
  - git
  - htop
  - nginx

然后在 Playbook 里引用:

---
- name: 基础环境配置
  hosts: webservers
  become: yes
  vars_files:
    - vars/main.yaml
  tasks:
    - name: 安装常用工具
      apt:
        name: "{{ packages }}"
        state: present

第6步:使用 Inventory 文件替代默认清单

当服务器变多的时候,把配置写在 ~/.ansible/hosts 就不好维护了。在项目里建一个 inventory 文件:

mkdir -p ~/ansible-playbooks/inventory
nano ~/ansible-playbooks/inventory/staging.ini
[webservers]
web1.example.com ansible_user=ubuntu
web2.example.com ansible_user=ubuntu

[databases]
db1.example.com ansible_user=root

[all:vars]
ansible_python_interpreter=/usr/bin/python3

执行时指定 inventory:

ansible-playbook -i inventory/staging.ini deploy.yaml

验证

用下面的命令全面检查 Ansible 环境:

# 检查 Ansible 版本
ansible --version

# 测试所有主机的连通性
ansible all -m ping -i inventory/staging.ini

# 查看某台机器的facts(系统信息)
ansible web1.example.com -m setup -i inventory/staging.ini

# 试运行模式(不真正执行,只预览会做什么)
ansible-playbook --check deploy.yaml -i inventory/staging.ini

--check 模式是 Ansible 的杀手级功能。它不会真的改任何东西,只会告诉你哪些任务会执行变更。上线前先用这个模式过一遍,安全很多。

常见问题

Q: SSH 连接超时怎么办?

检查目标机的 SSH 端口是不是默认的 22。如果不是,在 inventory 里加一行:

web1.example.com ansible_port=2222 ansible_user=ubuntu

Q: 提示 “MODULE FAILURE” 或 “FAILED!"?

大概率是目标机上没有 Python。Ansible 需要在目标机上跑 Python 脚本。修复:

ssh root@目标IP "apt install -y python3"

Q: 怎么管理多台环境的配置?

用不同的 inventory 文件。比如 inventory/dev.iniinventory/prod.ini,每个文件对应一组服务器。执行时指定对应的文件就行。

Q: Playbook 重复执行会不会出问题?

不会。Ansible 是幂等的。第二次运行同一个 Playbook,发现配置已经是目标状态,就不会做任何变更,所有任务都会显示 ok 而不是 changed

Q: 想批量执行一条命令,不想写 Playbook 怎么办?

直接用 ansible 命令行:

ansible all -m shell -a "df -h" -i inventory/staging.ini

这会在一百台机器上同时执行 df -h,结果汇总输出。


Ansible 学起来门槛不高,但用起来能省大量时间。建议先从上面这个基础环境配置 Playbook 开始,慢慢往里加内容。等你熟练了,再去学角色(Roles)和动态 Inventory,那又是另一个层次的效率提升。

你平时运维最难搞的是哪一步?手动部署还是配置漂移?评论区说说。

这篇文章对你有帮助吗?