Skip to content

Ansible 案例汇总

0.

功能:

通过 Ansible 批量 巡检多个主机

代码示例:

yaml
[root@m01 /server/ans/playbooks]# cat  xunjian_jiaoben.yml 
- name: 执行系统巡检和安全基线检查脚本
  hosts: web
  become: true #root权限进行
  tasks:
    - name: 将巡检和安全检查脚本复制到远程系统
      copy:
        src: ./systemctl_situation.sh # 本地脚本文件路径
        dest: /tmp/systemctl_situation.sh    # 目标机器上的路径
        mode: '0755'

    - name: 执行巡检和安全检查脚本
      shell: /tmp/systemctl_situation.sh
      register: result

    - name: 显示脚本执行结果
      debug:
        var: result.stdout
#具体脚本移步sheLl专题

1. 批量安装软件包

功能:

通过 Ansible 批量安装指定的软件包到多个主机上。

代码示例:

yaml
---
- name: 批量安装常用软件包
  hosts: all
  become: true
  tasks:
    - name: 确保软件包已安装
      apt:
        name: "{{ item }}"
        state: present
      loop:
        - vim
        - curl
        - htop

解释:

  • hosts: all:表示对所有主机执行操作。
  • become: true:表示以管理员权限执行任务。
  • loop:循环安装多个软件包。
  • 使用 apt 模块来确保软件包被安装。

2. 重启多个服务

功能:

批量重启多个主机上的服务。

代码示例:

yaml
---
- name: 批量重启服务
  hosts: all
  become: true
  tasks:
    - name: 重启 nginx 服务
      service:
        name: nginx
        state: restarted

    - name: 重启 mysql 服务
      service:
        name: mysql
        state: restarted

解释:

  • service 模块用于管理服务。
  • name:指定服务名称(例如 nginxmysql)。
  • state: restarted:表示重启服务。

3. 创建用户并配置 SSH 密钥

功能:

通过 Ansible 创建用户并将公钥添加到用户的 SSH 配置中。

代码示例:

yaml
---
- name: 创建用户并配置 SSH 公钥
  hosts: all
  become: true
  tasks:
    - name: 创建用户
      user:
        name: "{{ username }}"
        state: present
        groups: sudo

    - name: 为用户设置 SSH 授权公钥
      authorized_key:
        user: "{{ username }}"
        state: present
        key: "{{ lookup('file', '/path/to/public/key') }}"

解释:

  • user 模块用于创建用户。
  • authorized_key 模块将 SSH 公钥添加到用户的授权密钥中。
  • lookup('file', '/path/to/public/key'):从文件系统读取公钥。

4. 检查磁盘空间并发送警告邮件

功能:

检查主机的磁盘空间是否超过设定的阈值,如果超过则发送警告邮件。

代码示例:

yaml
---
- name: 检查磁盘空间并发送邮件警告
  hosts: all
  become: true
  tasks:
    - name: 检查磁盘空间
      command: df -h / | grep -v Filesystem | awk '{print $5}' | sed 's/%//g'
      register: disk_space
      changed_when: false

    - name: 如果磁盘空间 > 80%,发送邮件
      mail:
        to: "admin@example.com"
        subject: "磁盘空间警告"
        body: "警告:磁盘空间使用超过 80%。当前使用量:{{ disk_space.stdout }}%"
      when: disk_space.stdout|int > 80

解释:

  • command 模块用于执行命令。
  • register:保存命令输出到变量中。
  • when:条件判断,只有当磁盘空间使用超过 80% 时才发送邮件。

5. 批量更新操作系统软件包

功能:

通过 Ansible 批量更新多个主机上的所有软件包。

代码示例:

yaml
---
- name: 批量更新所有软件包
  hosts: all
  become: true
  tasks:
    - name: 更新所有软件包到最新版本
      apt:
        upgrade: dist

解释:

  • apt 模块中的 upgrade: dist 会执行系统的完全更新(包括安装新的依赖项和升级已安装的包)。

6. 备份文件到远程服务器

功能:

将指定的文件或目录从多个主机备份到远程备份服务器。

代码示例:

yaml
---
- name: 备份文件到远程服务器
  hosts: all
  become: true
  tasks:
    - name: 备份 /etc 目录到远程服务器
      synchronize:
        src: /etc/
        dest: "/backups/etc_{{ inventory_hostname }}/"
        mode: push

解释:

  • synchronize 模块用于同步文件。
  • src:源目录。
  • dest:目标目录,inventory_hostname 会替换为主机名。

7. 批量停止并启动服务

功能:

批量停止并重新启动指定服务。

代码示例:

yaml
---
- name: 批量停止并重启服务
  hosts: all
  become: true
  tasks:
    - name: 停止 nginx 服务
      service:
        name: nginx
        state: stopped

    - name: 启动 nginx 服务
      service:
        name: nginx
        state: started

