🌟command模块
Ansible 的 command
模块是 Ansible 中最常用的模块之一,用于在远程主机上执行具体的 shell 命令。它不会通过 shell(如 /bin/sh
)来执行命令,因此不会继承环境变量等 shell 特性。
📌 command
模块特点:
- 执行的是具体的命令(如
ls
,cat
,systemctl restart nginx
等) - 不支持 shell 语法(如管道
|
、重定向>
、通配符*
等) - 更安全、更直接,适合执行确定路径和参数的命令
- 如果需要使用 shell 特性,请使用
shell
模块
✅ 基本语法:
- name: 描述任务
command: 命令 参数
📚 示例 1:列出远程主机上的文件
- name: 列出 /tmp 目录下的文件
command: ls /tmp
📚 示例 2:执行脚本
- name: 执行一个脚本
command: /opt/scripts/check_status.sh
📚 示例 3:获取远程主机的 uptime
- name: 获取系统运行时间
command: uptime
📌 常用参数:
chdir
:在执行命令前切换目录creates
:如果指定的文件存在,则不执行命令removes
:如果指定的文件不存在,则不执行命令
📚 示例 4:切换目录执行命令
- name: 在 /var/log 下执行 ls
command: ls
args:
chdir: /var/log
📚 示例 5:只有文件不存在时才执行命令
- name: 如果 /tmp/testfile 不存在才创建
command: touch /tmp/testfile
args:
creates: /tmp/testfile
✅ 总结:
模块名 | 用途 |
---|---|
command | 执行具体的命令,不经过 shell,更安全 |
shell | 执行 shell 命令,支持管道、重定向等 |
🌟shell模块
Ansible 的 shell
模块用于在远程主机上执行Shell 命令,与 command
模块不同的是,它会在远程主机的 shell 解释器(如 /bin/sh
)中运行命令,因此可以使用管道、重定向、通配符等 shell 特性。
📌 shell
模块特点:
- 支持完整的 shell 语法(如
|
,>
,>>
,*
,&&
,||
等) - 默认使用
/bin/sh
执行命令 - 可以继承环境变量(取决于用户和执行上下文)
- 如果你只需要执行简单、明确的命令而不依赖 shell 特性,推荐使用
command
模块更安全
✅ 基本语法:
- name: 描述任务
shell: shell命令
📚 示例 1:获取当前工作目录(支持 shell 命令)
- name: 获取当前工作目录
shell: pwd
register: current_dir
- debug:
msg: "当前目录是 {{ current_dir.stdout }}"
📚 示例 2:使用管道过滤输出内容
- name: 查找包含 'root' 的行
shell: grep root /etc/passwd | wc -l
register: result
- debug:
msg: "匹配的行数为 {{ result.stdout }}"
📚 示例 3:写入文件内容(重定向)
- name: 写入内容到文件
shell: echo "Hello from Ansible" > /tmp/ansible_test.txt
📚 示例 4:判断某个服务是否运行(结合 if 判断)
- 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
)
📚 示例 5:使用特定 shell 并切换目录执行脚本
- name: 使用 bash 执行脚本
shell: ./hello.sh
args:
chdir: /opt/scripts
executable: /bin/bash
✅ 总结对比:
模块名 | 是否支持 shell 特性 | 安全性 | 推荐用途 |
---|---|---|---|
command | ❌ 不支持 | 高 | 简单、确定的命令 |
shell | ✅ 支持 | 中 | 需要管道、重定向等复杂操作 |
🌟script模块
Ansible 的 script
模块用于在远程主机上执行本地脚本文件。也就是说,你可以将 Ansible 控制机(即 Ansible 运行的机器)上的一个脚本文件传输到远程主机并执行它。
📌 script
模块特点:
- 执行的是本地脚本文件(如
.sh
,.py
等) - 脚本会先被复制到远程主机的临时目录中再执行
- 支持 shell 脚本中的管道、重定向等 shell 特性(因为它本质是在 shell 中执行)
- 适合执行复杂的、多行的逻辑,尤其是你已经写好的脚本文件
✅ 基本语法:
- name: 描述任务
script: 脚本路径 参数1 参数2 ...
📚 示例 1:执行本地的 shell 脚本
假设你本地有一个脚本文件 hello.sh
:
#!/bin/bash
echo "Hello from script"
echo "Current user: $(whoami)"
Ansible Playbook 示例:
- name: 执行本地脚本到远程主机
script: hello.sh
Ansible 会自动将 hello.sh
传输到远程主机并执行它。
📚 示例 2:带参数执行脚本
脚本 greet.sh
:
#!/bin/bash
echo "Hello, $1"
Playbook 示例:
- name: 执行脚本并传递参数
script: greet.sh Alice
输出:
Hello, Alice
📌 常用参数:
chdir
:执行脚本前切换到指定目录creates
:如果指定的文件存在,则不执行脚本removes
:如果指定的文件不存在,则不执行脚本environment
:为脚本设置环境变量
📚 示例 3:在特定目录下执行脚本
- name: 切换目录执行脚本
script: hello.sh
args:
chdir: /tmp
📚 示例 4:只有文件不存在时才执行脚本
- name: 如果文件不存在则执行脚本
script: create_file.sh
args:
creates: /tmp/output.txt
📚 示例 5:设置环境变量运行脚本
脚本 print_env.sh
:
#!/bin/bash
echo "Environment: $ENV_VAR"
Playbook 示例:
- name: 执行脚本并设置环境变量
script: print_env.sh
environment:
ENV_VAR: "production"
✅ 总结对比:
模块名 | 执行内容 | 是否支持 shell 特性 | 是否推荐用于脚本文件 |
---|---|---|---|
command | 单条命令 | ❌ 不支持 | ❌ 不适合 |
shell | 单条 shell 命令 | ✅ 支持 | ❌ 不适合复杂脚本 |
script | 本地脚本文件 | ✅ 支持 | ✅ 推荐 |
🌟stat模块
Ansible 的 stat
模块用于获取远程主机上文件或目录的状态信息,类似于 Linux 中的 stat
命令。它可以检查文件是否存在、类型、权限、大小、修改时间等信息。
📌 stat
模块特点:
- 获取远程主机上的文件/目录元数据(metadata)
- 支持注册变量(register)进行后续判断
- 可以用来做条件判断(如:如果文件存在才执行某任务)
✅ 基本语法:
- name: 描述任务
stat:
src: 文件路径
📚 示例 1:获取文件状态
- name: 获取 /etc/passwd 文件的状态
stat:
src: /etc/passwd
register: file_stat
- debug:
msg: |
文件存在,大小为 {{ file_stat.stat.size }} 字节,
修改时间为 {{ file_stat.stat.mtime }}
📚 示例 2:判断文件是否存在
- name: 检查文件是否存在
stat:
src: /tmp/testfile.txt
register: file_check
- debug:
msg: "文件存在"
when: file_check.stat.exists
📚 示例 3:判断是否是目录
- name: 检查路径是否是目录
stat:
src: /var/log
register: dir_stat
- debug:
msg: "/var/log 是一个目录"
when: dir_stat.stat.isdir
📚 示例 4:获取文件权限
- 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 |
🌟file模块
Ansible 的 file
模块用于管理远程主机上的文件、目录或符号链接的属性,比如创建/删除文件、设置权限、修改所有者等。它是 Ansible 中最常用的模块之一,适用于对文件系统进行操作。
📌 file
模块主要功能:
- 创建或删除文件、目录、软链接
- 修改文件权限(mode)
- 修改文件所属用户和组(owner/group)
- 设置文件的时间戳(atime/mtime)
✅ 基本语法:
- name: 描述任务
file:
path: 文件/目录路径
state: 状态(如 touch, directory, absent, link 等)
mode: 权限模式(可选)
owner: 所有者(可选)
group: 所属组(可选)
📚 示例 1:创建一个空文件(类似 touch
)
- name: 创建一个空文件
file:
path: /tmp/testfile.txt
state: touch
📚 示例 2:创建一个目录
- 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
📚 示例 3:删除文件或目录
- name: 删除 /tmp/testfile.txt
file:
path: /tmp/testfile.txt
state: absent
⚠️ 如果是目录,会递归删除整个目录及其内容!
📚 示例 4:创建软链接(symbolic link)
- name: 创建软链接 /etc/app_config → /opt/app/config
file:
src: /opt/app/config
dest: /etc/app_config
state: link
📚 示例 5:修改文件权限和归属
- name: 修改文件权限和所有者
file:
path: /var/www/index.html
mode: '0644'
owner: apache
group: apache
📚 示例 6:设置文件时间戳
- 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 |
🌟lineinfile模块
Ansible 的 lineinfile
模块用于确保某一行内容在文件中存在或不存在。它非常适合用于修改配置文件,比如:
- 添加一行配置
- 修改某一行内容
- 删除某一行内容
它是 Ansible 中用于精细修改文件内容的常用模块之一。
📌 lineinfile
模块特点:
- 支持正则匹配,定位目标行
- 可以替换已有行,也可以在匹配行前后插入新内容
- 如果找不到匹配项,可以指定插入位置(如 EOF 或 BOF)
- 类似于
sed
命令,但更简单易用
✅ 基本语法:
- name: 描述任务
lineinfile:
path: 文件路径
regexp: '正则表达式匹配行(可选)'
line: '要设置的行内容'
state: present 或 absent(默认是 present)
📚 示例 1:确保某一行内容存在于文件中
- name: 确保 /etc/motd 中包含一行欢迎语
lineinfile:
path: /etc/motd
line: 'Welcome to the server, authorized users only.'
如果该行不存在,就会被添加到文件末尾。
📚 示例 2:修改匹配的行内容(使用正则)
- name: 修改配置文件中的端口号
lineinfile:
path: /etc/myapp.conf
regexp: '^port ='
line: 'port = 8080'
这会将类似 port = 8000
的行修改为 port = 8080
。
📚 示例 3:删除匹配的行
- name: 删除包含 'PasswordAuthentication' 的行
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PasswordAuthentication'
state: absent
📚 示例 4:如果匹配不到,则插入新行
- name: 如果找不到匹配行,则添加
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
📚 示例 5:在匹配行后插入内容
- name: 在匹配行后插入内容
lineinfile:
path: /etc/myapp.conf
regexp: '^log_level ='
insertafter: '^log_level ='
line: 'log_file = /var/log/myapp.log'
📚 示例 6:插入内容到文件开头(BOF)或结尾(EOF)
- 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 |
🌟copy模块
Ansible 的 copy
模块用于将本地或远程计算机上的文件复制到远程主机上的指定位置。它是 Ansible 中最常用的模块之一,特别适合用于部署配置文件、脚本、证书等。
📌 copy
模块特点:
- 可以复制本地文件到远程主机(最常见用法)
- 支持设置文件权限、所有者、组等属性
- 支持备份原文件(防止误操作)
- 支持内容替换(配合模板使用)
- 支持递归复制整个目录
✅ 基本语法:
- name: 描述任务
copy:
src: 本地文件路径(Ansible 控制机上的路径)
dest: 远程主机上的目标路径(必填)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
backup: yes/no(是否备份原文件)
content: 直接设置文件内容(可选,与 src 互斥)
📚 示例 1:复制本地文件到远程主机
- name: 复制本地的 index.html 到远程主机
copy:
src: /data/files/index.html
dest: /var/www/html/index.html
📚 示例 2:复制文件并设置权限和所有者
- name: 复制配置文件并设置权限和所有者
copy:
src: myapp.conf
dest: /etc/myapp.conf
owner: root
group: root
mode: '0644'
📚 示例 3:复制目录(递归复制)
- name: 复制整个目录到远程主机
copy:
src: /data/files/
dest: /opt/files/
⚠️ 注意:
src
路径结尾的/
表示复制目录内容,不带/
表示复制整个目录本身。
📚 示例 4:复制文件前备份原文件
- name: 替换配置文件并备份原文件
copy:
src: new_config.conf
dest: /etc/app/config.conf
backup: yes
如果 /etc/app/config.conf
已存在,Ansible 会先将它备份为类似 config.conf.210101.1234
的文件。
📚 示例 5:直接设置文件内容(不使用 src)
- name: 创建一个文件并写入指定内容
copy:
dest: /tmp/hello.txt
content: |
Hello from Ansible.
This file was created using the copy module.
📚 示例 6:使用变量动态生成内容
- 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 |
🌟template模块
Ansible 的 template
** 模块** 用于将本地的 Jinja2 模板文件 渲染后复制到远程主机上。它是 copy
模块的“高级版”,支持在模板中使用变量和逻辑,非常适合用来生成动态配置文件(如 Nginx 配置、系统服务配置等)。
📌 template
模块特点:
- 使用 Jinja2 模板语法(支持变量、条件判断、循环等)
- 模板文件必须放在 Ansible 控制机的
templates/
目录下 - 支持设置权限、所有者、组等属性
- 可以配合变量动态生成配置文件内容
✅ 基本语法:
- name: 描述任务
template:
src: 模板文件路径(相对于 templates 目录)
dest: 远程主机上的目标路径(必填)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
📚 示例 1:渲染并部署一个简单的 Jinja2 模板
✅ 步骤一:创建模板文件 templates/motd.j2
Welcome to {{ ansible_fqdn }}
IP Address: {{ ansible_default_ipv4.address }}
Environment: production
✅ 步骤二:Playbook 示例
- 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
📚 示例 2:带变量判断的模板
✅ 模板文件 templates/app_config.j2
# 应用配置文件
{% if environment == "prod" %}
log_level = warning
{% else %}
log_level = debug
{% endif %}
bind_address = {{ bind_ip }}
port = {{ app_port }}
✅ Playbook 示例
- 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 |
📌 小贴士:
- 模板文件通常放在 Playbook 同级目录下的
templates/
文件夹中 - Jinja2 模板文件扩展名通常是
.j2
,不是必须的,但推荐使用来区分模板与普通文件
🌟unarchive模块
Ansible 的 unarchive
** 模块** 用于在远程主机上解压归档文件(如 .tar
, .tgz
, .zip
等格式),是 Ansible 中处理压缩包的常用模块。
它支持从本地控制机或远程主机复制并解压归档文件,非常适合部署应用时使用,比如将打包好的代码上传并解压到指定目录。
📌 unarchive
模块特点:
- 支持多种格式:
.tar
,.tar.gz
,.zip
等 - 可以从本地上传并解压(类似
copy + 解压
) - 也可以直接在远程主机上解压已有压缩包
- 支持设置解压后的目标路径、权限、所有者等
✅ 基本语法:
- name: 描述任务
unarchive:
src: 本地或远程的压缩包路径
dest: 解压到的目标目录
remote_src: yes/no(是否压缩包已在远程主机上)
owner: 所有者(可选)
group: 所属组(可选)
mode: 权限模式(可选)
📚 示例 1:上传并解压本地的 tar.gz 文件到远程主机
✅ 本地有一个压缩包: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/
目录下。
📚 示例 2:解压远程主机上的 zip 文件
假设远程主机上已经存在一个压缩包:/tmp/myapp.zip
- name: 解压远程主机上的 zip 文件
unarchive:
src: /tmp/myapp.zip
dest: /var/www/myapp/
remote_src: yes # 表示压缩包已经在远程主机上
📚 示例 3:上传并解压后设置权限和归属
- name: 解压代码包并设置权限和归属
unarchive:
src: files/project.tar.gz
dest: /data/project/
owner: deploy
group: deploy
mode: '0755'
📚 示例 4:仅解压某个子目录内容(配合 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 |
🌟mount模块
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: 挂载选项(可选)
📚 示例 1:挂载一个 NFS 共享
- name: 挂载 NFS 共享到 /mnt/nfs
mount:
path: /mnt/nfs
src: nfs-server:/exports/data
fstype: nfs
opts: defaults
state: mounted
这会执行以下操作:
- 如果未挂载,则挂载 NFS 共享;
- 同时写入
/etc/fstab
,使其在重启后也生效。
📚 示例 2:仅添加 fstab 条目但不挂载
- name: 添加 NFS 到 fstab,但不立即挂载
mount:
path: /mnt/nfs
src: nfs-server:/exports/data
fstype: nfs
opts: defaults
state: present
这种方式只修改配置文件,不会实际执行挂载操作。
📚 示例 3:挂载本地硬盘分区(ext4)
- name: 挂载本地硬盘分区 /dev/sdb1 到 /mnt/data
mount:
path: /mnt/data
src: /dev/sdb1
fstype: ext4
opts: defaults,noatime
state: mounted
📚 示例 4:卸载一个挂载点
- name: 卸载 /mnt/nfs
mount:
path: /mnt/nfs
state: unmounted
此操作只会卸载当前挂载,不会删除
/etc/fstab
中的条目。
📚 示例 5:从 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 |
🌟group模块
Ansible 的 group
模块用于管理远程主机上的用户组(group)。你可以使用它来创建、删除用户组,或者设置组的 GID 等属性。
它是 Ansible 中用于用户权限管理的基础模块之一,常用于自动化部署时配置系统权限结构。
📌 group
模块特点:
- 可以创建和删除用户组
- 支持指定组的 GID(Group ID)
- 支持跨平台(支持 Linux、FreeBSD、Solaris 等)
- 不会修改已存在的组的属性(除非指定
state=absent
或gid
)
✅ 基本语法:
- name: 描述任务
group:
name: 组名(必填)
gid: 组的 GID(可选)
state: present 或 absent(默认是 present)
system: yes/no(是否为系统组)
📚 示例 1:创建一个用户组
- name: 创建名为 deploy 的用户组
group:
name: deploy
state: present
如果该组不存在,就会被创建。
📚 示例 2:创建一个指定 GID 的用户组
- name: 创建名为 dbgroup 的组,指定 GID 为 1010
group:
name: dbgroup
gid: 1010
state: present
📚 示例 3:删除一个用户组
- name: 删除名为 tempgroup 的用户组
group:
name: tempgroup
state: absent
📚 示例 4:创建一个系统组(system group)
系统组通常 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 |
🌟user模块
Ansible 的 user
模块用于管理远程主机上的用户账户,可以创建、删除用户,设置用户的主组、附加组、家目录、登录 shell 等属性。它是 Ansible 中用于系统管理和权限控制的重要模块之一。
📌 user
模块特点:
- 创建或删除用户
- 设置用户的主组和附加组
- 控制用户的登录 shell
- 设置家目录路径
- 支持设置是否为系统用户(system user)
- 可以管理用户的 SSH 密钥(通过
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(删除用户时是否同时删除家目录和邮件文件)
📚 示例 1:创建一个普通用户
- 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
组。
📚 示例 2:创建用户并指定主组和附加组
- name: 创建用户 bob,主组为 developers,附加组为 docker, www-data
user:
name: bob
group: developers
groups:
- docker
- www-data
shell: /bin/zsh
create_home: yes
📚 示例 3:删除用户并清除其家目录
- name: 删除用户 tempuser 并删除其家目录
user:
name: tempuser
state: absent
remove: yes
📚 示例 4:创建一个系统用户(system user)
系统用户通常不带家目录,适用于服务运行账户。
- name: 创建系统用户 myservice
user:
name: myservice
system: yes
shell: /sbin/nologin
create_home: no
📚 示例 5:设置用户密码(需使用加密密码)
⚠️ 注意:Ansible 不支持直接明文设置密码,必须使用加密后的密码字符串(可以通过 openssl passwd -6
生成)。
- name: 设置用户 alice 的密码
user:
name: alice
password: "{{ password|password_hash('sha512','zbl') }}"
你可以用以下命令生成 SHA-512 加密密码:
openssl passwd -6
📚 示例 6:添加用户的 SSH 公钥
- 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 |
🌟yum/apt模块
在 Ansible 中,yum
和 apt
是两个用于管理软件包的模块,分别适用于不同 Linux 发行版:
📌yum
模块(适用于 CentOS / RHEL)
✅ 用途:
用于在基于 YUM 的系统上安装、更新、卸载软件包。
📦 常见发行版:
- CentOS
- RHEL(Red Hat Enterprise Linux)
- Fedora(旧版本)
🧩 示例:
- name: 安装 Apache httpd
yum:
name: httpd
state: present
- name: 升级所有已安装的包
yum:
name: "*"
state: latest
- name: 卸载 postfix 邮件服务
yum:
name: postfix
state: absent
📌apt
模块(适用于 Ubuntu / Debian)
✅ 用途:
用于在基于 APT 的系统上安装、更新、删除软件包。
📦 常见发行版:
- Ubuntu
- Debian
⚠️ 注意:
使用 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: '*' 等) |
使用仓库 | ✅ | ✅ |
📝 推荐实践(跨平台 Playbook)
如果你希望写一个能同时支持 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 模块 |
🌟systemd模块
Ansible 的 systemd
** 模块** 用于在使用 systemd
作为初始化系统的 Linux 主机上管理服务(如启动、停止、重启服务,设置开机自启等)。它是 Ansible 中用于服务管理的核心模块之一。
📌 systemd
模块特点:
- 支持常见的服务操作:启动、停止、重启、重载
- 可设置服务是否开机自启
- 可检查服务状态(是否运行)
- 兼容大多数现代 Linux 发行版(如 CentOS 7+/RHEL 7+, Ubuntu 16.04+, Debian 8+)
✅ 基本语法:
- name: 描述任务
systemd:
name: 服务名称(如 httpd, nginx)
state: started / stopped / restarted / reloaded
enabled: yes / no(是否开机自启)
daemon_reload: yes / no(是否重新加载 systemd 配置)
📚 示例 1:启动并启用一个服务(如 Nginx)
- name: 启动并启用 Nginx 服务
systemd:
name: nginx
state: started
enabled: yes
📚 示例 2:重启服务(如 Apache)
- name: 重启 Apache 服务
systemd:
name: httpd
state: restarted
📚 示例 3:停止并禁用开机启动的服务
- name: 停止并禁用 postfix 服务
systemd:
name: postfix
state: stopped
enabled: no
📚 示例 4:仅设置开机启动但不立即启动服务
- name: 设置 MySQL 开机自启,但不启动
systemd:
name: mariadb
enabled: yes
注意:没有指定
state
参数时,只会影响enabled
状态。
📚 示例 5:先重载 systemd 再启动服务(适合新服务或配置更新后)
- 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 模块 |
🌟mysql_db/mysql_user模块
在 Ansible 中,mysql_db
和 mysql_user
是两个用于管理 MySQL 数据库和用户 的模块,非常适合自动化部署 MySQL 相关的配置。它们通常用于:
- 创建/删除数据库(
mysql_db
) - 创建/删除用户、设置权限(
mysql_user
)
✅ 前提条件:
使用这些模块前需要确保远程主机上已安装以下组件:
mysql
python3-PyMySQL
或MySQLdb
(Python MySQL 驱动)
可以通过以下命令安装依赖:
ansible -m yum -a "name=python3-PyMySQL state=present" your_host
📌mysql_user
模块
🔧 功能:
管理 MySQL 用户账户:创建、删除、授予权限、设置密码等。
✅ 示例 1:创建一个 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;
✅ 示例 2:删除一个 MySQL 用户
- name: 删除 MySQL 用户 'temp_user'
mysql_user:
login_user: root
login_password: root_password
name: temp_user
host: "localhost"
state: absent
✅ 示例 3:修改用户权限
- 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 数据库:创建、删除数据库,以及导入/导出数据。
✅ 示例 1:创建一个数据库
- name: 创建数据库 'my_database'
mysql_db:
login_user: root
login_password: root_password
name: my_database
state: present
✅ 示例 2:创建数据库并指定字符集
- name: 创建数据库并设置字符集
mysql_db:
login_user: root
login_password: root_password
name: utf8_database
encoding: utf8mb4
collation: utf8mb4_unicode_ci
state: present
✅ 示例 3:导出数据库(备份)
- name: 导出数据库到文件
mysql_db:
login_user: root
login_password: root_password
name: my_database
dump:
target: /backup/my_database.sql
✅ 示例 4:导入数据库(恢复)
- 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 模块实现 |