Ansible教程:Ad-hoc 命令用法-file模块详解

介绍

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

解释

  • -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

常见坑 & 注意事项

  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