一、基本认识

主要作用:Ansible 主要用于自动化IT运维任务,尤其擅长在多台服务器上批量、一致地完成配置管理、应用部署和任务编排。

  1. 配置管理
    确保成百上千台服务器的系统配置(如用户、权限、软件包、服务状态、防火墙规则、配置文件等)保持一致和符合规范。例如:统一安装 Nginx、配置 SSH、设置时区等。

  2. 应用部署
    自动化发布应用程序(如 Web 应用、微服务、数据库迁移),包括上传代码、安装依赖、重启服务、滚动更新等,减少人工操作错误。

  3. 批量任务执行
    在多台主机上并行执行命令或脚本,例如:检查磁盘空间、清理日志、重启服务、收集系统信息等,大幅提升运维效率。

  4. 持续集成/持续部署(CI/CD)
    作为 CI/CD 流水线中的关键环节,与 Jenkins、GitLab CI 等工具集成,实现“代码提交 → 自动测试 → 自动部署”的全流程自动化。

  5. 基础设施即代码(IaC)
    通过 YAML 格式的 Playbook 描述系统状态,使基础设施可版本控制、可复用、可审计,避免“配置漂移”。

组成部分:

  1. hosts:指定目标主机或主机组,是执行任务的范围基础。

  2. tasks:核心部分,定义一系列要执行的操作,每个任务调用一个模块来实现具体功能(如安装软件、启动服务等)。

  3. name:为 Play 或 Task 提供可读性描述,便于调试和日志识别(虽非语法必需,但强烈推荐)。

  4. become(可选但常用):控制是否以特权用户(如 root)执行任务,是运维场景中的关键权限设置。

  5. handlers(可选):定义仅在被 notify 触发时才运行的任务,常用于服务重启,实现“按需触发”机制。

这些部分共同构成一个可执行、可维护、符合最佳实践的 Ansible 剧本。

基本框架:

---
- name: 描述此 Play 的用途
  hosts: 目标主机组或主机
  become: true  # 可选:是否以特权用户(如 root)执行任务
  vars:         # 可选:定义变量
    variable_name: value

  tasks:        # 必需:定义要执行的任务列表
    - name: 任务1的描述
      ansible.builtin.package:  # 使用的模块
        name: package_name
        state: present

    - name: 任务2的描述
      ansible.builtin.service:  # 使用的模块
        name: service_name
        state: started
        enabled: true

  handlers:     # 可选:定义触发器,通常用于重启服务
    - name: restart service
      ansible.builtin.service:
        name: service_name
        state: restarted

案例:

---
# 剧本名称:批量部署和配置 Nginx
- name: Deploy and configure Nginx on multiple servers
  hosts: webservers  # 需要部署 Nginx 的主机组,例如:webservers
  become: yes        # 提升权限以进行系统级操作
  vars:
    nginx_port: 80   # 定义一个变量,便于修改监听端口
    server_name: "{{ inventory_hostname }}" # 使用 Ansible 内置变量作为默认 server_name

  tasks:
    - name: Ensure Nginx is installed
      ansible.builtin.package:
        name: nginx
        state: present

    - name: Ensure Nginx configuration directory exists
      ansible.builtin.file:
        path: /etc/nginx/sites-available
        state: directory
        mode: '0755'

    - name: Create a basic Nginx site configuration file
      ansible.builtin.template:  # 使用 Jinja2 模板,可以动态生成配置
        src: nginx_site.conf.j2   # 模板文件路径,需要在 playbook 同目录下的 templates/ 文件夹中
        dest: /etc/nginx/sites-available/{{ inventory_hostname }}.conf # 为每台主机创建独立的配置文件
      notify: reload nginx # 如果配置文件发生变化,则触发 handler

    - name: Ensure the site configuration is enabled (symlink to sites-enabled)
      ansible.builtin.file:
        src: /etc/nginx/sites-available/{{ inventory_hostname }}.conf
        dest: /etc/nginx/sites-enabled/{{ inventory_hostname }}.conf
        state: link
      notify: reload nginx # 如果软链接状态变化,也触发 reload

    - name: Remove default Nginx site if it exists
      ansible.builtin.file:
        path: /etc/nginx/sites-enabled/default
        state: absent
      notify: reload nginx # 移除默认站点后也需要重载

    - name: Ensure Nginx service is started and enabled
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: reload nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded

二、常用的模块

系统初始化

  • yum / apt - 安装基础软件

  • user - 创建用户

  • file - 设置目录权限

  • shell - 执行初始化脚本

Web 服务部署

  • yum - 安装 Nginx/Apache

  • copy / template - 部署配置文件

  • service - 启动 Web 服务

  • shell - 检查服务状态

应用部署

  • get_url - 下载应用包

  • copy - 部署应用文件

  • template - 生成配置文件

  • service - 管理应用服务

安全配置

  • lineinfile - 修改安全配置

  • file - 设置文件权限

  • user - 管理用户权限

  • shell - 执行安全脚本

案例:

- hosts: webservers
  become: yes
  tasks:
    # 1. 安装软件包(yum/apt)
    - name: Install Nginx
      yum: name=nginx state=latest
    
    # 2. 复制配置文件(copy)
    - name: Copy config file
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
        backup: yes
    
    # 3. 使用模板生成配置(template)
    - name: Generate app config
      template:
        src: app.conf.j2
        dest: /etc/nginx/conf.d/app.conf
    
    # 4. 管理服务(service)
    - name: Start Nginx
      service:
        name: nginx
        state: started
        enabled: yes
    
    # 5. 修改配置文件(lineinfile)
    - name: Disable default server
      lineinfile:
        path: /etc/nginx/nginx.conf
        regexp: '^# server {'
        line: 'server {'
    
    # 6. 用户管理(user)
    - name: Create web user
      user:
        name: webuser
        system: yes
        shell: /bin/false
    
    # 7. 调试输出(debug)
    - name: Show nginx status
      shell: systemctl is-active nginx
      register: status
    - debug: var=status.stdout