初识ansible—— ansible基础及ad-hoc常用模块的使用

一、介绍

1.定义

    ansible是一种新出现的自动化运维工具,是基于python开发的,集合了众多运维工具的优点,包括puppet、chef、func、fabric,实现了批量系统配置,批量程序部署,批量运行命令等功能。
    ansible是基于 paramiko(框架) 开发的,并且是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供了一种框架。
    ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

2.优点

① 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,没有agent。
② 默认使用SSH协议对设备进行管理。
③ 使用python编写,维护更加简单
④ 支持API及自定义模块,可通过Python轻松扩展。
⑤ 配置简单、功能强大、扩展性强。
⑥ 通过Playbooks(剧本)来定制强大的配置、状态管理。
⑦ 轻量级,无需在客户端上安装agent,更新时,只需要在操作机上进行一次更新即可。
⑧ ansible是一致性,高可靠性,安全性设计的轻量级自动化工具。
⑨ 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;使用python编写,维护更简单,支持sudo。

3.任务执行模式

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:
    ad-hoc(点对点)模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
    playbook(剧本)模式:是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。

4.ansible命令执行过程

① 加载自己的配置文件 默认/etc/ansible/ansible.cfg
② 查找对应的主机配置文件,找到要执行的主机或者组
③ 加载自己对应的模块文件,如command
④ 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器端
⑤ 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
⑥ 给文件+x执行
⑦ 执行并返回结果
⑧ 删除临时py文件,sleep 0退出

在这里插入图片描述

二、安装

ansible安装常用两种方式,yum安装和pip程序安装
(1)使用yum安装
yum -y install epel-release
yum -y install ansible

(2)使用pip安装
pip install ansible 如果没pip,需先安装pip.yum可直接安装:
yum install python-pip
pip install ansible

三、使用前配置

ansible配置公私钥
    配置ansible使用公钥验证,虽然ansible支持其他主机验证方式,但是我们最常用的还是基于私钥的认证。

配置步骤:

1.首先在ansible主机端生成密钥
ssh-keygen    #如果没有特别的要求执行命令之后一直按回车就好
2.向受控制的机器分发公钥
ssh-copy-id 用户@受控制的主机ip

四、配置

ansible程序结构

配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/

ansible配置文件
1.ansible.cfg的配置
[defaults]

inventory:这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。实例:
inventory = /etc/ansible/hosts

remote_user:指定远程被管理主机的用户,实例:
remote_user = ops

roles_path:指定role存放的路径,实例:
roles_path = /etc/ansible/roles

forks:设置默认情况下Ansible最多能有多少个进程同时工作, 从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是 50或100。默认值5是非常保守的值,实例:
forks = 5

remote_port:这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是 不需要修改的。实例:
remote_port = 22

host_key_checking:设置是否检查SSH主机的密钥。可以设置为True或False,关闭后第一次连接没有提示。实例:
host_key_checking = False

timeout:设置SSH连接的超时间隔,单位是秒。实例:
timeout = 60

log_path:Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。实例:
log_path = /var/log/ansible.log
另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录

[privilege_escalation]

become = True      #是否切换用户
become_method = sudo    #如何切换用户
become_user = root    #切换成什么用户
become_ask_pass = False    #sudo时是否需要输入密码

2.hosts的配置
定义hosts 有3类:
① Ex 1:未分组的主机,在任何组头之前指定
② Ex 2:有组的主机,一组属于"webservers"组的主机
③ Ex 3:和数据库有关的,"dbservers"组中的数据库服务器集合

1.可以直接指明主机地址或域名
test1.example.com
test2.example.com
192.168.1.2
192.168.1.3

2.定义一个主机组[组名]把地址或主机名加进去
[web]
192.168.1.2
192.168.1.3

五、命令

命令 功能
/usr/bin/ansible Ansibe AD-Hoc临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc Ansible 模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台,基于网络的,也可以去github 上找自己想要的模板
/usr/bin/ansible-playbook Ansible定制自动化的任务集编排工具,执行playbook剧本
/usr/bin/ansible-pull Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault Ansible文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可与用户交互的命令执行工具

ansible命令
命令格式:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern> 主机模式,可以是一个主机组名,也可以是单个主机,指定哪些需要操作的主机给ansible进行连接
[-f forks] 指定要使用的并行进程数,默认值为5
[-m module_name] 指定使用的模块名,例如:-m command
[-a args] -a后面加模块的参数,假设行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等 module arguments 模块参数

其他ansible的命令参数可以执行命令ansible -h查看
例如:
-C, --check don’t make any changes; instead, try to predict some of the changes that may occur 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化

ansible-doc命令

命令:ansible-doc
参数:
  
-h, --help show this help message and exit # 显示命令参数API文档
  
-l, --list List available modules #列出可用的模块
  
-M MODULE_PATH, --module-path=MODULE_PATH #指定模块的路径specify path(s) to module library (default=None)
  
-s, --snippet Show playbook snippet for specified module(s) #显示playbook制定模块的用法
  
–version show program’s version number and exit # 显示ansible-doc的版本号查看模块列表:
  
一般用法:
ansible-doc -l 获取模块信息
ansible-doc -s MOD_NAME 获取指定模块的使用帮助

六、ad-hoc(点对点)模块使用

Ansible ad-hoc是一种通过命令行批量管理的方式,命令基本格式如下:
格式:ansible 主机集合 -m 模块名 -a "参数"
其他参数:-k使用密码远程
如:ansible -k all -m ping

1.设置hosts远程被控制主机
定义一个web组,将被控住的主机的ip添加到组里面
[root@test1 ~]# cd /etc/ansible/
[root@test1 /etc/ansible]# vim hosts
在这里插入图片描述

2.查看所有主机列表
[root@test1 /etc/ansible]# ansible all --list-hosts

  hosts (2):
    101.37.204.187
    116.62.42.233

3.模块分类
常用命令模块:command、shell、script
常用文件操作模块:copy、file、blockinfile、lineinfile、find、replace、fetch
常用系统类模块:cron、service、user、group
常用包管理模块:yum、yum_repository

1.ping模块

Ansible最基础的模块是ping模块,主要用于判断远程客户端是否在线,返回值是changed、ping

实例:
(1)调用ping模块测试所有的远程主机是否能ping通

[root@test1 /etc/ansible]# ansible all -m ping
在这里插入图片描述

(2)调用ping模块测试web组的远程主机是否能ping通

[root@test1 /etc/ansible]# ansible web -m ping
在这里插入图片描述

2.command模块

1.命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。
2.它不会通过shell进行处理,比如$HOME和操作如"小于"<",">", “|”, “;”,"&"’ 工作(需要使用shell模块实现这些功能)。
3.多数脚本都支持参数,默认模块为command

(2)参数
①chdir

指定一个目录,表示在执行命令之前,先切换到该目录

②creates

creates虽然是创造,创建的意思,但是使用这个参数并不是帮助我们创建文件,而是用来做判断,指定一个文件,当远程主机上该文件存在时,则不执行指定的命令

