Ansible Playbook 的常用模板

目录

[一、基础通用模板(所有 Playbook 的骨架)](#一、基础通用模板(所有 Playbook 的骨架))

二、常用场景模板(直接复用)

[1. 安装 / 卸载软件包](#1. 安装 / 卸载软件包)

[2.配置服务(启动 / 重启 / 设置开机自启)](#2.配置服务(启动 / 重启 / 设置开机自启))

[3.复制 / 替换配置文件](#3.复制 / 替换配置文件)

[4.执行远程命令 / 脚本](#4.执行远程命令 / 脚本)

[5.批量创建用户 / 授权](#5.批量创建用户 / 授权)


一、基础通用模板(所有 Playbook 的骨架)

bash 复制代码
---
# 基础Playbook模板
- name: 【模板名称】描述这个Playbook的用途,例如"配置Nginx服务"
  # 目标主机/组,来自inventory文件
  hosts: all
  # 远程执行用户
  remote_user: root
  # 是否提升权限(如果remote_user不是root,需要设为yes)
  become: yes
  become_method: sudo
  # 任务执行失败时是否继续(生产环境建议设为no)
  any_errors_fatal: no
  # 并发执行数
  serial: 10
  # 变量定义(可根据需要添加)
  vars:
    # 示例变量
    package_name: nginx
    service_name: nginx

  # 任务列表
  tasks:
    - name: 【任务名称】描述具体要执行的操作,例如"安装Nginx包"
      # 具体模块(这里用debug做示例)
      debug:
        msg: "这是基础Playbook模板,可根据需求替换模块和参数"

  # 句柄(可选,用于执行异常/成功后的操作)
  handlers:
    - name: 【句柄名称】重启服务
      service:
        name: "{{ service_name }}"
        state: restarted

  # 前置条件(可选,执行Playbook前的检查)
  pre_tasks:
    - name: 检查目标主机是否可达
      ping:

  # 后置任务(可选,执行完所有tasks后执行)
  post_tasks:
    - name: 输出执行完成提示
      debug:
        msg: "Playbook执行完成,目标主机: {{ ansible_hostname }}"

二、常用场景模板(直接复用)

1. 安装 / 卸载软件包

bash 复制代码
---
- name: 安装/卸载系统软件包
  hosts: web_servers
  remote_user: root
  become: yes
  vars:
    # 要安装的包列表
    packages_to_install:
      - nginx
      - vim
      - net-tools
    # 要卸载的包列表(为空则不卸载)
    packages_to_remove:
      - httpd

  tasks:
    - name: 安装指定软件包(CentOS/RHEL)
      yum:
        name: "{{ packages_to_install }}"
        state: present
      when: ansible_os_family == "RedHat"

    - name: 安装指定软件包(Debian/Ubuntu)
      apt:
        name: "{{ packages_to_install }}"
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: 卸载指定软件包(CentOS/RHEL)
      yum:
        name: "{{ packages_to_remove }}"
        state: absent
      when: ansible_os_family == "RedHat" and packages_to_remove | length > 0

    - name: 卸载指定软件包(Debian/Ubuntu)
      apt:
        name: "{{ packages_to_remove }}"
        state: absent
      when: ansible_os_family == "Debian" and packages_to_remove | length > 0

2.配置服务(启动 / 重启 / 设置开机自启)

bash 复制代码
---
- name: 管理系统服务
  hosts: app_servers
  remote_user: root
  become: yes
  vars:
    # 要管理的服务列表
    services:
      - name: nginx
        state: started  # started/running/stopped/restarted/reloaded
        enabled: yes    # yes/no(是否开机自启)
      - name: mysql
        state: running
        enabled: yes

  tasks:
    - name: 配置服务状态和开机自启
      service:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
      loop: "{{ services }}"
      # 仅当服务状态不符合时触发
      changed_when: false

3.复制 / 替换配置文件

bash 复制代码
---
- name: 分发配置文件
  hosts: db_servers
  remote_user: root
  become: yes
  vars:
    # 配置文件源路径(本地)和目标路径(远程)
    config_files:
      - src: ./conf/my.cnf
        dest: /etc/my.cnf
        owner: mysql
        group: mysql
        mode: '0644'
      - src: ./conf/redis.conf
        dest: /etc/redis.conf
        owner: redis
        group: redis
        mode: '0600'

  tasks:
    - name: 复制配置文件到目标主机
      copy:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        owner: "{{ item.owner }}"
        group: "{{ item.group }}"
        mode: "{{ item.mode }}"
      loop: "{{ config_files }}"
      # 配置文件变更时触发重启服务
      notify:
        - 重启mysql
        - 重启redis

  handlers:
    - name: 重启mysql
      service:
        name: mysqld
        state: restarted

    - name: 重启redis
      service:
        name: redis
        state: restarted

4.执行远程命令 / 脚本

bash 复制代码
---
- name: 执行远程命令或脚本
  hosts: all
  remote_user: root
  become: yes
  vars:
    # 要执行的命令列表
    commands:
      - "df -h /"
      - "free -m"
    # 本地脚本路径(要上传并执行)
    local_script_path: ./scripts/clean_logs.sh
    remote_script_path: /tmp/clean_logs.sh

  tasks:
    - name: 执行单条命令
      command: "{{ item }}"
      register: cmd_result
      loop: "{{ commands }}"
      # 命令执行结果不改变系统状态,仅输出
      changed_when: false

    - name: 输出命令执行结果
      debug:
        msg: "{{ item.stdout_lines }}"
      loop: "{{ cmd_result.results }}"

    - name: 上传本地脚本到远程主机
      copy:
        src: "{{ local_script_path }}"
        dest: "{{ remote_script_path }}"
        mode: '0755'

    - name: 执行远程脚本
      script: "{{ remote_script_path }}"
      register: script_result

    - name: 输出脚本执行结果
      debug:
        msg: "{{ script_result.stdout_lines }}"

5.批量创建用户 / 授权

bash 复制代码
---
- name: 批量创建系统用户
  hosts: all
  remote_user: root
  become: yes
  vars:
    # 要创建的用户列表
    users:
      - name: devuser
        uid: 1001
        group: dev
        shell: /bin/bash
        home: /home/devuser
        ssh_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... devuser@example.com"

  tasks:
    - name: 创建用户组
      group:
        name: "{{ item.group }}"
        state: present
      loop: "{{ users }}"
      loop_control:
        label: "{{ item.group }}"

    - name: 创建用户
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        group: "{{ item.group }}"
        shell: "{{ item.shell }}"
        home: "{{ item.home }}"
        create_home: yes
        state: present
      loop: "{{ users }}"
      loop_control:
        label: "{{ item.name }}"

    - name: 添加SSH公钥授权
      authorized_key:
        user: "{{ item.name }}"
        key: "{{ item.ssh_key }}"
        state: present
      loop: "{{ users }}"
      loop_control:
        label: "{{ item.name }}"
相关推荐
安科士andxe7 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
青云计划10 小时前
知光项目知文发布模块
java·后端·spring·mybatis
儒雅的晴天10 小时前
大模型幻觉问题
运维·服务器
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
探路者继续奋斗11 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
通信大师11 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
消失的旧时光-194312 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
A懿轩A12 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
乐观勇敢坚强的老彭12 小时前
c++寒假营day03
java·开发语言·c++
biubiubiu070612 小时前
谷歌浏览器无法访问localhost:8080
java