Ansible 的 command 模块是 Ansible 中最常用的模块之一,用于在远程主机上执行具体的 shell 命令。它不会通过 shell(如 /bin/sh)来执行命令,因此不会继承环境变量等 shell 特性。
command 模块特点:ls, cat, systemctl restart nginx 等)|、重定向 >、通配符 * 等)shell 模块- name: 描述任务
command: 命令 参数
- name: 列出 /tmp 目录下的文件
command: ls /tmp
- name: 执行一个脚本
command: /opt/scripts/check_status.sh
- name: 获取系统运行时间
command: uptime
chdir:在执行命令前切换目录creates:如果指定的文件存在,则不执行命令removes:如果指定的文件不存在,则不执行命令- name: 在 /var/log 下执行 ls
command: ls
args:
chdir: /var/log
- name: 如果 /tmp/testfile 不存在才创建
command: touch /tmp/testfile
args:
creates: /tmp/testfile
| 模块名 | 用途 |
|---|---|
command |
执行具体的命令,不经过 shell,更安全 |
shell |
执行 shell 命令,支持管道、重定向等 |
Ansible 的 shell 模块用于在远程主机上执行Shell 命令,与 command 模块不同的是,它会在远程主机的 shell 解释器(如 /bin/sh)中运行命令,因此可以使用管道、重定向、通配符等 shell 特性。
shell 模块特点:|, >, >>, *, &&, || 等)/bin/sh 执行命令command 模块更安全- name: 描述任务
shell: shell命令
- name: 获取当前工作目录
shell: pwd
register: current_dir
- debug:
msg: "当前目录是 {{ current_dir.stdout }}"
- name: 查找包含 'root' 的行
shell: grep root /etc/passwd | wc -l
register: result
- debug:
msg: "匹配的行数为 {{ result.stdout }}"
- name: 写入内容到文件
shell: echo "Hello from Ansible" > /tmp/ansible_test.txt
- name: 检查 nginx 是否运行
shell: ps aux | grep nginx | grep -v grep
ignore_errors: yes
register: nginx_status
- debug:
msg: "Nginx 正在运行"
when: nginx_status is not failed and nginx_status.stdout != ''
chdir:在执行命令前切换目录creates:如果指定的文件存在,则不执行命令removes:如果指定的文件不存在,则不执行命令executable:指定使用的 shell 解释器(如 /bin/bash)- name: 使用 bash 执行脚本
shell: ./hello.sh
args:
chdir: /opt/scripts
executable: /bin/bash
| 模块名 | 是否支持 shell 特性 | 安全性 | 推荐用途 |
|---|---|---|---|
command |
❌ 不支持 | 高 | 简单、确定的命令 |
shell |
✅ 支持 | 中 | 需要管道、重定向等复杂操作 |
Ansible 的 script 模块用于在远程主机上执行本地脚本文件。也就是说,你可以将 Ansible 控制机(即 Ansible 运行的机器)上的一个脚本文件传输到远程主机并执行它。
script 模块特点:.sh, .py 等)- name: 描述任务
script: 脚本路径 参数1 参数2 ...
假设你本地有一个脚本文件 hello.sh:
#!/bin/bash
echo "Hello from script"
echo "Current user: $(whoami)"
Ansible Playbook 示例:
- name: 执行本地脚本到远程主机
script: hello.sh
Ansible 会自动将 hello.sh 传输到远程主机并执行它。
脚本 greet.sh:
#!/bin/bash
echo "Hello, $1"
Playbook 示例:
- name: 执行脚本并传递参数
script: greet.sh Alice
输出:
Hello, Alice
chdir:执行脚本前切换到指定目录creates:如果指定的文件存在,则不执行脚本removes:如果指定的文件不存在,则不执行脚本environment:为脚本设置环境变量- name: 切换目录执行脚本
script: hello.sh
args:
chdir: /tmp
- name: 如果文件不存在则执行脚本
script: create_file.sh
args:
creates: /tmp/output.txt
脚本 print_env.sh:
#!/bin/bash
echo "Environment: $ENV_VAR"
Playbook 示例:
- name: 执行脚本并设置环境变量
script: print_env.sh
environment:
ENV_VAR: "production"
| 模块名 | 执行内容 | 是否支持 shell 特性 | 是否推荐用于脚本文件 |
|---|---|---|---|
command |
单条命令 | ❌ 不支持 | ❌ 不适合 |
shell |
单条 shell 命令 | ✅ 支持 | ❌ 不适合复杂脚本 |
script |
本地脚本文件 | ✅ 支持 | ✅ 推荐 |
Ansible 的 stat 模块用于获取远程主机上文件或目录的状态信息,类似于 Linux 中的 stat 命令。它可以检查文件是否存在、类型、权限、大小、修改时间等信息。
stat 模块特点:- name: 描述任务
stat:
src: 文件路径
- name: 获取 /etc/passwd 文件的状态
stat:
src: /etc/passwd
register: file_stat
- debug:
msg: |
文件存在,大小为 {{ file_stat.stat.size }} 字节,
修改时间为 {{ file_stat.stat.mtime }}
- name: 检查文件是否存在
stat:
src: /tmp/testfile.txt
register: file_check
- debug:
msg: "文件存在"
when: file_check.stat.exists
- name: 检查路径是否是目录
stat:
src: /var/log
register: dir_stat
- debug:
msg: "/var/log 是一个目录"
when: dir_stat.stat.isdir
- name: 获取文件权限信息
stat:
src: /etc/hosts
register: host_file
- debug:
msg: "权限为 {{ host_file.stat.mode }}"
输出示例:
权限为 0644
| 字段名 | 含义 |
|---|---|
exists |
文件是否存在 |
isdir |
是否是目录 |
isfile |
是否是普通文件 |
size |
文件大小(字节) |
mtime |
最后修改时间(时间戳) |
mode |
文件权限模式(如 0644) |
uid, gid |
文件拥有者 ID 和组 ID |
| 使用场景 | 推荐模块 |
|---|---|
| 获取文件状态信息 | ✅stat |
| 判断文件是否存在 | ✅stat |
| 修改文件内容 | ❌ 不适用,应使用 copy 或 lineinfile |
| 执行命令或脚本 | ❌ 不适用,应使用 command / shell / script |
Ansible 的 file 模块用于管理远程主机上的文件、目录或符号链接的属性,比如创建/删除文件、设置权限、修改所有者等。它是 Ansible 中最常用的模块之一,适用于对文件系统进行操作。
file 模块主要功能:- name: 描述任务
file:
path: 文件/目录路径
state: 状态(如 touch, directory, absent, link 等)
mode: 权限模式(可选)
owner: 所有者(可选)
group: 所属组(可选)
touch)- name: 创建一个空文件
file:
path: /tmp/testfile.txt
state: touch
- name: 创建目录 /var/www/html
file:
path: /var/www/html
state: directory
你也可以同时设置权限和所有者:
- name: 创建目录并设置权限和所有者
file:
path: /var/www/html
state: directory
mode: '0755'
owner: www-data
group: www-data
- name: 删除 /tmp/testfile.txt
file:
path: /tmp/testfile.txt
state: absent
⚠️ 如果是目录,会递归删除整个目录及其内容!
- name: 创建软链接 /etc/app_config → /opt/app/config
file:
src: /opt/app/config
dest: /etc/app_config
state: link
- name: 修改文件权限和所有者
file:
path: /var/www/index.html
mode: '0644'
owner: apache
group: apache
- name: 设置文件的访问时间和修改时间
file:
path: /tmp/example.txt
state: touch
atime: "{{ ansible_date_time.iso8601 }}"
mtime: "{{ ansible_date_time.iso8601 }}"
| 参数名 | 说明 |
|---|---|
path |
文件或目录路径(必填) |
state |
状态:absent, touch, directory, link 等 |
mode |
设置权限(如 '0644') |
owner |
设置文件拥有者 |
group |
设置文件所属组 |
src |
软链接时使用,指定源路径 |
dest |
软链接时使用,指定目标路径 |
| 功能 | 推荐模块 |
|---|---|
| 查看文件状态 | ✅stat |
| 创建/删除/修改文件属性 | ✅file |
| 执行脚本或命令 | ❌ 不适用,应使用 shell 或 script |
| 传输文件 | ❌ 不适用,应使用 copy 或 synchronize |
Ansible 的 lineinfile 模块用于确保某一行内容在文件中存在或不存在。它非常适合用于修改配置文件,比如:
它是 Ansible 中用于精细修改文件内容的常用模块之一。
lineinfile 模块特点:sed 命令,但更简单易用- name: 描述任务
lineinfile:
path: 文件路径
regexp: '正则表达式匹配行(可选)'
line: '要设置的行内容'
state: present 或 absent(默认是 present)
- name: 确保 /etc/motd 中包含一行欢迎语
lineinfile:
path: /etc/motd
line: 'Welcome to the server, authorized users only.'
如果该行不存在,就会被添加到文件末尾。
- name: 修改配置文件中的端口号
lineinfile:
path: /etc/myapp.conf
regexp: '^port ='
line: 'port = 8080'
这会将类似 port = 8000 的行修改为 port = 8080。
- name: 删除包含 'PasswordAuthentication' 的行
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PasswordAuthentication'
state: absent
- name: 如果找不到匹配行,则添加
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
- name: 在匹配行后插入内容
lineinfile:
path: /etc/myapp.conf
regexp: '^log_level ='
insertafter: '^log_level ='
line: 'log_file = /var/log/myapp.log'
- name: 插入一行到文件开头
lineinfile:
path: /etc/motd
line: 'Top line of the file'
insertbefore: BOF
- name: 插入一行到文件末尾
lineinfile:
path: /etc/motd
line: 'Bottom line of the file'
insertafter: EOF
| 参数名 | 说明 |
|---|---|
path |
要操作的文件路径(必填) |
regexp |
正则表达式,用于匹配目标行(可选) |
line |
要设置的行内容(state=present 时必填) |
state |
present(默认)或 absent |
insertafter |
在匹配的行之后插入新内容 |
insertbefore |
在匹配的行之前插入新内容 |
backup |
修改前备份原文件(建议用于重要配置文件) |
| 功能 | 推荐模块 |
|---|---|
| 替换或添加某一行内容 | ✅lineinfile |
| 修改整个文件内容 | ❌ 不适合,应使用 copy |
| 查看文件状态 | ❌ 不适合,应使用 stat |
| 创建/删除/修改文件属性 | ❌ 不适合,应使用 file |
Ansible 的 copy 模块用于将本地或远程计算机上的文件复制到远程主机上的指定位置。它是 Ansible 中最常用的模块之一,特别适合用于部署配置文件、脚本、证书等。
copy 模块特点:- name: 描述任务
copy:
src: 本地文件路径(Ansible 控制机上的路径)
dest: 远程主机上的目标路径(必填)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
backup: yes/no(是否备份原文件)
content: 直接设置文件内容(可选,与 src 互斥)
- name: 复制本地的 index.html 到远程主机
copy:
src: /data/files/index.html
dest: /var/www/html/index.html
- name: 复制配置文件并设置权限和所有者
copy:
src: myapp.conf
dest: /etc/myapp.conf
owner: root
group: root
mode: '0644'
- name: 复制整个目录到远程主机
copy:
src: /data/files/
dest: /opt/files/
⚠️ 注意:
src路径结尾的/表示复制目录内容,不带/表示复制整个目录本身。
- name: 替换配置文件并备份原文件
copy:
src: new_config.conf
dest: /etc/app/config.conf
backup: yes
如果 /etc/app/config.conf 已存在,Ansible 会先将它备份为类似 config.conf.210101.1234 的文件。
- name: 创建一个文件并写入指定内容
copy:
dest: /tmp/hello.txt
content: |
Hello from Ansible.
This file was created using the copy module.
- name: 使用变量写入文件内容
copy:
dest: /tmp/greeting.txt
content: "Welcome user: {{ ansible_env.USER }}"
| 参数名 | 说明 |
|---|---|
src |
本地文件或目录路径(Ansible 控制机) |
dest |
远程主机上的目标路径(必填) |
content |
直接指定文件内容(与 src 互斥) |
owner |
设置文件拥有者 |
group |
设置文件所属组 |
mode |
设置文件权限(如 '0644') |
backup |
覆盖前备份原文件 |
force |
是否强制覆盖(即使内容相同) |
| 功能 | 推荐模块 |
|---|---|
| 复制文件或目录 | ✅copy |
| 修改某一行内容 | ❌ 不适合,应使用 lineinfile |
| 查看文件状态 | ❌ 不适合,应使用 stat |
| 创建/删除/修改文件属性 | ❌ 不适合,应使用 file |
Ansible 的 template** 模块** 用于将本地的 Jinja2 模板文件 渲染后复制到远程主机上。它是 copy 模块的“高级版”,支持在模板中使用变量和逻辑,非常适合用来生成动态配置文件(如 Nginx 配置、系统服务配置等)。
template 模块特点:templates/ 目录下- name: 描述任务
template:
src: 模板文件路径(相对于 templates 目录)
dest: 远程主机上的目标路径(必填)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
templates/motd.j2Welcome to {{ ansible_fqdn }}
IP Address: {{ ansible_default_ipv4.address }}
Environment: production
- name: 使用模板生成 /etc/motd 文件
hosts: all
tasks:
- name: 部署 motd 模板
template:
src: motd.j2
dest: /etc/motd
mode: '0644'
执行后,远程主机上的 /etc/motd 文件内容会是:
Welcome to node01.example.com
IP Address: 192.168.1.10
Environment: production
templates/app_config.j2# 应用配置文件
{% if environment == "prod" %}
log_level = warning
{% else %}
log_level = debug
{% endif %}
bind_address = {{ bind_ip }}
port = {{ app_port }}
- name: 部署应用配置模板
hosts: webservers
vars:
environment: prod
bind_ip: 0.0.0.0
app_port: 8000
tasks:
- name: 渲染配置文件
template:
src: app_config.j2
dest: /etc/myapp/config.conf
owner: root
group: root
mode: '0644'
| 参数名 | 说明 |
|---|---|
src |
Jinja2 模板文件路径(相对于 templates/ 目录) |
dest |
远程主机上的目标路径(必填) |
owner |
设置文件拥有者 |
group |
设置文件所属组 |
mode |
设置文件权限(如 '0644') |
backup |
覆盖前备份原文件(建议开启) |
| 功能 | 推荐模块 |
|---|---|
| 生成带变量的配置文件 | ✅template |
| 静态文件复制 | ❌ 不适合,应使用 copy |
| 修改某一行内容 | ❌ 不适合,应使用 lineinfile |
| 创建/删除/修改文件属性 | ❌ 不适合,应使用 file |
templates/ 文件夹中.j2,不是必须的,但推荐使用来区分模板与普通文件Ansible 的 unarchive** 模块** 用于在远程主机上解压归档文件(如 .tar, .tgz, .zip 等格式),是 Ansible 中处理压缩包的常用模块。
它支持从本地控制机或远程主机复制并解压归档文件,非常适合部署应用时使用,比如将打包好的代码上传并解压到指定目录。
unarchive 模块特点:.tar, .tar.gz, .zip 等copy + 解压)- name: 描述任务
unarchive:
src: 本地或远程的压缩包路径
dest: 解压到的目标目录
remote_src: yes/no(是否压缩包已在远程主机上)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
files/app.tar.gz- name: 上传并解压 app.tar.gz 到 /opt/app/
unarchive:
src: files/app.tar.gz
dest: /opt/app/
remote_src: no # 默认就是 no,表示压缩包来自 Ansible 控制机
Ansible 会自动将
app.tar.gz上传并解压到/opt/app/目录下。
假设远程主机上已经存在一个压缩包:/tmp/myapp.zip
- name: 解压远程主机上的 zip 文件
unarchive:
src: /tmp/myapp.zip
dest: /var/www/myapp/
remote_src: yes # 表示压缩包已经在远程主机上
- name: 解压代码包并设置权限和归属
unarchive:
src: files/project.tar.gz
dest: /data/project/
owner: deploy
group: deploy
mode: '0755'
extra_opts)如果你只想解压压缩包中的某个子目录(例如只提取 project/config/),可以使用 extra_opts 传入命令行参数:
- name: 解压 tar.gz 中的特定子目录
unarchive:
src: files/project.tar.gz
dest: /data/project/
extra_opts:
- "--strip-components=1"
- "-C"
- "project/subdir"
⚠️ 注意:
extra_opts是高级用法,需要你对 tar 或 unzip 命令有一定了解。
| 参数名 | 说明 |
|---|---|
src |
压缩包路径(本地或远程) |
dest |
解压到的目标目录(必填) |
remote_src |
是否压缩包已存在于远程主机(yes/no) |
owner |
设置解压后文件的所有者 |
group |
设置解压后文件的所属组 |
mode |
设置解压后文件的权限 |
creates |
如果目标路径已存在,则跳过解压 |
backup |
如果目标目录存在,是否先备份再覆盖(不支持) |
extra_opts |
额外传递给 tar/unzip 命令的参数 |
| 功能 | 推荐模块 |
|---|---|
| 解压 .tar/.zip 等压缩包 | ✅unarchive |
| 复制文件或目录 | ❌ 不适合,应使用 copy |
| 创建/删除/修改文件属性 | ❌ 不适合,应使用 file |
Ansible 的 mount 模块用于管理挂载点(如文件系统、NFS、CIFS 等)的挂载和卸载操作,并可以更新 /etc/fstab 文件以实现开机自动挂载。它是 Ansible 中用于管理存储设备或远程共享目录的重要模块。
mount 模块特点:/etc/fstab 实现持久化挂载/dev/sdb1)或远程共享(如 NFS、CIFS)ro, rw, noatime)- name: 描述任务
mount:
path: 挂载点路径(如 /mnt/data)
src: 设备或远程资源路径(如 /dev/sdb1 或 server:/share)
fstype: 文件系统类型(如 ext4, xfs, nfs, cifs)
state: 状态(mounted, unmounted, present, absent)
opts: 挂载选项(可选)
- name: 挂载 NFS 共享到 /mnt/nfs
mount:
path: /mnt/nfs
src: nfs-server:/exports/data
fstype: nfs
opts: defaults
state: mounted
这会执行以下操作:
/etc/fstab,使其在重启后也生效。- name: 添加 NFS 到 fstab,但不立即挂载
mount:
path: /mnt/nfs
src: nfs-server:/exports/data
fstype: nfs
opts: defaults
state: present
这种方式只修改配置文件,不会实际执行挂载操作。
- name: 挂载本地硬盘分区 /dev/sdb1 到 /mnt/data
mount:
path: /mnt/data
src: /dev/sdb1
fstype: ext4
opts: defaults,noatime
state: mounted
- name: 卸载 /mnt/nfs
mount:
path: /mnt/nfs
state: unmounted
此操作只会卸载当前挂载,不会删除
/etc/fstab中的条目。
- name: 从 fstab 中移除 /mnt/nfs 条目
mount:
path: /mnt/nfs
state: absent
此操作只会删除
/etc/fstab中对应的条目,不会卸载当前已挂载的文件系统。
| 参数名 | 说明 |
|---|---|
path |
挂载点路径(必填) |
src |
要挂载的设备或远程路径(如 /dev/sdb1, nfs-server:/share) |
fstype |
文件系统类型(如 ext4, xfs, nfs, cifs) |
opts |
挂载选项(如 defaults, ro, noatime) |
state |
状态:mounted: 挂载 + 写 fstab unmounted: 卸载 present: 仅写 fstab absent: 删除 fstab 条目 |
| 操作目标 | 推荐 state 值 |
|---|---|
| 挂载并写入 fstab | mounted |
| 仅写入 fstab | present |
| 卸载 | unmounted |
| 从 fstab 中删除条目 | absent |
Ansible 的 group 模块用于管理远程主机上的用户组(group)。你可以使用它来创建、删除用户组,或者设置组的 GID 等属性。
它是 Ansible 中用于用户权限管理的基础模块之一,常用于自动化部署时配置系统权限结构。
group 模块特点:state=absent 或 gid)- name: 描述任务
group:
name: 组名(必填)
gid: 组的 GID(可选)
state: present 或 absent(默认是 present)
system: yes/no(是否为系统组)
- name: 创建名为 deploy 的用户组
group:
name: deploy
state: present
如果该组不存在,就会被创建。
- name: 创建名为 dbgroup 的组,指定 GID 为 1010
group:
name: dbgroup
gid: 1010
state: present
- name: 删除名为 tempgroup 的用户组
group:
name: tempgroup
state: absent
系统组通常 GID 会比较小(如 < 1000),用于系统服务或守护进程。
- name: 创建系统组 www-data
group:
name: www-data
system: yes
state: present
| 参数名 | 说明 |
|---|---|
name |
用户组名称(必填) |
gid |
指定组的 GID(可选) |
state |
present(默认,确保存在)或 absent(删除组) |
system |
是否为系统组(yes/no) |
| 功能 | 推荐模块 |
|---|---|
| 管理用户组 | ✅group |
| 管理用户账户 | ❌ 不适合,应使用 user |
| 管理文件权限 | ❌ 不适合,应使用 file |
| 执行命令或脚本 | ❌ 不适合,应使用 command / shell |
Ansible 的 user 模块用于管理远程主机上的用户账户,可以创建、删除用户,设置用户的主组、附加组、家目录、登录 shell 等属性。它是 Ansible 中用于系统管理和权限控制的重要模块之一。
user 模块特点:ssh_key 参数)- name: 描述任务
user:
name: 用户名(必填)
comment: 用户描述信息
uid: 用户 UID(可选)
group: 主组(可选)
groups: 附加组列表(可选)
home: 家目录路径
shell: 登录 shell(如 /bin/bash)
password: 加密后的密码(可选)
state: present 或 absent(默认 present)
system: yes/no(是否是系统用户)
remove: yes/no(删除用户时是否同时删除家目录和邮件文件)
- name: 创建用户 alice
user:
name: alice
comment: "Alice User"
shell: /bin/bash
home: /home/alice
groups: sudo
state: present
这会创建一个用户 alice,主目录 /home/alice,使用 /bin/bash shell,并加入 sudo 组。
- name: 创建用户 bob,主组为 developers,附加组为 docker, www-data
user:
name: bob
group: developers
groups:
- docker
- www-data
shell: /bin/zsh
create_home: yes
- name: 删除用户 tempuser 并删除其家目录
user:
name: tempuser
state: absent
remove: yes
系统用户通常不带家目录,适用于服务运行账户。
- name: 创建系统用户 myservice
user:
name: myservice
system: yes
shell: /sbin/nologin
create_home: no
⚠️ 注意:Ansible 不支持直接明文设置密码,必须使用加密后的密码字符串(可以通过 openssl passwd -6 生成)。
- name: 设置用户 alice 的密码
user:
name: alice
password: "{{ password|password_hash('sha512','zbl') }}"
你可以用以下命令生成 SHA-512 加密密码:
openssl passwd -6
- name: 添加 alice 的 SSH 公钥
user:
name: alice
ssh_key_shell: /bin/bash
ssh_key_file: .ssh/authorized_keys
ssh_key_content: "{{ lookup('file', '/path/to/id_rsa.pub') }}"
| 参数名 | 说明 |
|---|---|
name |
用户名(必填) |
comment |
用户描述(GECOS 字段) |
uid |
指定用户 UID |
group |
设置主组 |
groups |
设置附加组(列表) |
home |
设置家目录路径 |
shell |
设置登录 shell |
password |
设置加密后的密码 |
state |
present(默认)或 absent |
system |
是否为系统用户 |
remove |
删除用户时是否同时删除家目录和邮件文件 |
create_home |
是否创建家目录 |
ssh_key_* |
管理用户的 SSH 公钥 |
| 功能 | 推荐模块 |
|---|---|
| 管理用户账户 | ✅user |
| 管理用户组 | ❌ 不适合,应使用 group |
| 修改用户密码 | ✅(但需加密密码) |
| 部署 SSH 密钥 | ✅ 支持 |
| 执行命令或脚本 | ❌ 不适合,应使用 command / shell |
在 Ansible 中,yum 和 apt 是两个用于管理软件包的模块,分别适用于不同 Linux 发行版:
yum 模块(适用于 CentOS / RHEL)用于在基于 YUM 的系统上安装、更新、卸载软件包。
- name: 安装 Apache httpd
yum:
name: httpd
state: present
- name: 升级所有已安装的包
yum:
name: "*"
state: latest
- name: 卸载 postfix 邮件服务
yum:
name: postfix
state: absent
apt 模块(适用于 Ubuntu / Debian)用于在基于 APT 的系统上安装、更新、删除软件包。
使用 apt 模块前建议先执行 apt update 来刷新包索引。
- name: 更新 APT 缓存
apt:
update_cache: yes
cache_valid_time: 3600
- name: 安装 nginx
apt:
name: nginx
state: present
- name: 安装多个软件包
apt:
name:
- python3-pip
- curl
state: present
- name: 删除无用的软件包
apt:
name: telnet
state: absent
yum vs apt| 功能 | yum(CentOS/RHEL) |
apt(Ubuntu/Debian) |
|---|---|---|
| 安装软件包 | ✅ | ✅ |
| 升级软件包 | ✅ | ✅ |
| 卸载软件包 | ✅ | ✅ |
| 刷新包列表 | ❌ 默认不自动刷新 | ✅ 需手动调用 update_cache |
| 支持通配符 | ✅ | ✅(通过 name: '*' 等) |
| 使用仓库 | ✅ | ✅ |
如果你希望写一个能同时支持 CentOS 和 Ubuntu 的 Playbook,可以这样写:
- name: 安装 nginx,根据系统类型选择模块
vars:
ansible_distribution_major_version: "{{ ansible_distribution_major_version | int }}"
tasks:
- name: 使用 yum 安装 nginx(RHEL/CentOS)
yum:
name: nginx
state: present
when:
- ansible_facts['os_family'] == 'RedHat'
- name: 使用 apt 安装 nginx(Ubuntu/Debian)
apt:
name: nginx
state: present
update_cache: yes
when:
- ansible_facts['os_family'] == 'Debian'
| 场景 | 推荐模块 |
|---|---|
| 在 CentOS/RHEL 上安装软件包 | ✅yum |
| 在 Ubuntu/Debian 上安装软件包 | ✅apt |
| 配置 YUM/APT 仓库源 | ❌ 不适合,应使用 yum_repository 或自定义文件管理 |
安装本地 .rpm 或 .deb 文件 |
❌ 不适合,应使用 yum 或 dpkg 模块 |
Ansible 的 systemd** 模块** 用于在使用 systemd 作为初始化系统的 Linux 主机上管理服务(如启动、停止、重启服务,设置开机自启等)。它是 Ansible 中用于服务管理的核心模块之一。
systemd 模块特点:- name: 描述任务
systemd:
name: 服务名称(如 httpd, nginx)
state: started / stopped / restarted / reloaded
enabled: yes / no(是否开机自启)
daemon_reload: yes / no(是否重新加载 systemd 配置)
- name: 启动并启用 Nginx 服务
systemd:
name: nginx
state: started
enabled: yes
- name: 重启 Apache 服务
systemd:
name: httpd
state: restarted
- name: 停止并禁用 postfix 服务
systemd:
name: postfix
state: stopped
enabled: no
- name: 设置 MySQL 开机自启,但不启动
systemd:
name: mariadb
enabled: yes
注意:没有指定
state参数时,只会影响enabled状态。
- name: 重载 systemd 并启动 myapp 服务
systemd:
name: myapp
state: started
daemon_reload: yes
| 参数名 | 说明 |
|---|---|
name |
服务单元名称(如 nginx, httpd) |
state |
服务状态:started(启动) stopped(停止) restarted(重启) reloaded(重载) |
enabled |
是否开机自启(yes/no) |
daemon_reload |
是否执行 systemctl daemon-reload(适合新增服务或修改了 service 文件) |
| 功能 | 推荐模块 |
|---|---|
| 管理服务启动/停止/重启 | ✅systemd |
| 安装软件包 | ❌ 不适合,应使用 yum 或 apt |
| 修改服务配置文件 | ❌ 不适合,应使用 copy 或 template |
| 在旧系统(SysVinit)上管理服务 | ❌ 不适合,应使用 service 模块 |
在 Ansible 中,mysql_db 和 mysql_user 是两个用于管理 MySQL 数据库和用户 的模块,非常适合自动化部署 MySQL 相关的配置。它们通常用于:
mysql_db)mysql_user)使用这些模块前需要确保远程主机上已安装以下组件:
mysqlpython3-PyMySQL 或 MySQLdb(Python MySQL 驱动)可以通过以下命令安装依赖:
ansible -m yum -a "name=python3-PyMySQL state=present" your_host
mysql_user 模块管理 MySQL 用户账户:创建、删除、授予权限、设置密码等。
- name: 创建 MySQL 用户 'app_user' 并授权访问 'app_db'
mysql_user:
login_user: root
login_password: root_password
name: app_user
password: secure_password
priv: "app_db.*:ALL"
host: "%"
state: present
上述操作相当于执行 SQL:
CREATE USER 'app_user'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
- name: 删除 MySQL 用户 'temp_user'
mysql_user:
login_user: root
login_password: root_password
name: temp_user
host: "localhost"
state: absent
- name: 修改用户权限为只读
mysql_user:
login_user: root
login_password: root_password
name: app_user
priv: "app_db.*:SELECT"
host: "%"
append_privs: no
append_privs=no表示覆盖原有权限;yes表示追加权限。
mysql_db 模块管理 MySQL 数据库:创建、删除数据库,以及导入/导出数据。
- name: 创建数据库 'my_database'
mysql_db:
login_user: root
login_password: root_password
name: my_database
state: present
- name: 创建数据库并设置字符集
mysql_db:
login_user: root
login_password: root_password
name: utf8_database
encoding: utf8mb4
collation: utf8mb4_unicode_ci
state: present
- name: 导出数据库到文件
mysql_db:
login_user: root
login_password: root_password
name: my_database
dump:
target: /backup/my_database.sql
- name: 从文件导入数据库
mysql_db:
login_user: root
login_password: root_password
name: my_database
state: import
target: /backup/my_database.sql
mysql_user 模块常用参数:| 参数名 | 说明 |
|---|---|
login_user |
登录 MySQL 的用户名(如 root) |
login_password |
登录密码 |
name |
要操作的 MySQL 用户名 |
password |
设置用户的密码 |
host |
用户的访问主机(默认 localhost) |
priv |
权限设置格式为 db.table:privileges |
state |
present(存在)、absent(不存在) |
mysql_db 模块常用参数:| 参数名 | 说明 |
|---|---|
name |
数据库名称 |
encoding |
字符集(如 utf8mb4) |
collation |
排序规则 |
dump |
导出数据库时指定目标路径 |
import |
导入数据库时使用 |
target |
导出或导入的目标文件路径 |
state |
present, absent, import |
| 功能 | 推荐模块 |
|---|---|
| 管理 MySQL 用户 | ✅mysql_user |
| 管理 MySQL 数据库 | ✅mysql_db |
| 安装 MySQL 服务 | ❌ 不适合,应使用 yum 或 apt |
| 执行自定义 SQL 脚本 | ❌ 可用 shell 模块实现 |