上一篇博客学习了ansible的copy模块和file模块。
今天来学习其他两个文件操作模块blockinfile和lineinfile模块:
blockifile:
以上是它的模块参数介绍
下面我们来具体实验:
<1>ansible test177 -m blockinfile -a 'path=/opt/testfile block="systemctl start mysqlnsystemctl start httpd"'
以上这条命令表示我们在177的opt下的testfile文件中加入了两条文字
来看一下177中是否有收到
命令中的path指明了受管主机的路径,后面的block指明了我们需要添加的文本内容
那么我们有时候想要换掉BEGIN和END后面的内容,应该使用mark,类似于这样:
ansible test177 -m blockinfile -a 'path=/opt/testfile block="systemctl start mysqlnsystemctl start httpd" marker="#{mark} serivce to start" '
ansible test177 -m blockinfile -a 'path=/opt/testfile block="systemctl start mysql" marker="#{mark} service tostart"'
这条命令相当于更新文本块中的内容而不是插入新的内容,改变后结果如下:
那么删除我们BEGIN和END中间的文本块该如何操作呢,我们执行以下命令:
ansible test177 -m blockinfile -a 'path=/opt/testfile marker="#{mark} service tostart" state=absent'
默认情况下文本的插入是先来后到,比方说我再文件里面插入了一段文字,第二次我再往里面插入不同文字的时候默认是跟在第一次的文字后面,但ansible可以指定文字插入的位置,比如说我想要插入到文件的开头:
ansible test177 -m blockinfile -a 'path=/opt/testfile block="I LOVE YOU" marker="#{mark} zhuzhu" insertbefore=BOF'
表示在testfile的开头加入zhuzhu模块,模块内容是I LOVE YOU只需要在命令后面添加‘insertbefore=BOF就行了’
那么插入到结尾,只需要添加‘insertafter=EOF’就行了
我在受管机上添加了一个简单的.sh脚本文件
ansible test177 -m blockinfile -a 'path=/opt/test.sh block="i love you" marker="#{mark} test" insertafter="^#!/bin/bash"'
以上的命令表示将test模块对应的文本i love you 加入到#!/bin/bash后面,#!/bin/bash可以换做其他任何文字,不一定是脚本文件
假设我要往文件里面插入一段文本,但是又希望源文件能有个备份,以免出现问题后有冗余的地步:
ansible test177 -m blockinfile -a 'path=/opt/test.sh marker="#{mark} test" state=absent backup=yes'
删除文件中的test模块,将源文件进行备份
备份的文件名是源文件名加备份时候的时间戳如果我想在受管主机上创建一个它原来不存在的文件,如果存在就默认不创建,顺便在里面出入一段文本:
ansible test177 -m blockinfile -a 'path=/opt/sazhuo block="lovenlove" marker="#{mark} test" create=yes'
lineinfile:
参数:
我在受管主机的文件中添加了一段这样的话
如果我想插入一行文本,且文本如果存在于这段文本中,默认不添加,
如果不存在则添加到文本的最后一行
上图中的命令表示匹配正则将ha开头的行替换成参数line中的内容,但是如果匹配超过两行,就只替换匹配到的最后一行,如果没有匹配到那就把line的内容添加到文本的最后一行
那么,如果我没有匹配到任何一行,我又不想让文件默认加到我文本的最后一行:
ansible test177 -m lineinfile -a 'path=/opt/testfile regexp="^hai" line="xixixi" backrefs=yes'
如果我想要删除文本中的某行或者一模一样的多行,我也可以正则
其他的几个参数都跟blockeinfile的相同就不一一举例了,明天继续