Ansible 是一种流行的自动化工具,广泛用于自动化运维、应用部署和系统配置管理。通过 Ansible,可以轻松地在大规模服务器群体中执行操作,而无需手动登录每台服务器。下面是一个示例项目,展示如何使用 Ansible 实现一个自动化运维工作流程。

示例项目:自动化 Web 服务器部署和管理

项目目标

本项目的目标是自动化管理和部署一组 Web 服务器(例如 Nginx 和 Apache),包括以下任务:

  1. 配置 Web 服务器环境。
  2. 安装和启动 Web 服务器(如 Nginx 或 Apache)。
  3. 配置虚拟主机。
  4. 部署 Web 应用。
  5. 管理服务的启动、停止和重启。
  6. 提供自动化的服务器健康检查。
项目结构
ansible-web-deploy/
│
├── ansible.cfg                # Ansible 配置文件
├── inventory                  # 主机清单文件
├── playbooks/
│   ├── site.yml               # 主入口 Playbook
│   ├── tasks/
│   │   ├── install_web.yml    # 安装 Web 服务器
│   │   ├── configure_web.yml  # 配置 Web 服务器
│   │   ├── deploy_app.yml     # 部署应用
│   │   └── health_check.yml   # 服务器健康检查
│   └── templates/
│       └── nginx.conf.j2      # Nginx 配置模板文件
└── roles/
    ├── common/                # 公共角色,用于基本环境配置
    └── web/                   # Web 服务器角色,包含安装和配置

1. 配置 Ansible

首先,需要一个 ansible.cfg 配置文件来配置 Ansible 运行时参数:

[defaults]
inventory = ./inventory        # 指定主机清单文件
remote_user = ansible          # 指定远程用户
host_key_checking = False      # 禁用 SSH 密钥检查
inventory 文件(定义服务器)

inventory 文件中列出要管理的主机。假设有两台服务器 web01web02

[web_servers]
web01 ansible_host=192.168.1.101
web02 ansible_host=192.168.1.102

2. Playbook 任务清单

site.yml:主 Playbook 文件

site.yml 是主 Playbook 文件,用于定义所有自动化任务。它调用其他任务文件,并按顺序执行:

---
- hosts: web_servers
  become: yes
  roles:
    - common    # 调用公共角色,安装基本依赖
    - web       # 调用 Web 服务器角色,安装和配置 Nginx
tasks/install_web.yml:安装 Web 服务器

此文件负责在目标服务器上安装 Nginx(也可以使用 Apache 或其他 Web 服务器):

---
- name: Install Nginx
  apt:
    name: nginx
    state: present
    update_cache: yes

- name: Ensure Nginx is running
  service:
    name: nginx
    state: started
    enabled: yes
tasks/configure_web.yml:配置 Web 服务器

此文件通过使用模板引擎(Jinja2)来生成 Nginx 配置文件,并将其应用于服务器:

---
- name: Configure Nginx virtual host
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/sites-available/default
    mode: '0644'

- name: Test Nginx configuration
  command: nginx -t

- name: Reload Nginx
  service:
    name: nginx
    state: reloaded
tasks/deploy_app.yml:部署 Web 应用

假设你有一个简单的 HTML 应用需要部署在 /var/www/html 目录下,可以通过以下任务来实现:

---
- name: Copy application files
  copy:
    src: /path/to/local/app/
    dest: /var/www/html/
    mode: '0755'
tasks/health_check.yml:健康检查

为了确保服务器的健康状况,可以使用以下任务进行 HTTP 检查:

---
- name: Check if web server is up
  uri:
    url: http://{{ inventory_hostname }}
    return_content: yes
    status_code: 200
  register: webpage_status

- name: Debug web server response
  debug:
    var: webpage_status.content

3. 模板文件

Nginx 的配置可以通过模板文件进行管理,使用 nginx.conf.j2 来定义虚拟主机配置:

templates/nginx.conf.j2
server {
    listen 80;
    server_name {{ inventory_hostname }};
    
    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

4. roles/common:公共角色

在角色 common 中,可以配置基本环境,如安装常用依赖和工具:

---
- name: Update apt cache
  apt:
    update_cache: yes

- name: Install basic packages
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - curl
    - git
    - unzip

5. roles/web:Web 服务器角色

在角色 web 中,包含 Web 服务器的安装和配置:

---
- name: Include web tasks
  include_tasks:
    - tasks/install_web.yml
    - tasks/configure_web.yml
    - tasks/deploy_app.yml
    - tasks/health_check.yml

执行 Playbook

配置好 Ansible 项目后,可以通过以下命令执行整个 Playbook:

ansible-playbook playbooks/site.yml

这将依次执行配置任务,安装、配置 Nginx,并部署 Web 应用。执行完成后,你可以通过浏览器访问服务器的 IP 地址来查看应用是否已成功部署。

项目扩展

  • 添加 CI/CD 流程:可以集成 Ansible 与 Jenkins 或 GitLab CI 等 CI/CD 工具,实现自动化部署。
  • 监控和报警:可以通过 Ansible 集成 Prometheus、Nagios 等监控工具,自动部署和配置监控系统。
  • 多环境支持:通过为不同环境(如开发、测试、生产)创建不同的 inventory 文件,支持多环境部署。

结语

通过使用 Ansible,能够将服务器的配置和管理自动化,从而减少手动操作和人为错误。此示例项目展示了如何使用 Ansible 进行 Web 服务器的自动化部署,涵盖了从环境配置到应用部署和健康检查的整个流程。

Logo

一站式 AI 云服务平台

更多推荐