5.Ansible自动化之-playbook模块介绍(知识点补充)

发布于:2025-08-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

5.(补充)Ansible-playbook模块介绍

playbook含义(回顾)

Playbook(剧本)是 Ansible 的核心功能之一,是一种用 YAML 格式编写的配置文件,用于定义一系列任务(task),实现对远程主机的批量配置、部署、管理等自动化操作。

与临时命令(ansible 命令)相比,Playbook 更适合复杂场景,支持任务编排、条件判断、循环、变量定义等高级功能,且可复用、可版本控制。

playbook基本格式

Playbook 采用 YAML 语法,基本结构由以下几个核心部分组成:

# 示例:一个简单的 Playbook
- name: 这是一个Playbook示例  # Play的名称(可选,用于说明作用)
  hosts: webservers        # 目标主机/主机组(必填,来自inventory)
  remote_user: root        # 远程执行用户(可选,默认使用ansible.cfg配置)
  become: yes              # 是否提权(可选,yes表示使用sudo切换权限)
  vars:                    # 定义变量(可选)
    http_port: 80
  tasks:                   # 任务列表(必填,定义要执行的操作)
    - name: 安装nginx      # 任务名称(可选,建议填写,便于调试)
      yum:                 # 模块名称(必填,指定要使用的Ansible模块)
        name: nginx        # 模块参数(根据模块不同而变化)
        state: present     # 确保nginx已安装

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

核心字段说明

  • hosts:指定目标主机(必须),可填写主机名、IP 或 inventory 中定义的组名(如 all 表示所有主机)。
  • tasks:任务列表(必须),每个任务用 - name: ... 开头,包含 模块名模块参数
  • remote_user:远程执行的用户(默认使用控制节点当前用户)。
  • become:是否切换到特权用户(如 yes 表示使用 sudo 提权,需配合 become_user: root 指定目标用户)。
  • vars:定义变量,可在任务中通过 {{ 变量名 }} 引用。
  • roles:引用角色(复杂场景使用,用于模块化组织任务)。

常用模块和参数

nsible 提供了数百个模块,覆盖系统管理、软件部署、文件操作等场景,以下是当前学习阶段常用模块和参数:

一、包管理类(软件安装 / 卸载)

用于管理不同 Linux 发行版的软件包,实现软件的安装、卸载和版本控制。

yum 模块

用于 RHEL、CentOS 等基于 RPM 的系统,管理软件包的安装、卸载、更新等操作。

- name: 安装指定版本的nginx
  yum:
    name: nginx-1.20.1  # 软件包名,可指定版本
    state: present      # 状态:present(安装)、absent(卸载)、latest(最新版)
    update_cache: yes   # 安装前更新缓存,类似yum makecache
apt 模块

用于 Debian、Ubuntu 等基于 Debian 的系统,管理软件包的生命周期。

- name: 安装最新版docker
  apt:
    name: docker.io     # 软件包名称
    state: latest       # 状态:与yum模块一致
    update_cache: yes   # 是否执行apt update更新源
    cache_valid_time: 3600  # 缓存有效期(秒)

二、服务管理类(服务启停 / 自启)

用于控制系统服务的运行状态,包括启动、停止、重启以及设置开机自启等。

service 模块

通用的服务管理模块,适用于大多数系统,可控制服务的运行状态和自启动设置。

- name: 确保nginx启动并开机自启
  service:
    name: nginx         # 服务名称
    state: started      # 状态:started(启动)、stopped(停止)、restarted(重启)、reloaded(重载)
    enabled: yes        # 是否开机自启:yes(是)、no(否)

三、文件操作类(文件 / 目录 / 内容管理)

处理文件和目录的创建、删除、属性修改,以及文件的传输、同步、解压等操作。

file 模块

管理文件和目录的属性,包括创建、删除、权限设置、所有者修改等。