③removes

也是用来做判断,指定一个文件,当远程主机上该文件不存在,则该命令不执行,与creates相反

④executable

切换shell来执行命令,需要使用命令的绝对路径(不常用,常用shell 模块顶替)

⑤free_form

1.这个是必须参数,用来指定需要远程执行的命令。
2.要执行的Linux指令,一般使用Ansible的-a参数代替(不常用,常用shell 模块)
注意:free_form 参数与其他参数并不相同,其他参数的赋值模式都是name=value,如果free_form参数使用name=value的赋值模式反而是错误的,例如:当我们想要在远程主机上执行 ls 命令时,写成"free_form=ls" ,这样写反而是错误的,因为并没有任何参数的名字是 free_form,当我们想要在远程主机中执行 ls 命令时,直接写成 ls 即可。因为 command 模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为 free_form

(3)实例
(1)远程web主机组,切换到/mnt目录,执行ls命令

[root@test1 /etc/ansible]# ansible web -m command -a ‘chdir=/mnt ls’

(2)远程web主机组,判断/opt目录下是否有文件1.txt,没有则执行touch 2.txt命令,有则不执行

[root@test1 /etc/ansible]# ansible web -m command -a “creates=/opt/1.txt touch /opt/2.txt”

远程web主机组,判断/opt目录下是否有文件1.txt,没有则执行ls命令,没有则执行

[root@test1 /etc/ansible]# ansible web -m command -a “creates=/opt/1.txt ls”

(3)远程web主机组,判断/opt目录下是否有文件1.txt,有则执行ls /opt命令,没有则不执行

[root@test1 /etc/ansible]# ansible web -m command -a “removes=/opt/1.txt ls /opt”

3.shell模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等

command和shell模块的区别:

command模块的命令不启动shell,直接通过ssh执行命令,command不支持bash的特性,如管道和重定向等功能,所有需要调用shell的功能都无法使用。不可以使用shell模块执行交互命令,如vim、top等。

(1)参数
① free_form

必须参数,指定需要远程执行的命令,具体参考command模块

② chdir

指定一个目录,表示在执行命令之前,先切换(进入)到该目录

③ creates

指定一个文件,当远程主机上该文件存在时,则不执行命令,反之执行命令

④ removes

指定一个文件,当远程主机上该文件存在,则执行命令,反之则不执行,与creates相反

⑤ executable

默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。

(2)实例
① 统计web主机组各个主机的进程数量

[root@test1 /etc/ansible]# ansible web -m shell -a “ps aux | wc -l”

② 查看web主机组各个主机的登录信息

[root@test1 /etc/ansible]# ansible web -m shell -a “who”

③ 使用shell模块创建文件

[root@test1 /etc/ansible]# ansible web -m shell -a “touch /mnt/1.txt”
注:有Warning警告提示,正常!!!

shell模块支持判断(creates、removes):

creates:文件存在,不执行shell命令
removes:文件不存在,不执行shell命令

实例:
① 远程web主机组,判断/mnt目录下是否有文件1.txt,没有则执行touch 1.txt命令,有则不执行

[root@test1 /etc/ansible]# ansible web -m shell -a “creates=/mnt/1.txt touch /mnt/1.txt”

② 远程web主机组,判断/mnt目录下是否有文件1.txt,有则执行"ls /mnt"命令,没有则不执行

[root@test1 /etc/ansible]# ansible web -m shell -a “removes=/mnt/1.txt ls /mnt”

4.script模块

script模块支持在指定节点运行ansible控制端的脚本,且不需要将脚本复制到被执行的远程主机上

(1)参数
① chdir

指定一个目录,表示在执行脚本之前,先切换(进入)到该目录

② creates

指定一个文件,当远程主机上该文件存在时,则不执行脚本,反之执行脚本

③ removes

指定一个文件,当远程主机上该文件存在,则执行脚本,反之则不执行,与creates相反

④ free_form

必须参数,指定需要执行的脚本,具体参考command模块

(2)实例
①在ansible控制端写个简单的脚本:
[root@test1 /etc/ansible]# vim test.sh

#/bin/bash
echo "success" >> /mnt/test.sh.log
date >> /mnt/test.sh.log
df -lh >> /mnt/test.sh.log

②远程web主机组执行脚本
[root@test1 /etc/ansible]# ansible web -m script -a ‘./test.sh’

③查看文件生成
[root@test1 /etc/ansible]# ansible web -m command -a ‘ls /mnt’
或者
[root@test1 /etc/ansible]# ansible web -m command -a ‘chdir=/mnt ls’

④查看文件内容
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.sh.log”

5.file模块

    file 模块用来帮助我们完成一些对目录或者文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限和属性等。

(1)参数
① path

必须参数,指定文件/目录的路径和要创建的文件或目录的名称

② force

用来创建软连接,有两个选项:yes|no
当force=yes时,表示强制创建链接文件,使用情况有3,下面列出:
     1.当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件
     2.当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件
     3.当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件

③ owner

指定被操作文件/目录的属主(所有者),属主对应的用户必须在远程主机中存在,否则会报错

④ group

指定被操作文件/目录的属组,属组对应的组必须在远程主机中存在,否则会报错

⑤ mode

指定被操作文件/目录的权限,例如,想要将文件的权限设置为"rwxr-xr-x",则可以使用mode=755进行设置,mode=0755同样效果

⑥ recurse

递归设置被操作目录的属性,只对目录有效,将recurse设置为yes,可以递归的修改目录中文件的属性

⑦ src

指定被链接的源文件路径,只应用于state=link或者state=hard的情况,表示我们想要创建一个软链或者硬链,要创建软链接或者硬链接我们必须指明软链接或者硬链接的源文件,通过src选项可以指定链接源

⑧ dest

指定被链接到的路径,只应用于state=link或者state=hard的情况,指定被链接的源文件的制作的软(硬)链接存放的路径

⑨ state

必须参数
state=:
  directory:如果目录不存在,就创建目录
  touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间,指定文件的所有者、所属组与权限,可以修改文件属性
  file:即使文件不存在,也不会被创建
  absent:删除目录、文件或者取消链接文件
  link:创建软链接
  hard:创建硬链接

(2)实例
① 远程web主机组,在web主机组所有主机上创建/mnt/test.txt文件

[root@test1 /etc/ansible]# ansible web -m file -a “path=/mnt/test.txt state=touch”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”   #查看/mnt目录

② 远程web主机组,在web主机组的所有主机上创建/mnt/test目录

[root@test1 /etc/ansible]# ansible web -m file -a “path=/mnt/test state=directory”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”

③ 远程web主机组,在web主机组所有主机上创建/mnt/harry.txt文件(指定所有者、所属组与权限)

[root@test1 /etc/ansible]# ansible web -m file -a “path=/mnt/harry.txt owner=ops group=ops mode=0755 state=touch”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”

④ 远程web主机组,删除web主机组所有主机的/mnt/harry.txt文件

