介绍
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参数
state=touch:文件不存在就新建空文件;存在就更新文件时间戳,同时修改权限属主state=file:文件不存在不会创建;只修改已有文件的权限、属主state=directory:创建目录,包括多级目录,可recurse递归改子文件权限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
解释
-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
登录被控机,查看 /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
登录被控机验证
执行下面命令可以运行脚本
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
例子5. 删除文件/目录(absent)
删除单个文件
ansible all -m file -a "path=/tmp/test.sh state=absent" -i ansible_client.ini -b
删除目录
注意:目录里面所有内容一并删除,慎用!
ansible all -m file -a "path=/data state=absent" -i ansible_client.ini -b
例子6. 修改已有文件权限
只修改权限,文件不存在不会自动创建
ansible all -m file -a "path=/tmp/test.txt state=file owner=root group=root mode=0644" -i ansible_client.ini -b
例子7. 创建硬链接
ansible all -m file -a "src=/tmp/test.txt path=/tmp/hardlink.txt state=hard" -i ansible_client.ini -b
常见坑 & 注意事项
- mode必须写0开头八进制:
mode=755会被当成十进制,权限错误;必须写mode=0755 recurse=yes只对目录生效,state=touch/file不能递归state=absent删除目录是递归删除,等同于rm -rf,生产环境小心- file模块不能写文件内容,如果需要写入文本,改用
copy/lineinfile - Ad-hoc幂等性:ansible模块都是幂等,重复执行不会报错,只有状态变化才触发修改