Ansible模块介绍——文件操作模块(下)

简介: Ansible模块介绍——文件操作模块(下)

fetch模块

拉取远程主机的文件,并以主机IP地址或者主机名为目录,并保留了原来的目录结构

  • dest参数:目标地址
  • src参数:源
  • flat参数:flat=yes不按照src的目录来创建目录,flat=no就在当前路径创建和src一样的目录路径

示例

从被管理节点上拷贝文件到控制节点!

[root@master ~]# ansible webservers -m fetch -a 'src=/etc/hosts dest=/opt'
[root@master ~]# ll /opt/
总用量 0
drwxr-xr-x. 3 root root 17 3月  3 21:25 node1.kongd.com
drwxr-xr-x. 3 root root 17 3月  3 21:25 node2.kongd.com
drwxr-xr-x. 3 root root 17 3月  3 21:25 node3.kongd.com
flat=yes 不采用默认的文件级结构
[root@master ~]# ansible node3.kongd.com -m fetch -a 'src=/etc/hosts dest=/opt/hosts flat=yes'

synchronize模块

synchronize 基于rsync命令批量同步文件做这个模块的时候,必须保证远程服务器上有rsync这个命令

  • src参数:源
  • dest参数:目标文件
  • archive参数:是否采用归档模式同步,保证源文件和目标文件属性一致
  • rsync_opts参数:使用rsync参数
  • –exclude=*.log:此处为忽略.log结尾的文件, 必须和rsync_opts使用例(rsync_opts=–exclude=.txt)
  • delete参数:删除不存在的文件,默认no
[root@master ~]# ansible all -m yum -a 'name=rsync state=present' 
如果没有rsync先安装

示例

1.将node1节点的/etc/hosts目录拉取到主控节点的/tmp目录下

[root@master ~]# ansible node1.kongd.com -m synchronize -a 'src=/etc/hosts/ dest=/tmp mode=pull' 

注意:mode默认为push,要拉取到主控节点,需要配置mode为pull

2.将本地/tmp目录内除.txt结尾的数据无差异且保持属性的同步到对端/mnt目录无差异化

[root@master ~]# ansible node1.kongd.com -m syncronize -a "src=/tmp/ dest=/mnt archive=yes delete=yes rsync_opts=--excloud=*.txt "

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.将/etc/rc.d/rc.local文件复制到/testdir目录中,以做测试。假如,我们想要在test70主机中的/testdir/rc.local文件尾部插入如下两行

systemctl start mariadb

systemctl start httpd

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd"'  
 #BEGIN  ANSIBLE MANAGED BLOCK 
 systemctl  start mariadb 
 systemctl  start httpd  
# END ANSIBLE  MANAGED BLOCK  

2.我们也可以自定义标记,但是自定义的标记仍然要"成对出现",需要有开始标记和结束标记

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} serivce to start" '  
  #BEGIN  serivce to start  
  systemctl  start mariadb  
  systemctl  start httpd  
  #END serivce  to start  

3.当文本块标记已存在,但再次编辑内容不同会覆盖原标记中的内容

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start" ' 
文本块的内容被更新为如下文本。
#BEGIN  serivce to start  
systemctl  start mariadb  
#END serivce  to start  

4.删除对应标记文本块

当文本块为空时删除对应标记文本块
 ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#{mark} serivce to start" ' 
 ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} serivce to start" state=absent'

5.将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File

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

6.如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test" insertafter=EOF'  

7.使用如下命令表示使用正则表达式匹配行,将文本块插入到 "以#!/bin/bash开头的行 " 之后

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test reg" insertafter="^#!/bin/bash" '  

8.使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳

ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test" state=absent backup=yes'  

9.使用create参数,如果指定的文件不存在,则创建它,示例如下

ansible test70 -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark} test" create=yes' 

lineinfile模块

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

  • path参数:必须参数,指定要操作的文件
  • line参数: 使用此参数指定文本内容。
  • regexp参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
  • state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present
  • backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes,backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了。backrefs=yes开启后向引用功能。
    另一个作用,使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变
  • insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • backup参数:是否在修改文件之前对文件进行备份。
  • create参数 :当要操作的文件并不存在时,是否创建对应的文件。

