ansible(五)常用模块(blockinfile,lineinfile,find)之文件操作

本文深入讲解了Ansible的blockinfile、lineinfile和find模块的详细使用方法,包括参数解释及实际应用案例,如文本插入、替换、删除及文件查找。

blockinfile模块详解

blockinfile模块可以帮助我们在指定的文件中插入"一段文本",这段文本是被标记过的,换句话说就是,我们在这段文本.上做了记号,以便在以后的操作中可以通过"标记"找到这段文本,然后修改或者删除它

path参数:必须参数,指定要操作的文件。
block参数:此参数用于指定我们想要操作的那"一段文本,此参数有一个别名叫"content",使用content或block的作用是相同的
marker参数:假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,我们可以使用marker,参数自定义"标记",比如,marker=#{ mark}test这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test,没错, {mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落
state参数: state参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本"插入"到文件中,如果对应的文件中已经存在对应标记的文本,状认会更新对应段落,在执行插入操作或更新操作时,state的值为present,默认值就是present, 如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落
insertafter参数:在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾.
insertbefore参数:在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面, 可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设为BOF,表示将文本插入到文档开头。
backup参数:是否在修改文件之前对文件进行备份。
create参数:当要操作的文件并不存在时,是否创建对应的文件

(1)拷贝一个文件到实验目录
在这里插入图片描述
(2)在文件末尾添加内容
在这里插入图片描述
查看
在这里插入图片描述
自定义标记
在这里插入图片描述
查看
在这里插入图片描述
再次执行
在这里插入图片描述
改变添加的内容时
在这里插入图片描述
在这里插入图片描述
(3)删除添加自定义的内容

在这里插入图片描述
查看
在这里插入图片描述
(4)在文件开头添加内容
在这里插入图片描述
查看
在这里插入图片描述
(5)匹配正则表达式添加内容
在这里插入图片描述
查看
在这里插入图片描述
(6)标记不变,改变标记里面的内容并备份
在这里插入图片描述
查看
在这里插入图片描述
(7)创建不存在的文件
在这里插入图片描述
查看
在这里插入图片描述

lineinfile模块详解

我们可以借助lineinfile模块,确保"某一行文本"存在于指定的文件中,或者确保从文件中删除指定的"文本" (即确保指定的文本不存在于文件中),还可以根据正则表达式,替换"某一行文本"。

path参数:必须参数,指定要操作的文件。
line参数:使用此参数指定文本内容。
regexp参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state参数:当想要删除对应的文本时,需要将state参数的值设置为absent, absent为缺席之意,表示删除, .state的积认值为present
insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾
insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值 可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾
backup参数:是否在修改文件之前对文件进行备份。
create参数:当要操作的文件并不存在时,是否创建对应的文件。

(1)在远程主机上写一个实验文件
在这里插入图片描述
(2)如果文件内容有nice man则不变,如果没有则添加到文件末尾

在这里插入图片描述
查看
在这里插入图片描述
(3)替换
使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换
在这里插入图片描述
查看
在这里插入图片描述
(4)删除
当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
在这里插入图片描述
删除以line开头的行
在这里插入图片描述
查看
在这里插入图片描述

find模块详解

find模块可以班帮助我们再远程主机中查找符合条件的文件,就像find命令-样