解释:

  • service 模块用于管理服务。
  • state: stopped:停止服务。
  • state: started:启动服务。

8. 收集远程主机的系统信息

功能:

收集主机的操作系统版本、CPU 信息、内存大小等系统信息。

代码示例:

yaml
---
- name: 收集系统信息
  hosts: all
  tasks:
    - name: 收集操作系统版本
      command: lsb_release -a
      register: os_version

    - name: 收集 CPU 信息
      command: lscpu
      register: cpu_info

    - name: 收集内存信息
      command: free -h
      register: memory_info

    - name: 输出收集到的信息
      debug:
        msg: |
          操作系统版本: {{ os_version.stdout }}
          CPU 信息: {{ cpu_info.stdout }}
          内存信息: {{ memory_info.stdout }}

解释:

  • 使用 command 模块执行命令并收集信息。
  • register 保存命令输出结果到变量中。
  • debug 模块输出收集的系统信息。

9. 安装 Docker 并启动容器

功能:

在目标主机上安装 Docker 并启动一个容器。

代码示例:

yaml
---
- name: 安装 Docker 并启动容器
  hosts: all
  become: true
  tasks:
    - name: 安装 Docker
      apt:
        name: docker.io
        state: present

    - name: 启动 Docker 服务
      service:
        name: docker
        state: started

    - name: 运行一个容器
      docker_container:
        name: web_app
        image: nginx
        state: started

解释:

  • 使用 apt 模块安装 Docker。
  • 使用 service 模块启动 Docker 服务。
  • 使用 docker_container 模块启动一个名为 web_app 的容器。

10. 批量分发配置文件

功能:

将一份配置文件分发到多台主机的指定目录,并根据不同主机动态替换变量。

示例代码:

yaml
---
- name: 分发配置文件并自动替换变量
  hosts: webservers
  become: true
  vars:
    listen_port: 8080
  tasks:
    - name: 拷贝配置文件并替换变量
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf

说明:

  • 使用 template 模块,可以将 Jinja2 模板中的变量动态渲染为实际值。
  • 模板文件中可以写入如 listen ; 这样的内容。

11. 设置定时任务

功能:

为所有主机添加一个每天凌晨2点执行脚本的定时任务。

示例代码:

yaml
---
- name: 添加定时任务
  hosts: all
  become: true
  tasks:
    - name: 每天凌晨2点执行备份脚本
      cron:
        name: "每日备份任务"
        minute: "0"
        hour: "2"
        job: "/usr/local/bin/backup.sh"

说明:

  • 使用 cron 模块添加定时任务,无需手动编辑 crontab 文件。

12. 从控制节点拉取日志文件

功能:

将被控节点上的指定日志文件拉回控制端进行集中分析。

示例代码:

yaml
---
- name: 拉取远程主机日志文件
  hosts: all
  tasks:
    - name: 拉取 nginx 日志文件到本地
      fetch:
        src: /var/log/nginx/access.log
        dest: logs/{{ inventory_hostname }}/
        flat: yes

说明:

  • 使用 fetch 模块可以拉回文件,按主机名分别存储。

13. 开机自启配置

功能:

确保某服务配置为开机自启,并立即启动。

示例代码:

yaml
---
- name: 配置服务开机启动
  hosts: all
  become: true
  tasks:
    - name: 配置并启动服务
      service:
        name: nginx
        enabled: true
        state: started

说明:

  • enabled: true 设置开机自动启动,state: started 启动服务。

14. 设置主机名并写入 hosts 文件

功能:

自动设置主机名并配置 /etc/hosts 文件中的对应记录。

示例代码:

yaml
---
- name: 设置主机名与 hosts 记录
  hosts: all
  become: true
  vars:
    myhostname: "web-{{ inventory_hostname }}"
  tasks:
    - name: 设置主机名
      hostname:
        name: "{{ myhostname }}"

    - name: 添加 hosts 映射
      lineinfile:
        path: /etc/hosts
        line: "127.0.0.1 {{ myhostname }}"
        state: present

说明:

  • hostname 模块设置主机名。
  • lineinfile 确保主机名映射写入 hosts 文件中。

15. 禁用 SELinux

功能:

在所有主机上关闭 SELinux(安全加固模式)。

示例代码:

yaml
---
- name: 禁用 SELinux
  hosts: all
  become: true
  tasks:
    - name: 修改 SELinux 配置文件
      replace:
        path: /etc/selinux/config
        regexp: '^SELINUX=.*'
        replace: 'SELINUX=disabled'

    - name: 临时关闭 SELinux
      command: setenforce 0
      ignore_errors: true