示例

我们使用/testdir/test文件作为被操作的文件,test文件内容如下

cat /testdir/test 
123
234
345
456

1.插入内容。 判断文件中test text内容是否存在,不存在则在文档尾插入该内容

ansible test70 -m lineinfile -a 'path=/testdir/test line="test text"' 

2.regexp支持正则符匹配可以将匹配的行进行替换,当匹配不到则在文档尾追加写入

ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^1" line="test text" ' 

3.基于正则替换行,当没有匹配到指定行则不做任何更改

ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes '  

4.匹配指定内容的行删除(若多行相同全部删除)

ansible test70 -m lineinfile -a 'path=/testdir/test line="123" state=absent'  

5.根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除

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

6.如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的"Hello ansible,Hiiii"替换成"Hiiii",如果不设置backrefs=yes,则不支持后向引用,那么"Hello ansible,Hiiii"将被替换成"\2"

ansible test70 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'  

unarchive模块

解包解压缩

  • copy参数:1.将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes 2.将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
  • remote_src参数:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
  • src参数:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
  • dest参数:远程主机上的目标路径
  • mode参数:设置解压缩后的文件权限
ansible all  -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'     
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no  mode=0777'     
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data  copy=no' 

archive模块

ansible  websrvs -m archive -a 'path=/var/log/  dest=/data/log.tar.bz2 format=bz2   o


相关文章
|
2月前
|
缓存 Shell Linux
[ansible]常用内置模块
[ansible]常用内置模块
|
3月前
|
Shell 应用服务中间件 Linux
Ansible的常用模块
Ansible的常用模块
56 6
|
3月前
|
Shell 数据安全/隐私保护
Ansible Ad-hoc,命令执行模块
Ansible Ad-hoc,命令执行模块
31 1
|
3月前
|
运维 Linux 应用服务中间件
Linux之自动化运维工具ansible、ansible模块(2)
Linux之自动化运维工具ansible、ansible模块(2)
|
3月前
|
运维 Linux Shell
Linux之自动化运维工具ansible、ansible模块(1)
Linux之自动化运维工具ansible、ansible模块(1)
|
5月前
|
算法 安全 Linux
Ansible 中的copy 复制模块应用详解
Ansible 中的copy 复制模块应用详解
307 1
|
11月前
|
网络安全 数据安全/隐私保护
ansible的get_url模块
ansible的get_url模块
121 1
|
8天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible实战应用
【9月更文挑战第24天】在现代IT基础设施的快速迭代与扩展中,自动化运维成为提升效率、保障稳定性的关键。本文将深入探讨Ansible这一流行的自动化工具,通过实际案例分析其如何简化日常运维任务,优化工作流程,并提高系统的可靠性和安全性。我们将从Ansible的基础概念入手,逐步深入到高级应用技巧,旨在为读者提供一套完整的Ansible应用解决方案。
|
14天前
|
运维 Ubuntu 应用服务中间件
自动化运维之路:Ansible实战指南
【9月更文挑战第18天】在追求效率和稳定性的今天,自动化运维已成为IT领域的热门话题。本文将引导你通过实际案例学习如何使用Ansible进行自动化配置管理、任务执行和流程编排,从而提升你的工作效率并减少人为错误。我们将从基础概念出发,逐步深入到高级应用,让你能够轻松掌握这一强大的自动化工具。
|
4天前
|
运维 持续交付 开发工具
自动化运维工具:Ansible入门教程
【8月更文挑战第60天】在现代IT运维管理中,自动化工具的使用已成为提高生产效率、减少人为错误和确保环境一致性的重要手段。本文将介绍Ansible——一款流行的开源自动化运维工具,通过其简单易学的语法和强大的功能,帮助读者快速入门并实现自动化部署和管理。我们将从Ansible的基本概念讲起,逐步深入到实际的代码示例,展示如何利用Ansible简化日常的运维任务。无论你是新手还是有经验的系统管理员,这篇文章都将为你提供实用的知识和技巧,让你轻松驾驭Ansible,开启自动化运维之旅。