Ansible是一个令人难以置信的自动化工具,它包含了管理远程主机的功能和工具。它通过实现模块来执行特定的任务和操作。
Ansible中的一个实用模块是 文件模块.这个模块负责执行创建文件和目录、删除文件和目录、创建软、硬符号链接、添加和修改文件和目录权限等任务。
本指南将引导你了解如何使用Ansible文件模块。我们将使用一系列的例子和玩法来说明这一点。
注意:确保你能访问Ansible的清单文件中指定的远程主机。
Ansible文件模块如何工作
Ansible.buildin.file模块作为ansible-core的一部分存在于默认的ansible安装中。Ansible建议使用 "完全合格的名称 "而不是简短的模块名称来引用该模块,以避免与类似名称的模块冲突。
文件模块包含一系列用于文件管理的预定义参数。我们使用这些参数来配置在远程主机上执行的操作。
以下是你可以使用的重要参数。
- Owner:拥有创建的文件和目录的用户的用户名
- Path:要管理的文件或目录的路径
- Mode:在指定的文件或目录上设置的许可模式。在一对单引号内使用八进制符号。
- Group:为文件或目录设置组的所有权
- Force:一个布尔值,用来强制创建符号链接,如果源文件当前不可用(但以后添加)或目标符号链接已经存在。
- 跟随:如果文件系统链接存在,则跟随它们。
- Attributes:为指定的文件或目录设置属性。类似于Linux中默认的chattr工具
- 状态:定义了文件创建的背景。可接受的选项包括。
- 触摸:创建一个空文件
- 目录:创建一个目录
- 硬:创建一个硬链接
- 链接:创建一个软链接
- Absent:递归删除文件和目录,取消链接。
检查ansible文件模块的文档 ,了解其他预定义的参数。
学习如何使用Ansible文件模块的最好方法是通过实例。
Ansible文件模块。实例:
注意:本指南假设你有一个Ansible控制节点和你的目标主机添加到库存文件中。
如何创建一个空文件
为了使用ansible文件模块创建一个空文件,我们将状态设置为触摸,如playbook中所示。
---
- hosts: all
tasks:
- name: create empty file
file:
path: $HOME/touch_file
state: touch

上面的playbook包含了基本的ansible配置。
- host:设置运行playbook的远程目标主机。你可以定义一组远程主机或单个主机。
- tasks:告诉Ansible在远程主机上运行指定的任务。
- name:指定要运行的任务的名称。
- file:调用Ansible的文件模块
- path:在远程机器上定义一个创建文件的路径。
- state:使用touch创建一个空文件。
保存playbook并在远程主机上执行它。
ansible-playbook emptyfile.yml

如何创建多个文件
Ansible允许你在一个任务中创建多个文件。下面是一个游戏手册的例子。
---
- hosts: all
tasks:
- name: create multiple files
file:
path: $HOME/{{ item }}
state: touch
with_items:
- file1.c
- header.h
- file2.py
- file3.txt
- file4.rb

在playbook中,我们利用了两个ansible条目。
- {{项}}:告诉Ansible为指定的文件创建一个唯一的路径。
- with_item:创建一个要在远程主机上创建的文件列表。你可以添加你认为合适的许多文件和扩展名。
运行ansible-playbook来创建指定的多个文件。
ansible-playbook multiplefiles.yml

如何创建一个有内容的文件
在上面的例子中,我们使用touch命令创建空文件。要创建一个有内容的文件,我们可以使用复制模块,并将内容参数设置为文件的内容。
下面是一个例子的游戏手册。
---
- hosts: all
tasks:
- name: create file with contents
copy:
dest: $HOME/hello.cpp
content: |
#include
using namespace std
int main () {
cout << "hello world" << endl;
return 0;
}
上述playbook中的模块和参数是。
- copy:涉及到ansible copy模块。
- dest:文件的目标路径
- content:要添加到你的文件中的内容。每一行都被添加到一个新的行中。

运行该游戏手册。
ansible-playbook withcontent.yml

如何创建一个目录
用于使用Ansible文件模块创建目录的playbook与创建一个空文件类似。但是,如下图所示,我们将状态设置为 "目录 "而不是 "文件"。
---
- hosts: all
tasks:
- name: createadirectory
file:
path: $HOME/ansible-dir
state: directory
如何删除一个文件或符号链接
删除文件、目录或符号链接是非常直接的,我们所要做的就是把状态设置为不存在,如下面的游戏手册所示。
---
- hosts: all
tasks:
- name: removefiles
file:
path: $HOME/ansible-dir
state: absent
如果指定的文件不存在,该游戏手册将不做任何事情。
如何改变一个目录的权限
我们使用 playbook 的所有者、组和模式参数来改变一个目录的权限。
下面的例子将设置目录上的指定权限。
---
- hosts: all
become: true
tasks:
- name: modifydirpermissions
file:
path: /var/log
state: directory
owner: root
group: root
mode: 0755
在上面的例子中,我们设置了成为:真。这在为其他用户设置权限时是必要的,除了{{ ansible_user }}}。
- 使用八进制符号来指定权限,包括前面的0。
使用符号模式
Ansible允许你用符号模式而不是八进制格式来设置权限。下面的模式等同于0777。
---
- hosts: all
become: true
tasks:
- name: modifydirpermissions in symbolic format
file:
path: /var/log/
state: directory
mode: u=rwx,g=rwx,o=rwx
注意:为/var/log这样的目录设置0777并不是最好的做法,我们在这里使用它只是为了说明问题。
递归地改变目录权限
如果你想递归地改变一个目录的权限,你可以使用递归参数,如下面的游戏手册中所示。
---
- hosts: all
become: true
tasks:
- name: modifydirpermissionsrecursively
file:
path: /var/log/
state: directory
owner: root
group: root
mode: 0755
recurse: true
设置recurse: true将影响指定的父目录内的文件。
如何创建一个符号链接
使用Ansible文件模块创建符号链接,就像创建一个空目录一样简单。在这种情况下,我们把状态设置为链接,如下面的例子playbook中所示。
---
- hosts: all
- become: true
tasks:
- name: createasymlink
file:
src: $HOME/src_file
dest: /etc/dest_symlink
state: link
如何删除一个符号链接
删除一个符号链接与删除一个普通文件类似。
---
- hosts: all
- become: true
tasks:
- name: removeasymlink
file:
path: /etc/dest_symlink
state: absent
如何修改访问时间
你可以使用 access_time 和 modification_time 参数修改访问和修改时间。
例子游戏手册:
- become: true
tasks:
- name: modifyaccessandmodifiedtime
file:
path: /etc/ansible/hosts
state: file
access_time: now
modification_time: "202110041123.11"
我们使用 now 函数将 access_time 设置为当前时间。
你也可以为access_time和modification_time参数提供时间,格式是(作为一个字符串)。
YYYYmmddHHMM.SS
总结
本指南帮助你了解如何在playbook中使用Ansible文件模块。