Ansible模块——文件属性查看,文件或目录创建和属性修改
ansible.builtin.stat
可以查看文件信息。
选项 | 类型 | 默认值 | 描述 |
path | str | null | 要检查的文件或目录的完整路径(必需)。 |
follow | bool | false | 如果是符号链接,是否跟随到目标路径上获取其状态。 |
get_attributes | bool | true | 是否返回扩展属性(如 SELinux 上的安全上下文、ACL 等),仅在底层文件系统支持时生效。 |
get_checksum | bool | true | 是否计算并返回文件的校验和。 |
checksum_algorithm | str | sha1 | 指定用于计算校验和的算法,如 |
get_mime | bool | true | 是否检测并返回文件的 MIME 类型 |
- name: Get stats of a fileansible.builtin.stat:path: /etc/foo.confregister: st
- name: Fail if the file does not belong to 'root'ansible.builtin.fail:msg: "Whoops! file ownership has changed"when: st.stat.pw_name != 'root'- name: Get stats of the FS objectansible.builtin.stat:path: /path/to/somethingregister: sym- name: Print a debug messageansible.builtin.debug:msg: "islnk isn't defined (path doesn't exist)"when: sym.stat.islnk is not defined- name: Print a debug messageansible.builtin.debug:msg: "islnk is defined (path must exist)"when: sym.stat.islnk is defined- name: Print a debug messageansible.builtin.debug:msg: "Path exists and is a symlink"when: sym.stat.islnk is defined and sym.stat.islnk- name: Print a debug messageansible.builtin.debug:msg: "Path exists and isn't a symlink"when: sym.stat.islnk is defined and sym.stat.islnk == False- name: Get stats of the FS objectansible.builtin.stat:path: /path/to/somethingregister: p
- name: Print a debug messageansible.builtin.debug:msg: "Path exists and is a directory"when: p.stat.isdir is defined and p.stat.isdir- name: Do not calculate the checksumansible.builtin.stat:path: /path/to/myhugefileget_checksum: no- name: Use sha256 to calculate the checksumansible.builtin.stat:path: /path/to/somethingchecksum_algorithm: sha256
修改文件或目录属性(或创建文件\软链接)
ansible.builtin.file
:设置文件、目录或符号链接及其目标的属性。或者,删除文件、符号链接或目录。
有些功能其他模块也能实现。
选项 | 类型 | 默认值 | 描述 |
access_time | str | null | 要设置的访问时间( |
access_time_format | str | %Y%m%d%H%M.%S | access_time 的时间格式,基于默认的 Python 格式(详见 |
attributes | str | null | 设置文件扩展属性(如 |
follow | bool | true | 如果 |
force | bool | false | 在两种情况下强制创建符号链接:源文件不存在(但稍后会出现);目标文件存在且为文件(因此,我们需要取消链接 |
group | str | null | 要设置的文件组。 |
mode | str | null | 要设置的权限模式,格式如 |
modification_time | str | null | 文件的修改时间。可设为 |
modification_time_format | str | %Y%m%d%H%M.%S | modification_time 的时间格式,基于默认 Python 格式(参见 time.strftime 文档)。 |
owner | str | null | 要设置的文件所有者。 |
path | str | null | 要操作的文件或目录路径,别名 |
recurse | bool | false | 是否递归设置目录及其子文件的权限、所有者等,仅用于目录。 |
selevel | str | null | SELinux 等级,通常用于细粒度 SELinux 策略控制。 |
serole | str | null | SELinux 角色。 |
setype | str | null | SELinux 类型。 |
seuser | str | null | SELinux 用户。 |
src | str | null | 当 |
state | str | null | 目标状态,如 |
unsafe_writes | bool | false | 避免创建临时文件后再移动,直接修改原文件。用于某些特殊场景,可能会影响原子性。 |
针对 state
补充一下:
-
如果设置为
absent
,将递归删除目录,或取消链接文件和符号链接。对于目录,若启用了diff
,在结果中会显示被删除的文件和子目录,列于path_contents
字段中。需要注意的是:如果指定的path
不存在,此状态不会导致ansible.builtin.file
任务失败,因为状态本身未发生变化。 -
如果设置为
directory
,则会创建指定目录及其所有不存在的中间父目录。从 Ansible 1.7 起,这些目录将使用指定的权限(如mode
)创建。 -
如果设置为
file
且未指定其他参数,则该任务会返回path
的当前状态而不会进行更改。如果指定了权限等参数(如mode
),且文件存在,则会修改该文件。但如果文件不存在,则不会自动创建文件。若希望在文件不存在时创建,可使用touch
状态,或改用ansible.builtin.copy
或ansible.builtin.template
模块。 -
如果设置为
hard
,将创建或更新一个硬链接,指向由src
指定的路径。 -
如果设置为
link
,将创建或更新一个符号链接(软链接),目标路径由src
指定。 -
如果设置为
touch
(Ansible 1.4 引入),将模拟命令行中的 touch 行为:若文件不存在,则创建一个空文件;若文件或目录已存在,则更新其访问时间和修改时间。 -
默认行为:如果文件已存在,默认使用该文件的当前类型。如果设置了
recurse: yes
,默认状态为directory
;否则为file
。
- name: Change file ownership, group and permissionsansible.builtin.file:path: /etc/foo.confowner: foogroup: foomode: '0644'- name: Give insecure permissions to an existing fileansible.builtin.file:path: /workowner: rootgroup: rootmode: '1777'- name: Create a symbolic linkansible.builtin.file:src: /file/to/link/todest: /path/to/symlinkowner: foogroup: foostate: link- name: Create two hard linksansible.builtin.file:src: '/tmp/{{ item.src }}'dest: '{{ item.dest }}'state: hardloop:- { src: x, dest: y }- { src: z, dest: k }- name: Touch a file, using symbolic modes to set the permissions (equivalent to 0644)ansible.builtin.file:path: /etc/foo.confstate: touchmode: u=rw,g=r,o=r- name: Touch the same file, but add/remove some permissionsansible.builtin.file:path: /etc/foo.confstate: touchmode: u+rw,g-wx,o-rwx- name: Touch again the same file, but do not change times this makes the task idempotentansible.builtin.file:path: /etc/foo.confstate: touchmode: u+rw,g-wx,o-rwxmodification_time: preserveaccess_time: preserve- name: Create a directory if it does not existansible.builtin.file:path: /etc/some_directorystate: directorymode: '0755'- name: Update modification and access time of given fileansible.builtin.file:path: /etc/some_filestate: filemodification_time: nowaccess_time: now- name: Set access time based on seconds from epoch valueansible.builtin.file:path: /etc/another_filestate: fileaccess_time: '{{ "%Y%m%d%H%M.%S" | strftime(stat_var.stat.atime) }}'- name: Recursively change ownership of a directoryansible.builtin.file:path: /etc/foostate: directoryrecurse: yesowner: foogroup: foo- name: Remove file (delete file)ansible.builtin.file:path: /etc/foo.txtstate: absent- name: Recursively remove directoryansible.builtin.file:path: /etc/foostate: absent