Appearance
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
:指定服务名称(例如nginx
、mysql
)。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 }}"