自动化运维---ansible常用模块之文件操作(file&blockinfile&lineinfile模块)

自动化运维—ansible常用模块之文件操作(file&blockinfile&lineinfile模块)

1.file模块

file模块功能

file模块可以帮助我们完成一些对文件的基本操作, 比如:创建文件或目录、删除文件或目录、修改文件权限等

file模块参数

  • path参数:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以

  • state参数:此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径。
    假设:我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从"/testdir/a/b"这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录。所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,"directory"为目录之意, 当它与path结合,ansible就能知道我们要操作的目标是一个目录,同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch,当我们想要创建软链接文件时,需将state设为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,“absent” 为缺席之意,当我们想让操作的目标"缺席"时,就表示我们想要删除目标。

  • src参数:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源

  • force参数:当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况:
    情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。
    情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。
    情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。

  • owner参数:用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。

  • group参数:用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。

  • mode参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置t为rw-r-x---,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700

  • recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性

file模块应用

在远程主机中创建文件:

ansible testB -m file -a "path=/testdir/westos state=touch"

发现报错,这是因为远程主机中没有/testdir目录,创建该目录

ansible testB -m file -a "path=/testdir/westos state=touch"

在这里插入图片描述
在这里插入图片描述
当远程主机中存在要创建的文件时,与copy不同的是,它会修改文件的时间戳:

ansible testB -m file -a "path=/testdir/westos state=touch"

在这里插入图片描述
在远程主机中创建目录:

ansible testB -m file -a "path=/testdir/westosdir state=directory"

在这里插入图片描述
在这里插入图片描述
当远程主机中存在要创建的目录时,与上一步中创建文件不同的是,它不进行改变:

ansible testB -m file -a "path=/testdir/westosdir state=directory"

在这里插入图片描述
在这里插入图片描述
在远程主机中制作软链接:

ansible testB -m file -a "path=/testdir/linkwestos state=link src=/testdir/westos"

在这里插入图片描述
在这里插入图片描述
在远程主机中制作硬链接:

ansible testB -m file -a "path=/testdir/hardwestos state=hard src=/testdir/westos"

在这里插入图片描述
在这里插入图片描述
当要软链接的文件不存在时,会报错:

ansible testB -m file -a "path=/testdir/linkwestos state=link src=/testdir/westos-yy"

在这里插入图片描述
此时我们可以使用force参数来强制链接:

ansible testB -m file -a "path=/testdir/linkwestos state=link src=/testdir/westos-yy force=yes"

它虽然可以链接成功,但会有警告
在这里插入图片描述
在这里插入图片描述

删除远程主机中的文件:

ansible testB -m file -a "path=/testdir/linkwestos state=absent"

在这里插入图片描述
在这里插入图片描述
创建文件并指定所有人:

ansible testB -m file -a "path=/testdir/a state=touch owner=nigar"

在这里插入图片描述
在这里插入图片描述
创建文件并指定所属组:

ansible testB -m file -a "path=/testdir/b state=touch group=nigar"

在这里插入图片描述
在这里插入图片描述
当文件存在时指定所属组,不仅会修改所属组,还会修改文件的时间戳:

ansible testB -m file -a "path=/testdir/a state=touch group=nigar"

在这里插入图片描述
创建目录并指定所属组:

ansible testB -m file -a "path=/testdir/c state=directory group=nigar"

在这里插入图片描述
在这里插入图片描述
当目录存在时指定所有人,会修改所属组,但不会修改时间戳:

ansible testB -m file -a "path=/testdir/c state=directory owner=nigar"

在这里插入图片描述
在这里插入图片描述
修改目录权限:

ansible testB -m file -a "path=/testdir/c mode=666"

在这里插入图片描述
在这里插入图片描述
修改文件权限:

ansible testB -m file -a "path=/testdir/d state=touch"
ansible testB -m file -a "path=/testdir/d mode=4700"

在这里插入图片描述
在这里插入图片描述
递归创建目录:

ansible testB -m file -a "path=/testdir/1/2 state=directory owner=nigar group=nigar recurse=yes"

在这里插入图片描述
在这里插入图片描述

2.blockinfile模块

blockinfile模块功能

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

blockinfile模块参数

  • path参数:必须参数,指定要操作的文件。

  • block参数:此参数用于指定我们想要操作的那一段文本
    此参数有一个别名叫"content",使用content或block的作用是相同的

  • marker参数:假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,个结束标记,默认情况下,开始标记为# BEGINANSIBLE MANAGED BLOCK,结束标记为#ENDANSIBLE 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参数:当要操作的文件并不存在时,是否创建对应的文件

blockinfile模块应用

首先我们拷贝一个文档作为测试:

cd /testdir
cp /etc/rc.d/rc.local .

在这里插入图片描述
默认插入到文档末尾:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="systemctl start nsf\nsystemctl start httpd"'