说明:

  • 修改配置文件是永久关闭。
  • setenforce 0 是临时关闭,需重启生效。

16. 一键部署MySQL主从复制环境(GTID方式)

功能:

实现主从数据库的 GTID 自动同步部署。

示例代码(简略):

包括安装MySQL、配置my.cnf、设置root密码、GTID参数、复制账户。

yaml
---
- name: 部署MySQL主从架构
  hosts: mysql_master:mysql_slave
  become: true
  tasks:
    - name: 安装 MySQL 服务
      yum:
        name: mysql-server
        state: present

    - name: 启动并开机启动
      service:
        name: mysqld
        state: started
        enabled: true

    - name: 配置 GTID 参数
      template:
        src: templates/my.cnf.j2
        dest: /etc/my.cnf
      notify:
        - 重启MySQL

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

说明:

适合数据库自动化部署,确保配置一致、效率高

17. 自动检测系统负载并报警

功能:

当某主机负载超过设定值,自动记录日志或发送报警。

示例代码:

yaml
- name: 检查系统负载是否过高
  hosts: all
  gather_facts: false
  tasks:
    - name: 获取当前1分钟平均负载
      shell: "uptime | awk -F 'load average:' '{print $2}' | cut -d',' -f1"
      register: load

    - name: 判断负载并报警
      debug:
        msg: "报警:当前负载过高:{{ load.stdout }}"
      when: load.stdout|float > 5.0

说明:

可搭配企业微信、邮件等通知模块扩展。

18. 自动构建并部署带 Nginx 的静态网站 Docker 容器

功能:

使用 Ansible 自动构建一个包含静态网页的 Nginx Docker 镜像,并在目标主机运行。

示例任务:

yaml
- name: 构建并运行Nginx网站容器
  hosts: webserver
  become: true
  vars:
    app_dir: /opt/webapp
  tasks:
    - name: 创建项目目录结构
      file:
        path: "{{ app_dir }}/{{ item }}"
        state: directory
      loop:
        - html
        - docker

    - name: 上传HTML页面
      copy:
        src: files/index.html
        dest: "{{ app_dir }}/html/index.html"

    - name: 上传Dockerfile
      copy:
        src: files/Dockerfile
        dest: "{{ app_dir }}/docker/Dockerfile"

    - name: 构建Docker镜像
      docker_image:
        name: mynginx
        path: "{{ app_dir }}/docker"

    - name: 启动容器
      docker_container:
        name: nginx_web
        image: mynginx
        ports:
          - "80:80"
        state: started

说明:

适合自动交付部署静态网页应用,便于持续集成使用

19. 分发部署 Docker Compose 的多容器部署 WordPress + MySQL

功能:

通过 Ansible 远程部署 WordPress 和 MySQL 的组合容器,使用 Docker Compose 管理。

操作思路:

  • 创建 compose 文件
  • 上传至目标主机
  • 调用 docker-compose 命令部署
yaml
- name: 部署 WordPress 和 MySQL 多容器应用
  hosts: blogserver
  become: true
  tasks:
    - name: 上传 docker-compose.yml 文件
      copy:
        src: files/wordpress-compose.yml
        dest: /opt/wordpress/docker-compose.yml

    - name: 启动 WordPress 服务
      command: docker-compose up -d
      args:
        chdir: /opt/wordpress

docker-compose.yml 示例:

yaml
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wpdata
    volumes:
      - dbdata:/var/lib/mysql
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wpdata
      WORDPRESS_DB_PASSWORD: rootpass
volumes:
  dbdata:

20.Docker 容器健康检查自动重启

功能:

监控容器运行状态,发现异常自动重启。

yaml
- name: 检查并重启异常容器
  hosts: docker_hosts
  become: true
  tasks:
    - name: 获取容器状态
      shell: docker ps -a --filter "status=exited" --format "{{ '{{' }}.Names{{ '}}' }}"
      register: exited_containers

    - name: 自动重启异常容器
      shell: docker restart {{ item }}
      loop: "{{ exited_containers.stdout_lines }}"
      when: exited_containers.stdout != ""

21. 查看僵尸进程并统计数量

功能:

检查系统是否有僵尸进程,并输出数量。

yaml
- hosts: all
  tasks:
    - name: 获取僵尸进程数量
      shell: ps -eo stat | grep -c Z
      register: zombie_count

    - name: 输出僵尸进程数量
      debug:
        msg: "僵尸进程数量:{{ zombie_count.stdout }}"

22. 批量添加多个用户

功能:

使用 shell 创建多个用户,适合快速批量用户初始化。

yaml
- hosts: all
  vars:
    users:
      - user01
      - user02
      - user03
  tasks:
    - name: 批量添加用户
      shell: useradd {{ item }}
      loop: "{{ users }}"

感谢阅读,欢迎交流!