Ansible文件模块的教程

474 阅读4分钟

Ansible是一个令人难以置信的自动化工具,它包含了管理远程主机的功能和工具。它通过实现模块来执行特定的任务和操作。

Ansible中的一个实用模块是 文件模块.这个模块负责执行创建文件和目录、删除文件和目录、创建软、硬符号链接、添加和修改文件和目录权限等任务。

本指南将引导你了解如何使用Ansible文件模块。我们将使用一系列的例子和玩法来说明这一点。

注意:确保你能访问Ansible的清单文件中指定的远程主机。

Ansible文件模块如何工作

Ansible.buildin.file模块作为ansible-core的一部分存在于默认的ansible安装中。Ansible建议使用 "完全合格的名称 "而不是简短的模块名称来引用该模块,以避免与类似名称的模块冲突。

文件模块包含一系列用于文件管理的预定义参数。我们使用这些参数来配置在远程主机上执行的操作。

以下是你可以使用的重要参数。

  1. Owner:拥有创建的文件和目录的用户的用户名
  2. Path:要管理的文件或目录的路径
  3. Mode:在指定的文件或目录上设置的许可模式。在一对单引号内使用八进制符号。
  4. Group:为文件或目录设置组的所有权
  5. Force:一个布尔值,用来强制创建符号链接,如果源文件当前不可用(但以后添加)或目标符号链接已经存在。
  6. 跟随:如果文件系统链接存在,则跟随它们。
  7. Attributes:为指定的文件或目录设置属性。类似于Linux中默认的chattr工具
  8. 状态:定义了文件创建的背景。可接受的选项包括。
    1. 触摸:创建一个空文件
    2. 目录:创建一个目录
    3. :创建一个硬链接
    4. 链接:创建一个软链接
    5. Absent:递归删除文件和目录,取消链接。

检查ansible文件模块的文档 ,了解其他预定义的参数。

学习如何使用Ansible文件模块的最好方法是通过实例。

Ansible文件模块。实例:

注意:本指南假设你有一个Ansible控制节点和你的目标主机添加到库存文件中。

如何创建一个空文件

为了使用ansible文件模块创建一个空文件,我们将状态设置为触摸,如playbook中所示。

---
- hosts: all
  tasks:
  - name: create empty file
    file:
      path: $HOME/touch_file
      state: touch

上面的playbook包含了基本的ansible配置。

  1. host:设置运行playbook的远程目标主机。你可以定义一组远程主机或单个主机。
  2. tasks:告诉Ansible在远程主机上运行指定的任务。
  3. name:指定要运行的任务的名称。
  4. file:调用Ansible的文件模块
  5. path:在远程机器上定义一个创建文件的路径。
  6. 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条目。

  1. {{项}}:告诉Ansible为指定的文件创建一个唯一的路径。
  2. 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中的模块和参数是。

  1. copy:涉及到ansible copy模块。
  2. dest:文件的目标路径
  3. 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 }}}。

  1. 使用八进制符号来指定权限,包括前面的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文件模块。