10 个Ansible 常用核心模块
1yum
bash
- name: 安装nginx服务
yum:
name: nginx
state: present / latest /absent
update_cache: yes
2copy
bash
# 本地文件复制到远程主机(并设置权限)
- name: 复制nginx配置文件
copy:
src: ./local_nginx.conf
dest: /etc/nginx/nginx.conf
mode: 0644
owner: root
group: root
backup: yes # 覆盖前备份原文件为 nginx.conf.bak
# 远程主机内部复制文件
- name: 复制远程主机的日志文件到备份目录
copy:
src: /var/log/nginx/access.log
dest: /data/backup/nginx/
remote_src: yes # 表示src是远程主机的路径
- name: 生成123456.txt
copy:
content: 123456
dest: /data/backup/nginx/123456.txt
3group
bash
# 创建系统组nginx(GID为999)
- name: 创建nginx系统组
group:
name: nginx
state: present
gid: 999
system: yes
# 删除测试组test_group
- name: 删除test_group组
group:
name: test_group
state: absent
4user
bash
# 创建nginx系统用户(无登录shell,主组为nginx,附加组为wheel)
- name: 创建nginx系统用户
user:
name: nginx
state: present
group: nginx # 关联之前创建的nginx组
groups: wheel # 附加到wheel组(可sudo)
home: /var/www/nginx # 自定义家目录
shell: /sbin/nologin # 禁止登录
system: yes
uid: 999 # 自定义UID
# 创建普通用户test,密码为123456(加密后)
- name: 创建普通用户test
user:
name: test
state: present
password: "$1$abc123$xyz7890123456789012345" # 替换为实际加密后的密码
shell: /bin/bash
home: /home/test
5file
bash
# 创建目录/data/logs,并设置权限和所有者
- name: 创建日志目录
file:
path: /data/logs
state: directory
mode: 0755
owner: nginx
group: nginx
recurse: yes # 若目录已存在,递归修改子内容权限
# 创建符号链接(/etc/nginx/conf.d 指向 /data/nginx/conf.d)
- name: 创建nginx配置符号链接
file:
src: /data/nginx/conf.d
path: /etc/nginx/conf.d
state: link
force: yes # 若已存在链接,强制覆盖
# 删除无用文件
- name: 删除临时文件
file:
path: /tmp/temp.txt
state: absent
6mount
bash
# 挂载/dev/sdb1到/data(ext4文件系统,永久生效)
- name: 挂载数据盘到/data
mount:
path: /data
src: /dev/sdb1
fstype: ext4
state: mounted
opts: defaults # 默认挂载参数(rw, suid, dev等)
# 挂载NFS共享目录(192.168.1.100的/nfs/share到/local/nfs)
- name: 挂载NFS共享
mount:
path: /local/nfs
src: 192.168.1.100:/nfs/share
fstype: nfs
state: mounted
opts: rw,defaults,noatime # 读写、默认参数、禁用访问时间记录
7cron
bash
# 每天凌晨3点执行备份脚本(root用户)
- name: 添加备份定时任务
cron:
name: "系统数据备份"
user: root
minute: "0"
hour: "3"
job: "/usr/local/bin/backup.sh > /var/log/backup.log 2>&1" # 输出重定向到日志
# 每5分钟检查磁盘空间(nginx用户)
- name: 添加磁盘检查任务
cron:
name: "检查磁盘空间"
user: nginx
minute: "*/5" # 每5分钟
job: "df -h | grep /data >> /home/nginx/disk_usage.log"
# 删除名为"旧任务"的定时任务
- name: 删除无用定时任务
cron:
name: "旧任务"
state: absent
8unarchive
bash
# 本地tar.gz文件解压到远程主机的/usr/local
- name: 解压nginx安装包
unarchive:
src: ./nginx-1.24.0.tar.gz
dest: /usr/local/
remote_src: no # src是本地文件,自动上传到远程再解压
owner: root
group: root
# 远程主机上的zip文件解压到/data
- name: 解压远程zip包
unarchive:
src: /tmp/app.zip
dest: /data/
remote_src: yes # src是远程主机的文件,直接解压
mode: 0755
9mysql_db
bash
# 先安装依赖(远程主机需安装PyMySQL)
- name: 安装mysql_db模块依赖
pip:
name: pymysql
state: present
# 创建MySQL数据库test_db
- name: 创建test_db数据库
mysql_db:
name: test_db
state: present
login_user: root
login_password: "123456"
login_host: "127.0.0.1"
# 导入SQL文件到test_db
- name: 导入初始化SQL
mysql_db:
name: test_db
state: import
target: /tmp/init.sql # 远程主机上的SQL文件路径
login_user: root
login_password: "123456"
# 删除无用数据库old_db
- name: 删除old_db数据库
mysql_db:
name: old_db
state: absent
login_user: root
login_password: "123456"
10systemd
bash
# 启动nginx服务并设置开机自启
- name: 启动并启用nginx服务
systemd:
name: nginx
state: started
enabled: yes
# 重启mysql服务(修改配置后)
- name: 重启mysql服务
systemd:
name: mysqld
state: restarted
daemon_reload: yes # 若修改了mysqld.service文件,需重载配置
# 停止并禁用httpd服务
- name: 停止并禁用httpd服务
systemd:
name: httpd
state: stopped
enabled: no
5种常用变量定义方式
一、Play 内直接定义变量
核心特点:变量只在当前 Play 生效,适合简单场景或临时测试,无需额外文件。
1. 列表式定义(多个独立变量)
- hosts: web01
vars: # 变量定义段
- p1: wget # 变量名: 变量值(字符串直接写,列表/字典需用对应格式)
- p2: lrzsz
tasks:
- name: 安装多个软件(使用列表式变量)
yum:
name:
- "{{ p1 }}" # 引用变量:单独存在时必须加双引号
- "{{ p2 }}"
state: present
2. 单变量多值(变量是列表类型,更简洁)
- hosts: web01
vars:
pack: # 变量是列表,包含多个值
- wget
- lrzsz
- tree
tasks:
- name: 安装多个软件(使用列表变量)
yum:
name: "{{ pack }}" # 直接引用列表变量,无需拆解
state: present
变量单独存在时必须加双引号(如 {``{ p1 }})
变量带路径时可省略双引号(如 /root/{``{ ho }}_{``{ ip }})
二、变量文件定义
核心特点:将变量单独存放在文件中,多个 Playbook 可引用,便于维护和统一管理。
1. 单个变量文件(基础用法)
步骤 1:创建变量文件(如 vars/v1.yml,建议建 vars 目录归类)
# vars/v1.yml
p1: lrzsz
p2: wget
p3: tree
步骤 2:在 Playbook 中引用变量文件
- hosts: web01
vars_files: ./vars/v1.yml # 引用单个变量文件(相对路径/绝对路径均可)
tasks:
- name: 安装变量文件中定义的软件
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
- "{{ p3 }}"
state: present
2. 多个变量文件(复用不同场景的变量)
步骤 1:创建多个变量文件
# vars/v1.yml(工具类软件)
p1: tree
# vars/v2.yml(传输类软件)
pack:
- lrzsz
- rz
步骤 2:同时引用多个变量文件
- hosts: web01
vars_files:
- ./vars/v1.yml # 多个变量文件用列表形式
- ./vars/v2.yml
tasks:
- name: 安装 v1.yml 中的软件
yum:
name: "{{ p1 }}"
state: present
- name: 卸载 v2.yml 中的软件
yum:
name: "{{ pack }}"
state: absent
三、主机清单中定义变量
核心特点:变量定义在 /etc/ansible/hosts 中,与主机 / 组绑定,适合简单场景,但不利于变量管理(混合了主机配置和变量)。
- 定义变量(主机组变量)
bash
# /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31
[webs] # 主机组
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[webs:vars] # 给 webs 组所有主机定义变量
p1=wget # 这里用 = 赋值(ini格式),也支持 yaml 格式
p2=lrzsz
-
引用变量(直接使用,无需额外定义)
- hosts: webs # 针对 webs 组主机
tasks:- name: 安装主机清单中定义的软件
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: present
- name: 安装主机清单中定义的软件
- hosts: webs # 针对 webs 组主机
四、host_vars/group_vars 定义(官方推荐)
Ansible 会自动识别 host_vars 和 group_vars 两个目录(需和 Inventory 文件在同一级目录),变量文件的命名有严格规则:
1. group_vars(组专属变量)示例
创建 group_vars/webs.yml(给 webs 组所有主机配置公共变量):
# group_vars/webs.yml:webs 组所有主机都生效
p1: wget # 之前的公共软件变量
p2: lrzsz
ansible_user: root # 所有 web 主机统一登录用户
web_root: /var/www/html # 所有 web 主机的网站根目录(自定义变量)
2. host_vars(主机专属变量)示例
假设 web02 主机的 SSH 端口不是默认 22(是 2222),且网站根目录和其他主机不同,创建 host_vars/web02.yml:
# host_vars/web02.yml:只对 web02 主机生效
ansible_port: 2222 # 单独修改 web02 的 SSH 端口
web_root: /home/www # 覆盖组变量的 web_root(主机变量优先级更高)
3. 所有主机通用变量(all.yml)
# group_vars/all.yml(所有主机都能使用的变量)
common_packages:
- wget
- curl
- vim
五、Ansible 内置变量(无需定义,直接使用)
核心特点:Ansible 自动收集的目标主机信息(如主机名、IP、系统版本等),无需手动定义,直接引用即可,适合动态场景。
bash
# 查看 web01 主机的所有系统信息(-i 指定 inventory 文件,可选)
ansible web01 -m setup
# 示例 1:只查看内存相关信息(过滤 ansible_mem* 开头的变量)
ansible web01 -m setup -a "filter=ansible_mem*"
# 示例 2:只查看 CPU 相关信息
ansible web01 -m setup -a "filter=ansible_processor*"
# 示例 3:只查看网络相关信息(IP、网卡等)
ansible web01 -m setup -a "filter=ansible_default_ipv4" # 默认网卡 IP 信息
ansible web01 -m setup -a "filter=ansible_eth*" # 以太网网卡信息(CentOS 7)
ansible web01 -m setup -a "filter=ansible_en*" # 以太网网卡信息(CentOS 8/Ubuntu)
# 示例 4:只查看操作系统相关信息
ansible web01 -m setup -a "filter=ansible_os*"
实战示例(动态创建主机名 + IP 目录):
- hosts: webs # web01、web02 都会执行
tasks:
- name: 动态创建目录(主机名_IP)
file:
# 引用两个内置变量,拼接目录名
path: "/root/{{ ansible_hostname }}_{{ ansible_default_ipv4.address }}"
state: directory
mode: 0755
效果:
- web01 主机创建
/root/web01_10.0.0.7 - web02 主机创建
/root/web02_10.0.0.8
register注册变量
- 用
register: 变量名把命令执行的完整结果保存到变量中; - 用
debug模块读取变量中的具体字段(如 stdout、stderr、返回码等)。
bash
- hosts: web01
tasks:
# 第一步:执行命令并注册变量
- name: 检查 Nginx 配置语法
command: nginx -t # 注意:命令字符串无需加单引号(除非有特殊字符)
register: nginx_check # 注册结果到变量 nginx_check
ignore_errors: yes # 可选:即使命令失败(如配置错误),也继续执行后续任务(方便查看错误信息)
# 第二步:查看完整结果(适合调试)
- name: 打印 Nginx 检查的完整结果
debug:
var: nginx_check # 简化写法:用 var 直接指定变量名,无需 msg 拼接
verbosity: 0 # 默认为 0,执行时必显示(verbosity=1 需加 -v 参数才显示)
# 第三步:查看具体字段(实战常用)
- name: 只打印错误信息(若配置有误)
debug:
msg: "Nginx 配置错误:{{ nginx_check.stderr_lines }}" # 错误输出(按行分割)
when: nginx_check.rc != 0 # 条件判断:只有返回码非0(失败)时才执行
这是我的个人学习笔记,主要用于记录自己对知识点的理解和梳理。由于目前仍在学习探索阶段,内容中难免存在理解偏差或表述疏漏,恳请各位大佬不吝赐教,多提宝贵意见~ 若有不同看法,欢迎理性交流探讨,感谢包容与指正!