[root@test1 /etc/ansible]# ansible web -m file -a “path=/mnt/harry.txt state=absent”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”

⑤ 远程web主机组,删除web主机组所有主机的/mnt/test目录

[root@test1 /etc/ansible]# ansible web -m file -a “path=/mnt/test state=absent”
[root@test1 /etc/ansible]# ansible web -m shell -a “ls /mnt”

⑥ 远程web主机组,给web主机组所有主机的/etc/hosts文件创建一个软链接文件hosts放在/mnt目录下

[root@test1 /etc/ansible]# ansible web -m file -a “src=/etc/hosts path=/mnt/hosts state=link”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat hosts”
或者
[root@test1 /etc/ansible]# ansible web -m command -a " cat /mnt/hosts"
或者
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/hosts”

6.copy模块

    copy模块用于从本地主机中拷贝文件到远程主机,更改权限等,如果目标主机有同名文件时,通过定义backup=yes则先备份再拷贝。

(1)参数
① src

用于指定本地需要copy的文件或目录,可以是绝对路径,也可以是相对路径,如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

② dest

用于指定本地文件或者将被拷贝到远程主机的目标文件或者目录,是必须选项,需要注意的是,如果源文件是一个目录,那么dest指定的路径也必须是目录
注意:如果拷贝的是目录,那么这个目录不能为空,如果目录为空目录,命令执行不会报错,但是实际上目录并没有被拷贝到远程主机

③ content

当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,当使用content直接指定文件内容的时,dest指定的目标必须是文件,否则会报错

④ backup

当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,可以使用backup选项先对远程主机的文件进行备份,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机,备份文件包含时间信息

⑤ owner

指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错

⑥ group

指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错

⑦ mode

指定文件拷贝到远程主机后的权限,如果你想将权限设置为rw-r–r-- ,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示

⑧ directory_mode

递归指定文件拷贝到远程主机后目录的权限,默认为系统默认权限

⑨ force

如果目标主机包含该文件,但内容不同,当force=yes,则强制覆盖,force=no,则只有当目标主机的目标位置不存在该文件时,才复制。默认force=yes

(2)实例
练习准备:
在ansible控制端创建目录test,然后在刚刚创建的test目录里面创建文件1.txt
[root@test1 /etc/ansible]# mkdir test
[root@test1 /etc/ansible/test]# touch 1.txt

① 将ansible控制端的/etc/ansible/test/1.txt文件拷贝到web主机组的所有主机的/mnt目录下

[root@test1 /etc/ansible]# ansible web -m copy -a “src=./test/1.txt dest=/mnt/”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”

② 将ansible控制端的/etc/ansible/test目录拷贝到web主机组下的所有主机的/mnt目录下

[root@test1 /etc/ansible]# ansible web -m copy -a “src=./test dest=/mnt/”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls”

③ 将ansible控制端的/etc/ansible/test/1.txt文件拷贝到web主机组的所有主机的/mnt目录下,并且对web主机组下所有主机的/mnt/1.txt文件进行备份

[root@test1 /etc/ansible]# ansible web -m copy -a “src=./test/1.txt dest=/mnt backup=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “ls /mnt”

④ 直接在ansible控制端提供文件内容(hahaha\n)copy到web主机组下的所有主机的/mnt/2.txt目录下

