Ansible教程:Ad-hoc 命令用法-file模块详解 作者:马育民 • 2026-09-22 18:49 • 阅读:10001 # 介绍 **file模块:管理远程主机上 文件、目录、软链接 的属性** file模块**不能写入文件内容**(写内容用`copy`/`lineinfile`/`blockinfile`),只负责:创建/删除、权限、属主、链接。 # 常用参数 | 参数 | 说明 | | --- | --- | | **`path`** | **必填**,远程文件/目录路径(旧版本也可用`dest`/`name`,推荐path) | | **`state`** | 状态,核心参数: `directory`:创建目录(不存在则新建;已存在则修改属性) `touch`:创建空文件,类似touch命令 `link`:创建**软链接**,配合`src` `hard`:硬链接 `absent`:删除文件/目录/链接(递归删目录) `file`:文件必须存在,不存在不会自动创建,只修改权限 | | `src` | 源文件路径,创建软/硬链接时使用 | | `owner` | 设置属主(用户名/uid) | | `group` | 设置属组 | | `mode` | 权限,推荐八进制`0755`,**前面0不能丢**,如`mode=0644` | | `recurse` | `yes/no`,递归设置目录下所有文件权限(仅state=directory生效) | | `force` | 创建软链接时:`yes`强制覆盖已有链接;no链接已存在则不操作 | ### state参数 1. `state=touch`:文件不存在就新建空文件;存在就更新文件时间戳,同时修改权限属主 2. `state=file`:文件不存在**不会创建**;只修改已有文件的权限、属主 3. `state=directory`:创建目录,包括多级目录,可recurse递归改子文件权限 4. `state=absent`:删除,目录会递归删除里面所有内容,谨慎使用 --- # 例子1. 创建空文件 创建 `/tmp/test.txt` ``` ansible all -m file -a "path=/tmp/test.txt state=touch" -i ansible_client.ini ``` # 例子2. 创建目录 创建 `/data/logs` 目录,属主 `root`,权限 `0750`,多级目录自动创建 ``` ansible all -m file -a "path=/data/logs state=directory owner=root group=root mode=0750" -b -K ``` **解释** - `-b`:表示提权,因为设置 所属用户、用户组为 `root`,所以需要提权 - `-K`:手动输入密码,因为提权需要输入被控机密码 ### 验证被控机 登录被控机 因为 `/data` 目录的所属用户、用户组是 `root`,其他用户不能切换到该目录,要执行下面命令切换到 `root` 用户 ``` sudo -i ``` 切换到 `data` 目录: ``` cd /data ``` # 例子3. 递归修改目录及内部所有文件权限 ``` ansible all -m file -a "path=/data/logs state=directory mode=0700 recurse=yes" -i ansible_client.ini -b -K ``` 登录被控机,查看 `/data/logs` 目录,显示如下: ``` drwx------ 2 root root 4096 Sep 22 11:25 logs/ ``` # 例子4. 创建软链接(符号链接) 将 `/home/user/test.sh` 软链接到 `/tmp/link.sh` ``` ansible all -m file -a "src=/home/user/test.sh path=/tmp/link.sh state=link" -i ansible_client.ini -b -K ``` ### 登录被控机验证 执行下面命令可以运行脚本 ``` bash /tmp/link.sh ``` **注意:**不要直接运行 `/tmp/link.sh`,虽然 `link.sh` 有可执行权限,但 `test.sh` 文件可能没有可执行权限 ### force=yes:链接已存在,强制覆盖 ``` ansible all -m file -a "src=/home/user/test.sh path=/tmp/link.sh state=link force=yes" -i ansible_client.ini -b -K ``` # 例子5. 删除文件/目录(absent) ### 删除单个文件 ``` ansible all -m file -a "path=/tmp/test.sh state=absent" -i ansible_client.ini -b -K ``` ### 删除目录 **注意:**目录里面所有内容一并删除,慎用! ``` ansible all -m file -a "path=/data state=absent" -i ansible_client.ini -b -K ``` # 例子6. 修改已有文件权限 只修改权限,文件不存在不会自动创建 ``` ansible all -m file -a "path=/tmp/test.txt state=file owner=root group=root mode=0644" -i ansible_client.ini -b -K ``` # 例子7. 创建硬链接 ``` ansible all -m file -a "src=/tmp/test.txt path=/tmp/hardlink.txt state=hard" -i ansible_client.ini -b -K ``` --- # 常见坑 & 注意事项 1. **mode必须写0开头八进制**:`mode=755` 会被当成十进制,权限错误;必须写 `mode=0755` 2. `recurse=yes` **只对目录生效**,state=touch/file不能递归 3. `state=absent` 删除目录是**递归删除**,等同于`rm -rf`,生产环境小心 4. file模块**不能写文件内容**,如果需要写入文本,改用`copy`/`lineinfile` 5. Ad-hoc幂等性:ansible模块都是幂等,重复执行不会报错,只有状态变化才触发修改 原文出处:/show_1GW45yqYJPkb.html