- name: 创建目录并设置权限
  file:
    path: /data/logs    # 文件或目录的路径
    state: directory    # 类型:directory(目录)、file(文件)、link(软链接)、absent(删除)
    mode: '0755'        # 权限设置,八进制表示,需加引号
    owner: www          # 所有者用户名
    group: www          # 所属组名
copy 模块

将控制节点的本地文件复制到远程节点,并可设置文件权限、所有者等属性。

- name: 复制配置文件到远程
  copy:
    src: ./nginx.conf   # 控制节点上的源文件路径
    dest: /etc/nginx/nginx.conf  # 远程节点的目标路径
    mode: '0644'        # 远程文件的权限
    owner: root         # 远程文件的所有者
    backup: yes         # 是否备份远程节点上的原有文件
template 模块

使用 Jinja2 模板生成远程文件,支持变量替换,适用于动态配置文件的生成。

- name: 生成动态配置文件
  template:
    src: ./nginx.conf.j2  # 控制节点上的模板文件(含{{变量}})
    dest: /etc/nginx/nginx.conf  # 远程节点的目标路径
    mode: '0644'          # 生成文件的权限
    variable_start_string: '[[['  # 自定义变量起始符号(默认{{)
synchronize 模块

基于 rsync 工具实现文件的同步,支持控制节点与远程节点之间的双向同步。

- name: 同步本地代码到远程
  synchronize:
    src: ./project/     # 源路径(控制节点或远程节点)
    dest: /opt/project/ # 目标路径(远程节点或控制节点)
    mode: push          # 同步方向:push(本地到远程)、pull(远程到本地)
    delete: yes         # 是否删除目标路径中源路径没有的文件
fetch 模块

从远程节点拉取文件到控制节点,通常用于获取日志、配置文件等。

- name: 拉取远程日志到本地
  fetch:
    src: /var/log/nginx/access.log  # 远程节点上的文件路径(必须是文件)
    dest: ./logs/                   # 控制节点上的保存路径(自动创建主机名子目录)
    flat: yes                       # 是否跳过主机名目录,直接保存到dest
unarchive 模块

解压压缩包,支持本地压缩包上传到远程节点后解压,或直接解压远程 URL 的压缩包。

- name: 从URL下载并解压
  unarchive:
    src: https://example.com/app.tar.gz  # 压缩包路径(本地文件或远程URL)
    dest: /opt/                          # 解压的目标目录
    remote_src: yes                      # src是否为远程路径:yes(是)、no(否)
    mode: '0755'                         # 解压后文件的权限
stat 模块

获取文件或目录的状态信息,如是否存在、权限、校验和等,用于条件判断。

- name: 检查文件是否存在
  stat:
    path: /etc/nginx/nginx.conf  # 要检查的文件路径
    get_checksum: yes            # 是否计算文件校验和
    follow: yes                  # 是否跟随软链接
  register: file_info            # 将结果保存到变量

四、文件内容修改类(配置文件编辑)

用于精准修改文件内容,包括单行替换、批量替换、插入代码块等,避免手动编辑配置文件。

lineinfile 模块

匹配文件中的特定行并进行替换,或确保某行存在,适用于修改配置文件中的单行配置。

- name: 禁用SELinux
  lineinfile:
    path: /etc/selinux/config  # 目标文件路径
    regexp: '^SELINUX='       # 匹配行的正则表达式
    line: 'SELINUX=disabled'  # 替换后的内容
    state: present            # present(确保行存在)、absent(删除匹配行)
replace 模块

基于正则表达式批量替换文件中的内容,适用于需要全局替换的场景。

- name: 替换nginx端口配置
  replace:
    path: /etc/nginx/nginx.conf  # 目标文件路径
    regexp: 'listen 80;'         # 要匹配的内容(正则表达式)
    replace: 'listen 8080;'      # 替换后的内容
    backup: yes                  # 是否备份原文件
blockinfile 模块

在文件中插入或替换一块内容,并通过标记注释标识,便于后续管理。

