一、基本认识
主要作用:Ansible 主要用于自动化IT运维任务,尤其擅长在多台服务器上批量、一致地完成配置管理、应用部署和任务编排。
配置管理
确保成百上千台服务器的系统配置(如用户、权限、软件包、服务状态、防火墙规则、配置文件等)保持一致和符合规范。例如:统一安装 Nginx、配置 SSH、设置时区等。应用部署
自动化发布应用程序(如 Web 应用、微服务、数据库迁移),包括上传代码、安装依赖、重启服务、滚动更新等,减少人工操作错误。批量任务执行
在多台主机上并行执行命令或脚本,例如:检查磁盘空间、清理日志、重启服务、收集系统信息等,大幅提升运维效率。持续集成/持续部署(CI/CD)
作为 CI/CD 流水线中的关键环节,与 Jenkins、GitLab CI 等工具集成,实现“代码提交 → 自动测试 → 自动部署”的全流程自动化。基础设施即代码(IaC)
通过 YAML 格式的 Playbook 描述系统状态,使基础设施可版本控制、可复用、可审计,避免“配置漂移”。
组成部分:
hosts:指定目标主机或主机组,是执行任务的范围基础。tasks:核心部分,定义一系列要执行的操作,每个任务调用一个模块来实现具体功能(如安装软件、启动服务等)。name:为 Play 或 Task 提供可读性描述,便于调试和日志识别(虽非语法必需,但强烈推荐)。become(可选但常用):控制是否以特权用户(如 root)执行任务,是运维场景中的关键权限设置。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/Apachecopy/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