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'
参数说明
dest:指定目标文件路径/etc/ssh/sshd_config。regexp:正则表达式,用于匹配要修改的行。如果匹配到的行存在,则更新该行;如果不存在,则插入新行。line:要插入或更新的文本内容。validate:在修改文件后运行验证命令,确保配置文件格式正确。sshd -t -f %s会检查 SSH 配置文件的语法是否正确。state:设置为present,表示确保该行存在。
执行步骤
-
准备主机清单文件 确保你的
inventory文件中包含了目标主机的列表。例如:ini [targets] demo.example.com -
运行 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
注意事项
- 权限问题:修改
/etc/ssh/sshd_config文件通常需要管理员权限,因此需要使用become: true。 - 验证命令:
validate参数非常有用,尤其是在修改配置文件时,可以防止因格式错误导致服务启动失败。 - 文件不存在:如果目标文件不存在,可以通过设置
create: yes来创建文件。 - SELinux:如果目标系统启用了 SELinux,可能需要额外设置文件的 SELinux 属性。
总结
lineinfile 模块是一个非常强大的工具,用于在文件中插入、更新或删除单行文本。通过灵活使用各种参数,你可以轻松地管理配置文件中的参数。