blockinfile 模块是 Ansible 中一个非常实用的工具,用于在文件中插入、更新或删除多行文本块。它属于 ansible.builtin 集合,因此默认随 Ansible 一起提供,并且支持多种操作系统。

与 lineinfile 模块类似,blockinfile 模块允许你在文件中插入或更新一个文本块,并且可以通过自定义标记(marker)来标识这些内容是由 Ansible 编辑的。

主要参数

  • path 或 dest:指定要编辑的文件路径(必需参数)。
  • block 或 content:要插入或更新的多行文本块。
  • insertafter/insertbefore:指定插入位置,可以是文件末尾(EOF)或正则表达式匹配的位置。
  • validate:指定验证文件的命令,确保文件内容正确无误。
  • create:布尔值,如果文件不存在则创建文件。
  • state:指定文本块的状态,present 表示存在,absent 表示删除。
  • marker_begin/marker_end:自定义标记的开始和结束文本,默认为 # BEGIN ANSIBLE MANAGED BLOCK 和 # END ANSIBLE MANAGED BLOCK。
  • mode/owner/group:设置文件权限。
  • setype/seuser/selevel:设置 SELinux 属性。

示例:创建或更新 /etc/hosts 文件

以下是一个示例 Playbook,展示如何使用 blockinfile 模块在 /etc/hosts 文件中插入一个多行文本块。

---
- name: blockinfile module demo
  hosts: all
  become: true
  tasks:
    - name: Generate /etc/hosts file
      ansible.builtin.blockinfile:
        state: present
        dest: /etc/hosts
        content: |
          192.168.0.200 demo demo.example.com
        marker_begin: "# BEGIN ANSIBLE MANAGED BLOCK - hosts"
        marker_end: "# END ANSIBLE MANAGED BLOCK - hosts"
        validate: 'cat %s'

参数说明

  1. dest:指定目标文件路径 /etc/hosts。
  2. content:要插入或更新的多行文本块。
  3. marker_begin/marker_end:自定义标记的开始和结束文本,用于标识 Ansible 管理的文本块。
  4. validate:在修改文件后运行验证命令,确保文件内容正确无误。
  5. state:设置为 present,表示确保该文本块存在。

执行步骤

  1. 准备主机清单文件 确保你的 inventory 文件中包含了目标主机的列表。例如:

    ini [targets] demo.example.com

  2. 运行 Playbook 使用以下命令运行 Playbook:

    bash ansible-playbook -i inventory blockinfile_demo.yml

执行结果

如果任务成功执行,输出将类似于以下内容:

PLAY [blockinfile module demo] ***********************************************

TASK [Gathering Facts] ******************************************************
ok: [demo.example.com]

TASK [Generate /etc/hosts file] **********************************************
changed: [demo.example.com]

PLAY RECAP ******************************************************************
demo.example.com           : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

注意事项

  1. 权限问题:修改 /etc/hosts 文件通常需要管理员权限,因此需要使用 become: true。
  2. 验证命令:validate 参数非常有用,尤其是在修改配置文件时,可以防止因格式错误导致的问题。
  3. 文件不存在:如果目标文件不存在,可以通过设置 create: yes 来创建文件。
  4. 标记自定义:通过自定义 marker_begin 和 marker_end,你可以更清晰地标识 Ansible 管理的文本块。
  5. SELinux:如果目标系统启用了 SELinux,可能需要额外设置文件的 SELinux 属性。

总结

blockinfile 模块是一个非常强大的工具,用于在文件中插入、更新或删除多行文本块。通过灵活使用各种参数,你可以轻松地管理配置文件中的多行内容。