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

主要参数

  • path 或 dest:指定要编辑的文件路径(必需参数)。
  • line:要插入或更新的文本行。
  • insertafter/insertbefore:指定插入位置,可以是文件末尾(EOF)或正则表达式匹配的位置。
  • validate:指定验证文件的命令,确保文件内容正确无误。
  • create:布尔值,如果文件不存在则创建文件。
  • state:指定行的状态,present 表示存在,absent 表示删除。
  • owner/group/mode:设置文件权限。
  • setype/seuser/selevel:设置 SELinux 属性。

示例:修改 OpenSSH 配置文件

以下是一个示例 Playbook,展示如何使用 lineinfile 模块修改 /etc/ssh/sshd_config 文件中的 PasswordAuthentication 参数。

---
- name: lineinfile module demo
  hosts: all
  become: true
  tasks:
    - name: allow password authentication
      ansible.builtin.lineinfile:
        state: present
        dest: /etc/ssh/sshd_config
        regexp: "^PasswordAuthentication"
        line: "PasswordAuthentication yes"
        validate: 'sshd -t -f %s'

参数说明

  1. dest:指定目标文件路径 /etc/ssh/sshd_config。
  2. regexp:正则表达式,用于匹配要修改的行。如果匹配到的行存在,则更新该行;如果不存在,则插入新行。
  3. line:要插入或更新的文本内容。
  4. validate:在修改文件后运行验证命令,确保配置文件格式正确。sshd -t -f %s 会检查 SSH 配置文件的语法是否正确。
  5. state:设置为 present,表示确保该行存在。

执行步骤

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

    ini [targets] demo.example.com

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

    bash ansible-playbook -i inventory lineinfile.yml

执行结果

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

PLAY [lineinfile module demo] ***********************************************

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

TASK [allow password authentication] *****************************************
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/ssh/sshd_config 文件通常需要管理员权限,因此需要使用 become: true。
  2. 验证命令:validate 参数非常有用,尤其是在修改配置文件时,可以防止因格式错误导致服务启动失败。
  3. 文件不存在:如果目标文件不存在,可以通过设置 create: yes 来创建文件。
  4. SELinux:如果目标系统启用了 SELinux,可能需要额外设置文件的 SELinux 属性。

总结

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