注意:# BEGIN ANSIBLE MANAGED BLOCK# END ANSIBLE MANAGED BLOCK为标记文本
在这里插入图片描述
在这里插入图片描述
自定义标记文本:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="systemctl start nsf\nsystemctl start httpd" marker="{mark} service to start!"'

在这里插入图片描述
插入成功,是因为虽然插入的内容相同,但标记文本不同,所以ansible认为它是不同的两段文本
在这里插入图片描述
当文档中存在标记文本相同且内容相同的文本时,再次执行插入命令,不会做更新:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="systemctl start nsf\nsystemctl start httpd" marker="{mark} service to start!"'

在这里插入图片描述

block=""删除指定标记文本中的文本内容:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="" marker="{mark} service to start!"'

在这里插入图片描述
在这里插入图片描述
state=absent删除指定标记文本中的文本内容:

ansible testB -m blockinfile -a 'path=/testdir/rc.local marker="{mark} service to start!" state=absent'

此时因为上一步骤删除过了,所以不会执行操作,但作用和上一个作用相同
在这里插入图片描述
insertbefore=BOF插入文本到文档开头:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####blockinfile####test####" marker="{mark} test!!" insertbefore=BOF'

在这里插入图片描述
在这里插入图片描述
当文档中存在标记文本相同但插入内容不相同的文本时,再次执行插入命令,会在原来的文本上做更新:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" insertbefore=BOF'

在这里插入图片描述
在这里插入图片描述
使用正则表达式指定插入位置:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" state=absent'	#先删除刚才插入的文本

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" insertafter="^#!/bin/bash"'	#插入到以#!/bin/bash开头的行后面

在这里插入图片描述
在这里插入图片描述
当插入内容与文本内容不同时,在做更新之前,备份:

ansible testB -m blockinfile -a 'path=/testdir/rc.local block="@@@@change@@@@" marker="{mark} test!!" insertafter="^#!/bin/bash" backup=yes'

在这里插入图片描述
当要操作的文件不存在时,使用create=yes参数建立文件(不使用会报错):

ansible testB -m blockinfile -a 'path=/testdir/test block="$$$test$$$" marker="{mark} test!!" insertafter="^#!/bin/bash" create=yes'

在这里插入图片描述
在这里插入图片描述

3.lineinfile模块

lineinfile模块功能

我们可以借助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参数:当要操作的文件并不存在时,是否创建对应的文件。

lineinfile模块应用

首先在远程主机中准备一个测试文档:
在这里插入图片描述
使用line参数默认插入到文件末尾:

ansible testB -m lineinfile -a 'path=/testdir/test line="@@test@@"'

删除:

ansible testB -m lineinfile -a 'path=/testdir/test line="@@test@@" state=absent'

在这里插入图片描述
在这里插入图片描述
使用regexp参数替换文本时,当有多行文本都能被匹配,只有最后被匹配到的行才会被替换:

ansible testB -m lineinfile -a 'path=/testdir/test regexp="^line" line="##test##"'

在这里插入图片描述
在这里插入图片描述
使用regexp参数删除文本时,当有多行文本都能被匹配,这些行都会被删除:

ansible testB -m lineinfile -a 'path=/testdir/test regexp="^line" state=absent'

在这里插入图片描述
在这里插入图片描述
使用insertafter插入文本到指定行后:

ansible testB -m lineinfile -a 'path=/testdir/test insertafter="^#" line="insert test"'

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ansibleblockinfile模块可以帮助我们在指定的文件中插入一段文本,并且这段文本会被标记。换句话说,我们可以通过这个标记在以后的操作中找到这段文本,并进行修改或删除。 在使用blockinfile模块时,我们可以指定要插入的文本、要插入的文件路径以及标记的名称。通过这个模块,我们可以方便地对文件进行修改并维护配置。 举个例子,假设我们有一个远程主机和一个Ansible主机。我们想要在远程主机的某个文件中插入一段文本,并在以后的操作中能够找到这段文本进行修改。我们可以使用blockinfile模块,在Ansible主机上编写一个Playbook来实现这个功能。 首先,我们可以在Playbook中定义一个任务,使用blockinfile模块来插入文本。我们可以指定要插入的文本、要插入的文件路径以及标记的名称。接着,我们可以执行这个Playbook,Ansible会连接到远程主机并执行任务。 在执行过程中,Ansible会在指定的文件中找到标记,并将要插入的文本插入到标记所在的位置。这样,我们就可以通过标记来定位并修改这段文本。 总结起来,Ansibleblockinfile模块可以帮助我们在指定的文件中插入一段文本,并通过标记来定位和修改这段文本。这个模块在维护配置文件和进行文件操作时非常有用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ansible(五)常用模块blockinfilelineinfile,find)之文件操作](https://blog.csdn.net/AaNiceMan/article/details/105094805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [ansible-tower 3.8.6 authorization](https://download.csdn.net/download/hanzheng260561728/85452491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值