[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘hahaha\n\n’ dest=/mnt/2.txt”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/2.txt”

⑤ 直接在ansible控制端提供文件内容(heiheihei\n)copy到web主机组下的所有主机的/mnt/2.txt目录下,权限指定为222

[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘heiheihei\n’ dest=/mnt/2.txt mode=222 backup=yes”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt ls -l”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat 2.txt”

7.fetch模块

    fetch(拉取)模块主要是将远程(受管)主机中的文件拷贝到本机中,和copy模块的作用刚刚相反。

(1)参数
① src

指定在远程主机拉取的文件,并且必须是一个文件,不能是目录

② dest

指定拉取文件到本地后文件存放的目录,例如:指定文件存放的目录为/mnt,源文件为/etc/profile,受管理的主机名为test2,那么文件具体的保存路径为/mnt/test2/etc/profile

(2)实例
① 拉取web主机组的所有主机的/etc/profile文件,保存在本地的/mnt目录下
[root@test1 /etc/ansible]# ansible web -m fetch -a “src=/etc/profile dest=/mnt”

如果遇到报错:[Errno 13] Permission denied:
原因:当前用户不是root用户,在指定在本地保存文件的目录没有写权限
解决:切换到root目录执行ansible命令或者给指定的目录赋予足够的权限

8.lineinfile模块

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

(1)参数
① path

必须参数,指定要操作的文件

② line

用来指定文本内容

③ state

当想要删除对应的文本时,需要将state参数设置为absent,默认为present

④ regexp

使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

⑤ backrefs

   默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。
   当backrefs=yes时,表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了。
   backrefs=yes除了能开启后向引用功能,还有另一个作用,默认情况下,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,但是,如果在使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持文件不变。

⑥ insertbefore

   利用insertbefore参数可以将文本插入到指定的行之前,insertbefore参数的值可以设置为BOF或者正则表达式,默认BOF(BOF为Begin Of File的意思,表示插入到文档的开头
   如果将insertbefore设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数被忽略

⑦ insertafter

   利用insertafter可以将文本插入到指定的行后,insertafter参数的值可以设置为EOF或者正则表达式,默认为EOF(EOF为End Of File的意思,表示插入到文档的末尾
   如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数将会被忽略

⑧ backup

是否在修改文件之前对文件进行备份,默认不备份,需要备份时backup=yes,备份的文件会在原文件名的基础上添加时间戳

⑨ create

当要操作的文件并不存在时,是否创建对应的文件,需要创建时create=yes,如何需要操作的文件不存在,不设置create=yes会报错,创建文件的时候,必须使用line指定内容

(2)实例
为了方便举例,在web主机组下的所有主机创建文件/mnt/test.txt,内容如下:

welcome to Beijing
ansible is really interesting
In addition to ansible, there are a lot of fun operation and maintenance knowledge

可以使用ansible的copy指定内容创建文件/mnt/test.txt,如下:

[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘welcome to Beijing \nwelcome to my blog\nansible is really interesting\nIn addition to ansible, there are a lot of fun operation and maintenance knowledge\n’ dest=/mnt/test.txt force=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.txt”

① 在web主机组的所有主机的/mnt/1.txt文件中添加一行内容(默认添加到最后)hello world

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test.txt line=‘hello world’”
注意:lineinfile基于幂等原则,重复执行命令,不会创建多行内容,可视为确保指定的一行文本(hello world)存在鱼文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果存在,则默认在文件的末尾插入这行文本

② 使用正则替换内容,web主机组下的所有主机中的/mnt/test.txt文件中的以welcome开头的行,替换为文本"test text",如果所有行都不能匹配正则,则将line指定的内容添加到文件的最后一行

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test.txt regexp=’^welcome’ line=‘test text’”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat test.txt”
注意:使用正则表达式替换某一行,若不知一行能够匹配正则,那么只有最后一个匹配正则的行会被替换成line指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行
还原文件:
[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘welcome to Beijing \nwelcome to my blog\nansible is really interesting\nIn addition to ansible, there are a lot of fun operation and maintenance knowledge\n’ dest=/mnt/test.txt force=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.txt”

③ 使用正则替换内容,web主机组下的所有主机中的/mnt/test.txt文件中的以lineinfile开头的行,替换为文本"test1 text",如果所有行都不能匹配正则,则不对文件进行任何操作

[root@test1 /etc/ansible]# ansible web -m lineinfile -a ‘path=/mnt/test.txt regexp="^line" line=“test1 text” backrefs=yes’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.txt”
还原文件:
[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘welcome to Beijing \nwelcome to my blog\nansible is really interesting\nIn addition to ansible, there are a lot of fun operation and maintenance knowledge\n’ dest=/mnt/test.txt force=yes”

④ 使用正则匹配删除内容,web主机组下的所有主机中的/mnt/test.txt文件中的以welcome开头的行

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test.txt regexp=’^welcome’ state=absent”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.txt”
注意:根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除

⑤ 使用line参数指定的内容匹配文本做删除操作,删除web主机组下的所有主机中的/mnt/test.txt文件中内容为"welcome to my blog"的行

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test.txt line=‘welcome to my blog’ stte=absent”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test.txt”
注意:根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除

为了方便举例,继续在web主机组下的所有主机创建文件/mnt/test1.txt,内容如下:

Hello world Haaaa
hello ansible haaaa 

可以使用ansible的copy指定内容创建文件/mnt/test.txt,如下:

[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘Hello world Haaaa\nhello ansible haaaa’ dest=/mnt/test1.txt”
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat test1.txt”

⑥ 如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将/mnt/test1.txt示例文件中的"Hello world Haaaa"替换成"Haaaa",如果不设置backrefs=yes,则不支持后向引用,那么"Hello world Haaaa"将被替换成"\3"

开启向后引用:
[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test1.txt regexp=’(H.{4})(.*)(H.{4})’ line=’\3’ backrefs=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test1.txt”
192.168.0.10 | CHANGED | rc=0 >>
Haaaa
hello ansible haaaa
192.168.0.12 | CHANGED | rc=0 >>
Haaaa
hello ansible haaaa

不支持向后引用:
[root@test1 /etc/ansible]# ansible web -mlineinfile -a “path=/mnt/test1.txt regexp=’(H.{4})(.*)(H.{4})’ line=’\3’”
[root@test1 /etc/ansible]#ansible web -m shell -a “cat /mnt/test1.txt”
192.168.0.10 | CHANGED | rc=0 >>
\3
hello ansible haaaa
192.168.0.12 | CHANGED | rc=0 >>
\3
hello ansible haaaa

补充:解释向后引用
   在shell中,小括号可以将正则表达式的一部分括起来组成一个单元(组),可以对整个单元使用数量限定符,也就是分组,默认情况下,每个分组会自动拥有一个组号,规则如下:

从左向右,以分组的左括号(也就是小括号的左边"(")为标志,第一个出现的分组的组号为1,第二个为2,以此类推。也就是,"\1"表示引用整个正则中第1个分组中的正则所匹配到的结果,"\2"表示引用整个正则中第2个分组中的正则所匹配到的结果以此类推。单纯文字描述,我不好说,看起来也不好理解,下面举两个实例

实例:
为了方便举例,直接在ansible控制端创建文件test.txt,内容如下:
Hello world Hello
Hi world Hi
hello world hi - - hi
hello world hi - - hello

[root@test1 /etc/ansible]# grep -E “H([[:alpha:]]+) world H\1” test.txt
Hello world Hello
Hi world Hi
解析: “H([[:alpha:]]+)“表示的是H后面跟至少一个英文字母,用小括号将”[[:alpha:]]+“括起来,表示分组,将”[[:alpha:]]+“看做一个整体,排在第一位,所以组号为1,后面引用则用”\1表示即可”,使用"\1"引用前面的组,则表示"\1"本身就是前面的组,所以匹配的时候,会匹配到"AA BB AA"这种格式的行

[root@test1 /etc/ansible]# grep -E “h([[:alpha:]]+) world h([[:alpha:]]+) - - h\2” test.txt
hello world hi - - hi
解析:与上面的例子一样,“H([[:alpha:]]+)“表示的是H后面跟至少一个英文字母,用小括号将”[[:alpha:]]+“括起来,表示分组,按照顺序,第一个小括号括起来的部分组号为1,第二个小括号括起来的部分组号为2,向后引用使用的是”\2”,则表示后面匹配的内容是跟第二个小括号括起来的内容是一样的,所以在最后会输出"AA ** CC - - CC"这种格式的行

⑦ 向web主机组下的所有主机中的/mnt/test1.txt文件开头添加一行内容"hei world"

[root@test1 /etc/ansible]# ansible web -m lineinfile -a "path=/mnt/test1.txt line=‘hei world’ insertbefore=BOF "

⑧向web主机组下的所有主机中的/mnt/test1.txt文件开头添加一行内容"hi world"

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test1.txt line=‘hi world’ insertafter=EOF”

⑨ 向web主机组下的所有主机中的/mnt/test1.txt文件添加一行内容"hi world",在修改文件之前先进行备份

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test1.txt line=‘hi world’ backup=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test1.txt”

⑩ 使用create参数,如果指定的文件不存在,则创建这个文件

[root@test1 /etc/ansible]# ansible web -m lineinfile -a “path=/mnt/test2.txt line=‘hello world’ create=yes”
#需要创建文件的时候,line必须指定内容,不然会报错
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/test2.txt”

9.blockinfile模块

    blockinfile模块可以帮助我们在指定的文件中插入"一段文本",这段文本是被标记过的,假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,我们在某段文本上做了标号,以便在以后的操作中可以通过"标记"找到这段文本,然后修改或者删除它

(1)参数
① 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

⑤ insertbefore

在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。

⑥ insertafter

在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾

⑦ backup

是否在修改文件之前对文件进行备份,默认不备份,需要备份时backup=yes,备份的文件会在原文件名的基础上添加时间戳

⑧ create

当要操作的文件并不存在时,是否创建对应的文件,需要创建时create=yes,如何需要操作的文件不存在,不设置create=yes会报错,创建文件的时候,必须使用line指定内容

(2)实例
为了方便举例,在web组下的所有主机创建文件/mnt/blockinfile.txt,内容如下:

hi world
hello world

使用ansible命令如下:

[root@test1 /etc/ansible]# ansible web -m copy -a “content=‘hello world\nhi hello\n’ dest=/mnt/blockinfile.txt”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/blockinfile.txt”

① 自定义标记,在/mnt/blockinfile.txt文件最后面添加两行内容:
systemctl start httpd
systemctl start php-fpm

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt block=“systemctl start httpd\nsystemctl start php-fpm” marker="#{mark}service to start"’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/blockinfile.txt”

添加内容之后,文件内容为:

hi hello
hello world
#BEGINservice to start
systemctl start httpd
systemctl start php-fpm
#ENDservice to start

② 修改/mnt/blockinfile.txt文件添加内容为:
hello world
hi hello
#BEGINservice to start
systemctl start httpd
#ENDservice to start

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt block=“systemctl start httpd\n” marker="#{mark}service to start"’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/blockinfile.txt”
因为在执行此命令时,"#{mark} serivce to start"标记对应的文本块已经存在于文件中,而同时,block参数对应的内容又与之前文本块的内容不同,所以,这种情况下,对应文本块中的内容会被更新,而不会再一次插入新的文本块,这种用法相当于更新原来文本块中的内容,执行上述命令后,文本块的内容被更新为如下:
hi hello
hello world
#BEGINservice to start
systemctl start httpd
#ENDservice to start

③ 删除/mnt/blockinfile.txt文件中"#{mark} serivce to start"标记对应的文本块(连同标记删除),两种方法:

第一种方法:
[root@test1 /etc/ansible]# ansible web -mblockinfile -a ‘path=/mnt/blockinfile.txt block="" marker="#{mark}service to start"’
因为在执行此命令时,"#{mark} serivce to start"标记对应的文本块已经存在于文件中,而同时,block参数对应的内容为空,这时,blockinfile模块会删除对应标记的文本块
第二种方法:
[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt marker="#{mark}service to start" state=absent’
使用将state的值设置为absent,表示删除对应标记的文本块

执行上面的删除操作之后文本内容如下:
hi hello
hello world

默认情况下,文本块插入在文件的尾部,我们也可以将文本块插入指定的位置,比如,插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头,示例如下(④和⑤)
④ 在/mnt/blockinfile.txt文件的开头插入"#blockinfile test",可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt block="#blockinfile test" marker="#{mark} test" insertbefore=BOF’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/blockinfile.txt”

⑤ 在/mnt/blockinfile.txt文件的末尾插入"#blockinfile test1",与默认操作结果一样,也可以使用insertafter参数设置为EOF,EOF表示End Of File

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt block="#blockinfile test" marker="#{mark} test1" insertafter=EOF’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/blockinfile.txt”

⑥ 使用正则表达式匹配行,将文本"#blockinfile test2"插入"hi"开头的行之前

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt block="#blockinfile test2" marker="#{mark} test" insertafter="^hi"’
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat blockinfile.txt”

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

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/blockinfile.txt marker="#{mark} test" state=absent backup=yes’
[root@test1 /etc/ansible]# ansible web -m shell -a “ls /mnt”

⑧ 使用create参数,如果指定的文件不存在,则创建这个文件

[root@test1 /etc/ansible]# ansible web -m blockinfile -a ‘path=/mnt/2.txt block=“test” marker="#{mark} test" create=yes’
[root@test1 /etc/ansible]# ansible web -m shell -a “ls /mnt”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/2.txt”

10.replace模块

    replace模块有点类似于sed,可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换,顺便提一下,lineinfile会替换一整行,replace可以替换关键词

(1)参数
① path

是必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,但是这些参数名作为path参数的别名使用

② regexp

是必须参数,指定一个python正则表达式,文件中与正则匹配的字符将会被替换

③ replace

用来指定最终替换成的字符串

④ backup

用来设置是否在修改文件之前先对文件进行备份,backup=yes表示进行备份,修改文件建议设置为backup=yes

(2)实例
为了方便举例,在web主机组下的所有主机创建文件/mnt/test.txt,如果原来有/mnt/test.txt文件,则先删除再创建,内容如下:

hello world
Welcome to my blog

使用命令如下:

[root@test1 /etc/ansible]# ansible web -m copy -a ‘content=“hello world\nWelcome to my blog” dest=/mnt/test.txt’
[root@test1 /etc/ansible]# ansible web -m command -a “chdir=/mnt cat test.txt”

① 将/mnt/test.txt文件中的所有"hello"替换为"hi",并且在修改之前先对文件进行备份

[root@test1 /etc/ansible]# ansible web -m replace -a ‘path=/mnt/test.txt regexp=“hello” replace=“hi” backup=yes’
[root@test1 /etc/ansible]# ansible web -mshell -a “ls /mnt”
[root@test1 /etc/ansible]# ansible web -mshell -a “cat /mnt/test.txt”

11.find模块

    find模块可以帮助我们在远程主机中查找符合条件的文件,类似于find命令

(1)参数
1.paths

是必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths

2.recurse

当recurse=yes,表示在指定目录中递归查找文件,在默认情况下,只会在指定的目录中查找文件,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归查找文件,需要使用recurse参数

3.hidden

当hidden=yes,表示隐藏文件不被忽略,也在查找行列,默认情况下,隐藏文件会被忽略,想要不忽略隐藏文件,需要使用hidden参数

4.file_type

默认情况下,ansible只会根据条件查找"文件",并不会查找"目录"或"软链接"等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有any(表示所有文件类型)、directory、file、link 四种

5.patterns

用来指定需要查找的文件的名称,支持使用shell(例如通配支付)或者正则表达式去匹配文件名称,默认情况下, 使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_regex参数的值设置为yes

6.use_regex

在默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式

7.contains

利用这个参数可以根据文章内容查找文件,contains的值是一个正则表达式,find模块会根据对应的正则表达式匹配文件内容

8.age

使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比,比如,如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)

文件的三种属性
atime(access time):访问时间,读一次文件的内容,atime就会更新。比如对这个文件运用 more、cat等命令,另外ls、stat命令都不会修改文件的访问时间
mtime(modifiy time):修改时间,mtime是文件内容最后一次被修改时间。例如vi后保存文件,ls -l列出的时间就是这个时间
ctime(change time):状态改动时间,ctime是在写入文件、更改所有者、权限或链接设置时随i节点的内容更改而更改的,是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新

9.age_stamp

文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准

10.size

使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置size=3m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b

11.get_checksum

将get_checksum设置为yes,获取文件的sha1校验码,当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长

(2)实例
① 在web主机组所有主机上的/mnt目录中查找包含字符串hello的文件,隐藏文件会被忽略,不会进行递归查找

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt contains=".*hello.*"

② 在web主机组所有主机上的/mnt目录中查找包含字符串hello的文件,隐藏文件会被忽略,需要进行递归查找

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt contains=".*hello.*" recurse=yes’

③ 在web主机组所有主机上的/mnt目录中查找以.txt结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt patterns="*.txt" hidden=yes’

④ 在web主机组所有主机上的/mnt目录查找以.txt结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt patterns="*.txt" file_type=any hidden=yes’

⑤ 在web主机组所有主机上的/mnt目录查找以.txt结尾的文件,需要patterns对应的表达式为正则表达式,查找范围包括隐藏文件,包括所有的文件类型,但是不会进行递归查找

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt patterns=".*.txt" use_regex=yes file_type=any hidden=yes’

⑥ 在web主机组所有主机上的/mnt目录递归查找mtime在6天以内的文件,不包括隐藏文件,不包括目录或者软链接文件等文件类型

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt age=-6d recurse=yes’

⑦ 在web主机组所有主机上的/mnt目录递归查找atime在2个星期以内的文件,不包括隐藏文件,不包括目录或软链接文件等文件类型

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt age=-2w age_stamp=atime recurse=yes’

⑧ 在web主机组所有主机上的/mnt目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt size=2g recurse=yes’

⑨ 在web主机组所有主机上的/mnt目录中以及其子目录中查找小于50k的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt size=-50k recurse=yes’

⑩ 在web主机组所有主机上的/mnt目录中以及其子目录中查找以.txt结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件

[root@test1 /etc/ansible]# ansible web -m find -a ‘paths=/mnt patterns=*.txt get_checksum=yes hidden=yes recurse=yes’

12.user模块

    user模块可以实现Linux系统账户管理,可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作

(1)参数
1.name

是必须参数,用于指定要操作的用户名称,可以使用别名user

2.group

用来指定用户所在的基本组

3.groups

用来设置用户附加组,使用逗号分隔多个组,如果参数为空,即groups=’’,则删除用户所有附加组(属组不受影响),如果用户已经存在并且已经拥有多个附加组,需要继续添加新的附加组时,必须要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖

4.append

如果用户原本就存在多个附加组,当使用groups参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no

5.shell

用来指定用户的默认shell

6.uid

用来指定用户的uid号

7.expires

用来指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,例如,想要设置用户的过期日期为2018年12月31日,则首先要获取到2018年12月31日的unix时间戳,使用命令"date -d 2018-12-31 +%s"获取到的时间戳为1546185600,然后,当设置expires=1546185600时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的/etc/shadow文件,对应用户的第八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在Linux和FreeBSD系统中使用

8.comment

用来设置用户账户的描述,也就是用户的注释信息

9.state

用于指定用户是否在远程主机中,可选值有present、absent,默认值为present,当state=present,表示新建用户(表示用户需要存在),当state=absent,表示删除用户

10.remove

当state的值设置为absent时,表示要删除远程主机中的用户,但是在删除用户时,不会删除用户的家目录等信息,这是因为remove参数的默认值为no,如果设置为yes,在删除用户的同时,会删除用户的家目录,当state=absent并且remove=yes时,相当于执行"userdel --remove"命令

11.password

用于指定用户的密码,但是这个密码不能是明文密码,而是一个明文明码加密后的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串,可以在python的命令提示符下输入如下命令,生成明文密码对应的加密字符串。
import crypt; crypt.crypt(‘666666’)
输入上述命令后,即可得到明文密码666666对应的加密字符串

12.update_password

此参数有两个值可选,always和on_create,当update_password=always时表示,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always,当update_password=on_create时,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定,如果是新创建的用户,即使此参数设置为on_create,也会将用户的密码设置为password参数对应的值

13.generate_ssh_key

此参数默认值为no,如果设置为yes,表示为对应的用户生成ssh密钥对,默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖

14.ssh_key_file

当generate_ssh_key参数的值为yes时,使用此参数自定义生成ssh私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以".pub"结尾

15.ssh_key_comment

当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置公钥中的注释信息,但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作,当不指定此参数时,默认的注释信息为"ansible-generated on 远程主机的主机名"

16.ssh_key_passphrase

当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置私钥的密码,但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作

17.ssh_key_type

当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置密钥对的类型,默认密钥类型为rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作

(2)实例
1.在web主机组的所有主机上创建名为harry的用户,如果用户已经存在,则不进行任何操作

[root@test1 /etc/ansible]# ansible web -m user -a “name=harry”

2.在web主机组的所有主机上删除名为harry的用户,但是不会删除harry用户的家目录

[root@test1 /etc/ansible]# ansible web -m user -a “name=harry state=absent”

3.在web主机组的所有主机上删除名为harry的用户,同时删除harry用户的家目录

[root@test1 /etc/ansible]# ansible web -m user -a “name=harry state=absent remove=yes”

4.指定web主机组所有主机的test用户的主组为testuser,test用户存在则直接修改主组,test用户不存在则创建test用户,testuser组需要提前存在,如果不用group设置用户的主组,默认情况下, 默认的主组与用户名相同

[root@test1 /etc/ansible]# ansible web -m user -a “name=test group=testuser”
[root@test1 /etc/ansible]# ansible web -m command -a “id test”

5.指定web主机组所有主机的test用户的附加组testuser1,testuser2,当不使用groups设置附加组时,默认附加组与用户名相同,在不知道用户原来的附加组设定的情况下,最好将append参数设置为yes,可以一次性设置多个附加组,但是附加组之间需要用逗号隔开,例如:groups=testuser1,testuser2

[root@test1 /etc/ansible]# ansible web -m user -a “name=test groups=testuser1,testuser2 append=yes”
[root@test1 /etc/ansible]# ansible web -m command -a “id test”

6.指定web主机组的所有主机的test用户使用的shell解释器为/bin/sh

[root@test1 /etc/ansible]# ansible web -m user -a “name=test shell=/bin/sh”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/passwd | grep test”

7.指定web主机组所有主机的test用户的uid为2008

[root@test1 /etc/ansible]# ansible web -m user -a “name=test uid=2008”
[root@test1 /etc/ansible]# ansible web -m command -a “id test”

8.指定web主机组所有主机的test用户的过期时间为2021年12月31日,使用"date -d 2021-12-31 +%s"命令可以获取到对应日期的unix时间戳

[root@test1 /etc/ansible]# date -d 2021-12-31 +%s
1640880000
[root@test1 /etc/ansible]# ansible web -m user -a “name=test expires=1640880000”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/shadow | grep test”

9.指定web主机组所有主机的test用户的注释信息(用户描述信息)

[root@test1 /etc/ansible]# ansible web -m user -a “name=test comment=测试用户”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/passwd | grep test”

10.设置web主机组所有主机的test用户的密码为123456

首先需要生成123456的加密字符串
[root@test1 /etc/ansible]# python
>>> import crypt; crypt.crypt('123456')
'$6$fHR2pIzvjD2L6YOW$fWj/Hzz.zTbq/LQ8MFov4/liy.fpU12V2OBulifCjpIlOGDEuR9eLvFTIC8Vin267PsH9KIVBlk65KWeIvZ9L1'
[root@test1 /etc/ansible]# ansible web -m user -a 'name=test password="$6$fHR2pIzvjD2L6YOW$fWj/Hzz.zTbq/LQ8MFov4/liy.fpU12V2OBulifCjpIlOGDEuR9eLvFTIC8Vin267PsH9KIVBlk65KWeIvZ9L1"'
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/shadow | grep test”

11.使用update_password参数设置web主机组所有主机test用户的密码,如果用户当前的加密字符串与命令中设置的加密字符串不一致,则不进行密码更新操作

[root@test1 /etc/ansible]# ansible web -m user -a 'name=test password="$6$engIhd4t8j3XrkE2$fWebSTyCifWoO8I2PcYKWSQBnsYKTrKAJDdzmYkNqOu58NgxKbnivxK4w7G3WStAzMnAbzzZ1kumxMBWeG0M.." update_password=on_create'
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/shadow | grep test”

12.给web主机组所有主机的test用户生成ssh密钥对,默认路径在用户家目录的./ssh目录中生成id_ras的私钥和名为id_rsa.pub的公钥,如果已经存在同名密钥,则不会覆盖原来的密钥,也就是不做任何操作

[root@test1 /etc/ansible]# ansible web -m user -a “name=test generate_ssh_key=yes”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /home/test/.ssh/id_rsa”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /home/test/.ssh/id_rsa.pub”

13.给web主机组所有主机的test用户生成ssh密钥对,密钥对生成在/mnt目录下,私钥名为id_rsa_test,公钥名为id_rsa_test.pub

[root@test1 /etc/ansible]# ansible web -m user -a “name=test generate_ssh_key=yes ssh_ky_file=/mnt/id_rsa_test”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/id_rsa_test”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /mnt/id_rsa_test.pub”

14.给web主机组所有主机的test1用户生成ssh密钥对,同时指公钥中的注释信息为"test1_192.168.0.10",注意:此案书只能再创建密钥时使用才会生效,并不能操作同名的旧密钥

[root@test1 /etc/ansible]# ansible web -m user -a ‘name=test1 generate_ssh_key=yes sshkey_comment=“test1_192.168.0.10”’
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /home/test1/.ssh/id_rsa.pub”

15.给web主机组所有主机test用户生成ssh密钥对,同时指定私钥密码为123456,注意:此参数只能在创建密钥时使用才有效,不能操作同名的旧密钥

[root@test1 /etc/ansible]# ansible web -m user -a ‘name=test generate_ssh_key=yes ssh_key_passphrase=“123456”’

私钥密码:

1.是私人(个人)钥匙密码,不是证书开发者密码
2.这个密码是用作启用、导出、导入时的保护密码。
3.只有知道这个密码,才可以重新导入这个证书来使用,避免其他人乱用

16.给web主机组所有主机上的test用户生成ssh密钥对,同时指定密钥对的类型为dsa(会在.ssh目录下生成dsa密钥文件),当不显式指定密钥类型时,默认类型为rsa,此参数只能在创建密钥时使用才会生效,并不能操作同名的旧密钥

[root@test1 /etc/ansible]# ansible web -m user -a ‘name=test generate_ssh_key=yes ssh_key_type=dsa’
[root@test1 /etc/ansible]# ansible web -m shell -a “ls /home/test/.ssh”

13.group模块

    group模块是用来添加或者删除组,我们可以通过group模块管理远程主机上的组

(1)参数
① name

是必须参数,用来指定要操作的组的名称

② state

用于指定组的状态,有两个值,分别为present,absent,默认state=present,当state=ansent时,表示删除组

③ gid

用于指定组的gid

(2)实例
① 在web主机组所有主机上创建testuser组,该组存在则不做任何操作,也就是确保web主机组所有主机都存在testuser组

[root@test1 /etc/ansible]# ansible web -m group -a “name=testuser”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/group | grep testuser”

② 删除web主机组所有主机上的testuser1组(删除成功的前提是:不能有用户把被删除的组当成主组

[root@test1 /etc/ansible]# ansible web -m group -a “name=testuser1 state=absent”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/group | grep testuser1”

③ 确保web主机组所有主机的testuser2组,并且确定testuser2组的id为1005,如果testuser2组不存在,则创建testuser2组,组id为1005,如果testuser2组已经存在,组id不等于1005,则将zuid修改为1005

[root@test1 /etc/ansible]# ansible web -m group -a “name=testuser2 gid=1005”
[root@test1 /etc/ansible]# ansible web -m shell -a “cat /etc/group | grep testuser2”

14.cron模块

    cron模块主要用于添加、删除、更新操作系统的crontab任务计划,可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令

crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有:
* -----> 取值范围内的所有数字
/ -----> 每过多少个数字
- -----> 从X到Z
, -----> 散列数字

(1)参数
1.minute

用来设置cron计划中的分钟设定位的值,例如:minute=5,则表示cron计划中分钟设定位的值为5,如果不使用此参数,则分钟设定位的值默认为"*"

2.hour

用来设置计划任务中的小时设定为的值,例如:hour=1,则表示cron计划中小时设定位的值为1,如果不使用此参数,则小时设定位的值为"*"

3.day

用来设置计划任务中日设定位的值,例如:day=*/3,则表示cron计划中日设定位的值为每3天执行,当不使用此参数时,日设定位的值默认为"*"

4.month

用来设置计划任务中月设定位的值,例如:mouth=1,则表示cron计划中月设定位的值为1月执行,当不使用此参数时,月设定位的值默认为"*"

5.weekday

用来设置计划任务中周几设定位的值,例如:weekday=1,则表示cron计划中周设定位的值为周1执行,当不使用此参数时,周几设定位的值默认为"*"

6.special_time

   为了更容易理解这个参数,先举两个cron例子:①@reboot echo test;②hourly echo test;上面两个计划任务的例子设定格式为@reboot,@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成"0 * * * *" ,这种@开头的时间设定格式则需要使用special_time参数进行设置,special_time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)

注意:
当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为"* * * * *",这样表示每分钟都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确

7.user

用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户

8.job

用于指定计划的任务中需要实际执行的命令或者脚本

9.name

用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务

10.state

当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent

11.disabled

当计划任务有名称时,我们可以根据名称使对应的任务"失效"(注释掉对应的任务),注意:使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且在命令行上指定的任务的时间设定必须和cron文件里面对应的任务完全相同,否则在注释任务的同时,原来cron文件里面对应的任务的时间设定会被修改成为命令行上指定的时间,建议:在使用disabled参数的时候与backup参数一起使用,这样,如果一时大意,导致操作失误,还有回旋的余地

12.backup

backup=yes,表示当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,建议在修改或者删除计划任务时设置backup=yes

(2)实例
① 在web主机组所有主机上创建计划任务,任务名称为"test crontab",任务于每天3点5分执行,任务内容为输出"This is a test crontab"

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test crontab” minute=5 hour=3 job=“echo This is a test crontab”’
在web主机组所有的主机可以查看
crontab -e -u root

② 在web主机组所有主机上创建计划任务,任务名称为"test1 crontab",任务于每5天执行一次,于执行当天1点1分开始执行,任务内容为输出"This is a test crontab"

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test1 crontab” minute=1 hour=1 day=*/5 job=“echo This is a test crontab”’

③ 在web组所有主机上创建计划任务,任务名称为"test3 crontab",任务将在重启时执行,任务内容为"This is a test crontab"

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test3 crontab” special_time=reboot job=“echoThis is a test crontab”’

④ 在计划任务已经存在的情况下,当我们再次操作同名任务的时候,ansible将会认为是修改原来的任务,所以,在test1 crontab存在的情况下,执行下面的命令,原计划任务会被修改,由原来每5天执行一次改为每小时执行一次,因为设置了backup=yes,所以任务在修改之前会先进行备份

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test1 crontab” special_time=hourly job=“echo This is a test crontab” backup=yes’

⑤ 删除web主机组所有主机的名为"test3 crontab"的计划任务,删除前先进性备份

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test3 crontab” state=absent backup=yes’

⑥ 默认情况下操作的是root用户的计划任务,下面命令为web主机组所有主机的test用户创建计划任务

[root@test1 /etc/ansible]# ansible web -m cron -a ‘user=test name=“test crontab” special_time=hourly job=“echo This is a test crontab”’

⑦ 将web主机组所有主机的"test1 crontab"计划任务注释掉

[root@test1 /etc/ansible]# ansible web -m cron -a ‘name=“test1 crontab” minute=1 hour=1 day=*/5 job=“echo This is a test crontab” disabled=yes backup=yes’
注意:在注释任务时,所有设定需要与计划任务的原设定保持一致,否则计划任务将被修改

15.service模块

    service可以帮助我们管理远程主机上的服务,比如,启动或者停止httpd服务,nginx服务,mysqld等等

注意:

   想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则service模块也无法管理远程主机的对应服务
   例如:使用centos6,那么centos6中的nginx则必须能够通过"service nginx start"启动,如果nginx无法通过"service nginx start"进行启动,那么它将同样无法通过ansible的service模块启动,使用centos7,那么centos7中的nginx则必须能够通过"systemctl start nginx"启动,如果它无法通过"systemctl start nginx"进行启动,那么它将同样无法通过ansible的service模块进行启动,centos6中默认通过sysv管理服务,centos7中默认通过systemd管理服务,如果你的服务无法通过 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,那么它也无法被ansible的service模块管理

(1)参数
① name

用于指定需要操作的服务名称,比如httpd

② state

用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将state的值设置为started,如果想要停止远程主机中的服务,则可以将state的值设置为stopped,此参数的可用值有started、stopped、restarted、reloaded

③ enabled

用于指定是否将服务设置为开机 启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动

(2)实例
① 将web主机组所有主机的httpd服务启动

[root@test1 /etc/ansible]# ansible web -m service -a “name=httpd state=started”
[root@test1 /etc/ansible]# ansible web -m shell -a “netstat -alntp | grep httpd”

② 将web主机组所有主机的httpd服务停止

[root@test1 /etc/ansible]# ansible web -m service -a “name=httpd state=stopped”

③ 将web主机组所有主机的httpd服务设置为开机启动

[root@test1 /etc/ansible]# ansible web -m service -a “name=httpd enabled=yes”

④ 将web主机组所有主机的httpd服务重新启动

[root@test1 /etc/ansible]# ansible web -m service -a “name=httpd state=restarted”

16.yum_repository模块

    使用yum_repository可以帮助我们管理远程主机上的yum仓库,创建或修改yum源配置文件

(1)参数
① name

是必须参数,用来指定要操作的唯一的仓库id,也就是".repo"配置文件中每一个仓库对应的"中括号"内的仓库id,就是我们常说的yum源名称(软件源名称)

② baseurl

用来设置yum仓库的url路径

③ description

用来定义了yum仓库的名称,通常是为了方便阅读配置文件,也就是设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容

④ file

用于设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配置文件的文件名前缀,同一个’.repo’配置文件中可以存在多个yum源

⑤ enabled

用于设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源

⑥ gpgcheck

用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置gpgcheck=yes表示开启包验证功能

⑦ gpgcakey

当gpgcheck=yes时,需要使用此参数指定验证包所需的公钥

⑧ state

默认值为present,当state=absent时,表示删除对应的yum源

(2)实例
① 在web主机组所有主机上配置ID为aliEpel 的yum源,仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo

[root@test1 /etc/ansible]# ansible web -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/'

② 在web主机组所有主机上配置ID为aliEpel1 的yum源,仓库配置文件路径为/etc/yum.repos.d/alibaba.repo

[root@test1 /etc/ansible]# ansible web -m yum_repository -a 'name=aliEpel1 description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/ file=alibaba'

③ 删除web主机组所有主机上的/etc/yum.repos.d/alibaba.repo配置文件中的aliEpel源

[root@test1 /etc/ansible]# ansible web -m yum_repository -a ‘file=alibaba name=aliEpel1 state=absent’

④ 在web主机组所有主机上配置ID为aliEpel1 的yum源,仓库配置文件路径为/etc/yum.repos.d/alibaba.repo,但是不启用它

[root@test1 /etc/ansible]# ansible web -m yum_repository -a 'name=aliEpel1 description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/ file=alibaba enabled=no'

17.yum模块

    使用yum模块可以帮助我们在远程主机上通过yum源管理软件包,可以安装、卸载、升级软件包

(1)参数
① name

是必须参数,用来指定需要管理的软件包

② state

用来指定软件包的状态,默认值为present,表示确保软件包已经安装,除了present,其他可用值有installed、latest、absent、removed,其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包

③ disable_gpg_check

用于禁用对rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes表示禁用验证,即不验证包,直接安装,在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装

④ enablerepo

用于指定安装软件包时临时启用的yum源,假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源

⑤ disablerepo

用于指定安装软件包时临时禁用的yum源,某些场景下需要此参数,比如,当多个yum源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包

enablerepo参数和disablerepo参数可以同时使用

(2)实例
① 确保web主机组所有主机通过yum源安装了httpd(对应yum源未开启gpg验证,所以需要设置disable_gpg_check=yes),如下三条命令的效果相同:

[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd disable_gpg_check=yes’
[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd state=present disable_gpg_check=yes’
[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd state=installed disable_gpg_check=yes’

② 确保web主机组所有主机安装了yum源中最新版本的httpd

[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd state=latest disable_gpg_check=yes’

③ 确保web主机组所有主机通过yum源安装的httpd都被卸载了,下面两条命令的效果等同

[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd state=absent’
[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=httpd state=removed’

④ 在web主机组所有主机上安装ftp时不确定aliEpel源是否启用,使用enablerepo=aliEpel,如果aliEpel没有启用,则可以临时启用aliEpel源
[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=ftp disable_gpg_check=yes enablerepo=aliEpel’

⑤ 在web主机组所有主机上安装ftp时确定多个yum源中有都ftp包,不想从aliEpel源中安装,使用disablerepo=aliEpel,则可以临时禁用aliEpel源,确保不从aliEpel源安装ftp

[root@test1 /etc/ansible]# ansible web -m yum -a ‘name=ftp disable_gpg_check=yes disablerepo=aliEpel’

猜你喜欢

转载自blog.csdn.net/weixin_44901564/article/details/108403993