- name: 插入nginx虚拟主机配置
  blockinfile:
    path: /etc/nginx/nginx.conf  # 目标文件路径
    block: |                     # 要插入的内容块
      server {
          listen 80;
          server_name example.com;
      }
    marker: "# {mark} ANSIBLE MANAGED BLOCK"  # 内容块的标记注释
    state: present               # present(插入)、absent(删除)

五、系统配置类(系统参数 / 安全设置)

用于系统级别的配置,包括防火墙规则、SELinux 设置、磁盘挂载、LVM 管理等。

firewalld 模块

管理 firewalld 防火墙的规则,配置端口、服务的访问权限。

- name: 允许80/tcp端口通过防火墙
  firewalld:
    port: 80/tcp              # 端口(或使用service指定服务名,如http)
    permanent: yes            # 是否永久生效:yes(重启后有效)、no(临时有效)
    immediate: yes            # 是否立即生效(无需重启firewalld)
    state: enabled            # enabled(允许)、disabled(拒绝)
sefcontext 模块

管理 SELinux 的安全上下文规则,设置文件或目录的 SELinux 类型。

- name: 设置web目录SELinux类型
  sefcontext:
    target: /var/www(/.*)?    # 目标路径(支持通配符)
    setype: httpd_sys_content_t  # SELinux类型
    state: present            # present(添加规则)、absent(删除规则)
    reload: yes               # 是否重载SELinux规则
mount 模块

管理文件系统的挂载点,包括临时挂载和永久挂载(写入 /etc/fstab)。

- name: 挂载/data分区
  mount:
    path: /data               # 挂载点路径
    src: /dev/sdb1            # 设备或分区路径
    fstype: ext4              # 文件系统类型
    state: mounted            # mounted(挂载并写入fstab)、unmounted(卸载)、absent(从fstab移除)
filesystem 模块

在磁盘分区上创建文件系统(格式化分区),支持多种文件系统类型。

- name: 格式化分区为xfs
  filesystem:
    fstype: xfs               # 文件系统类型(如ext4、xfs等)
    dev: /dev/sdb1            # 要格式化的设备路径
    force: no                 # 是否强制格式化(即使已有文件系统)
lvol 模块

管理 LVM(逻辑卷管理)中的逻辑卷,包括创建、删除、调整大小等。

- name: 创建10G逻辑卷
  lvol:
    vg: vg_data               # 卷组名称
    lv: lv_app                # 逻辑卷名称
    size: 10G                 # 逻辑卷大小(支持G、M等单位)
    state: present            # present(创建)、absent(删除)

六、用户与权限类(用户 / 组管理)

用于管理系统用户、组以及数据库用户,设置用户属性和权限。

user 模块

管理系统用户,包括创建、删除用户,设置用户 ID、家目录、所属组等。

- name: 创建www用户
  user:
    name: www                 # 用户名
    uid: 1000                 # 用户ID
    group: www                # 主组
    groups: wheel,nginx       # 附加组(逗号分隔)
    home: /home/www           # 家目录路径
    shell: /bin/bash          # 默认shell
    state: present            # present(创建)、absent(删除)
mysql_user 模块

管理 MySQL 数据库中的用户,包括创建、删除用户,设置密码和权限。

- name: 创建MySQL用户
  mysql_user:
    name: appuser             # MySQL用户名
    password: '123456'        # 用户密码
    host: '%'                 # 允许访问的主机(%表示所有主机)
    priv: 'appdb.*:ALL'       # 权限设置(数据库.表:权限)
    state: present            # present(创建)、absent(删除)

七、命令执行类(远程命令 / 脚本)

在远程节点执行命令或脚本,支持简单命令、复杂 shell 命令以及定时任务。

command 模块

在远程节点执行命令,不通过 shell 环境,不支持管道、重定向等 shell 特性。

- name: 查看nginx版本
  command: nginx -v
  register: nginx_version     # 将命令输出保存到变量
  creates: /etc/nginx         # 若该文件/目录存在,则不执行命令
shell 模块

通过 shell 环境在远程节点执行命令,支持管道、重定向、变量等 shell 特性。