paths参数:必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths。
recurse参数:默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。
hidden参数:默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时, 才会查找隐藏文件。
file_ type参数:状认情 况下,ansible只会根据条件查找"文件",并不会查找"目录"或"软链接"等文件类型,如果想要指定查找的文件类型,可以通过file_ type指定文件类型,可指定的文件类型有any、directory、 file、 link 四种。
patterns参数:使用此参数指定需要查找的文件名称,支持使用shell (比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_ regex参数的值设置为yes。
use_ regex参数:默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_ regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式。
contains参数:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。
age参数:使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比,比如,如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置tage=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、 时(h)、天(d)、 星期(w)。
age_ stamp参数:文件的时间属性中有三个时间种类,atime、ctime、 mtime, 当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准。
size参数:使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置size=3m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b。
get_ checksum参数:当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长

(1)根据文章内容查找文件
在远程主机写一个文件
在这里插入图片描述
在ansible主机查找
在这里插入图片描述
(2)递归查找文件
在远程主机再写一个文件
在这里插入图片描述
在ansible主机查找
在这里插入图片描述
在这里插入图片描述
(3)查找隐藏文件
远程主机建立隐藏文件
在这里插入图片描述
在ansible主机查找以.sh结尾的文件包括隐藏文件
在这里插入图片描述
(4)查找所有类型包括隐藏文件
远程主机建立隐藏目录
在这里插入图片描述
ansible主机查找
在这里插入图片描述
在这里插入图片描述

(5)正则表达式查找
在这里插入图片描述
(6)查找四天以内的文件
默认为mtime
在这里插入图片描述
(7)查找atime在两周以内的文件
在这里插入图片描述
(8)查找大于2g的文件
在这里插入图片描述
(9)查找文件并返回sha1验证码
在这里插入图片描述

<think>好的,用户想要了解Ansiblelineinfile模块,我需要先回忆这个模块的主要功能和常见用法。首先,lineinfile模块用于在文件中精确管理某一行内容,比如修改、添加或删除特定行。应该先介绍它的基本用途,再详细说明常用参数。 记得参数有path(文件路径)、regexp(正则表达式匹配行)、line(要插入或替换的内容)、state(absent或present)等。还要提醒用户注意备份功能,使用backup参数。可能需要举几个例子,比如修改SSH配置中的PermitRootLogin,或者确保某行存在,删除某行等。 用户可能对正则表达式部分不太熟悉,需要解释清楚如何正确使用regexp来匹配目标行。同时,state参数的作用也很重要,特别是当需要删除行时,state要设为absent。此外,插入的位置问题,比如after和before参数的使用,可能需要提及,但也要说明默认行为是替换匹配行。 需要注意常见误区,比如重复执行任务是否会导致多次添加,这时候需要结合regexp来避免。另外,处理多行匹配时,lineinfile只会影响最后一个匹配的行,这可能是个限制,这时候可能需要使用replace模块。 最后,总结适用场景,强调lineinfile适合单行操作,复杂情况用其他模块。确保示例正确,语法符合LaTeX要求,行内公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,不过仍需检查是否有需要格式化的地方。使用中文,结构清晰,分步骤说明,确保用户能一步步理解。</think>Ansible的`lineinfile`模块是用于精确管理文件中单行内容的常用工具。以下从功能原理、参数解析、使用场景和示例四个层面逐步说明: $$ \text{核心功能} = \begin{cases} \text{行存在性管理} \\ \text{行内容替换} \\ \text{行删除操作} \end{cases} $$ ### 一、关键参数解析 1. **`path`**(必填) 目标文件路径,例:`path: /etc/ssh/sshd_config` 2. **`regexp`** 使用正则表达式匹配目标行,例: `regexp: '^Port\s'` 匹配以Port开头的行 3. **`line`** 要插入/替换的内容,例: `line: 'Port 2222'` 4. **`state`** - `present`(默认):确保行存在 - `absent`:删除匹配行 5. **`backup`** 创建备份文件(带`.bak`后缀),建议设置为`yes` ### 二、典型场景示例 #### 场景1:修改配置参数 ```yaml - name: 修改SSH端口 ansible.builtin.lineinfile: path: /etc/ssh/sshd_config regexp: '^#?Port\s+' line: 'Port 2222' backup: yes ``` *执行逻辑*: $$ \text{匹配模式} \rightarrow \begin{cases} \text{存在Port行} & \Rightarrow \text{替换为Port 2222} \\ \text{不存在} & \Rightarrow \text{文件末尾追加} \end{cases} $$ #### 场景2:删除特定行 ```yaml - name: 移除过期DNS配置 ansible.builtin.lineinfile: path: /etc/resolv.conf regexp: '^nameserver 8.8.8.8' state: absent ``` #### 场景3:精确插入行 ```yaml - name: 添加环境变量 ansible.builtin.lineinfile: path: /etc/environment regexp: '^JAVA_HOME=' line: 'JAVA_HOME=/usr/lib/jvm/java-11-openjdk' insertafter: '^PATH=' ``` ### 三、注意事项 1. **幂等性问题** 通过`regexp`确保操作不会重复执行,例如添加内容前先检查是否已存在 2. **多行处理限制** 该模块每次仅处理最后一个匹配行,需处理多行时建议改用`replace`模块 3. **行定位技巧** 使用`insertafter`/`insertbefore`控制插入位置,例如: `insertafter: EOF` 表示文件末尾插入 ### 四、适用边界 - ✅ 单行内容的精确管理 - ❌ 多行内容操作(建议使用`blockinfile`) - ❌ 复杂格式修改(建议使用`template`模块) 通过合理运用正则表达式和状态控制,`lineinfile`能高效完成90%的单行配置管理需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值