- name: 统计错误日志行数
  shell: cat /var/log/nginx/error.log | grep -c 'error'
  register: error_count       # 保存命令输出到变量
  executable: /bin/bash       # 指定使用的shell
cron 模块

管理远程节点的定时任务(crontab),添加、修改或删除定时任务。

- name: 添加日志清理任务
  cron:
    name: "clean logs"        # 定时任务名称
    minute: "0"               # 分钟(0-59)
    hour: "3"                 # 小时(0-23)
    weekday: "0"              # 星期(0=周日,1=周一...6=周六)
    job: "find /var/log -name '*.log' -mtime +7 -delete"  # 要执行的命令
    user: root                # 任务所属用户

八、信息收集与调试类(系统信息 / 调试)

用于收集远程节点的系统信息、调试 Playbook,以及测试节点连通性。

setup 模块

收集远程节点的 facts 信息(系统、硬件、网络等信息),用于条件判断或变量引用。

- name: 收集主机IP信息
  setup:
    filter: ansible_default_ipv4  # 过滤信息,只收集默认IPv4相关信息
  register: ip_info               # 保存结果到变量
gather_facts 模块

在 Play 级别控制是否收集 facts 信息,关闭可加快 Playbook 执行速度。

- name: 不收集facts加速执行
  hosts: webservers
  gather_facts: no  # yes(默认,收集facts)、no(不收集)
  tasks:
    - name: 执行任务
      debug:
        msg: "不依赖facts的任务"
debug 模块

输出变量或自定义信息,用于 Playbook 的调试,查看变量值或执行状态。

- name: 打印主机IP
  debug:
    msg: "主机IP: {{ ip_info.ansible_facts.ansible_default_ipv4.address }}"  # 输出自定义消息
ping 模块

测试控制节点与远程节点的连通性,返回 “pong” 表示连通。

- name: 测试主机是否可达
  ping:  # 无参数,成功返回pong

九、变量与任务组织类(变量管理 / 任务复用)

用于管理 Playbook 中的变量,以及组织和控制任务的执行流程。

vars 模块

在 Play 或任务中定义变量,用于存储常量、配置参数等,可在任务中通过 {{变量名}} 引用。

- name: 定义变量示例
  hosts: all
  vars:
    http_port: 80      # 定义变量http_port
    app_name: myapp    # 定义变量app_name
  tasks:
    - name: 使用变量
      debug:
        msg: "端口: {{ http_port }}"  # 引用变量
include_vars 模块

从外部文件加载变量,实现变量的集中管理,便于维护。

- name: 加载变量文件
  include_vars:
    file: ./app_vars.yml  # 变量文件路径
    name: app_vars        # 为加载的变量添加前缀(可选)
meta 模块

控制 Playbook 的执行流程,如立即执行 handlers、提前结束 Play 等。

- name: 立即执行handlers
  meta: flush_handlers  # 立即执行已定义的handlers,不等待当前Play的所有任务完成

- name: 结束当前Play
  meta: end_play        # 提前终止当前Play的执行

十、其他常用模块

git 模块

从 Git 仓库拉取代码到远程节点,支持指定分支、标签或提交 ID,可更新已有仓库。

- name: 拉取项目代码
  git:
    repo: https://github.com/example/project.git  # Git仓库URL
    dest: /opt/project                            # 远程节点的目标目录
    version: main                                 # 分支、标签或提交ID
    update: yes                                   # 若目录已存在,是否更新代码
uri 模块

发送 HTTP 或 HTTPS 请求,可用于检查 API 状态、调用接口、下载文件等。

- name: 检查服务健康状态
  uri:
    url: http://localhost:8080/health  # 请求的URL
    method: GET                        # HTTP方法(GET、POST等)
    status_code: 200                   # 预期的状态码,不匹配则任务失败
    return_content: yes                # 是否返回响应内容

如涉及版权问题,请联系作者处理!!!!!!!!


网站公告

今日签到

点亮在社区的每一天
去签到