3-ansible Ad-Hoc命令集
清单配置详解
ansible有两种完成任务的方式:
- Ad-Hoc:也就是ansible命令,相当于linux命令
- ansible-playbook:ansible-playbook命令,相当于shell脚本
ansible官方模块文档Ad-Hoc用法
1
ansible <host-pattern> [options]
[options]
选项 | 解释 |
---|---|
-v | 输出详细信息,-vvv输出更加详细的信息 |
-i PATH | 指定inventory配置文件,默认是/etc/ansible/hosts |
-f NUM | 指定并发数,默认是使用的ansible.cfg中forks=5 |
-m NAME | 指定使用的模块名,默认为command模块 |
-M PATH | 指定模块的存放路径 |
-a ‘xxxxx’ | 模块参数 |
-k : | 认证密码 |
-K : | sudo时使用的密码 |
-o : | 标准输出至一行 |
-b : | 相当于sudo命令 |
-t PATH | 将输出信息保存在PATH目录下,文件名为远程主机名 |
-T seconds | 设置最大超时时间,单位秒 |
-B seconds | 后台执行命令,超过指定秒后终止运行的命令 |
-P seconds | 定期返回后台任务进度 |
-u USERNAME | 指定以哪一个远程主机的用户进行远程 |
-U USERNAME | 相当于远程主机后执行sudo USERNAME |
–list-hosts | 列出符合条件的所有主机列表 |
当命令执行多台主机时,执行的主机是没有固定先后顺序的,且受并发数(默认5)限制,同一时间输出主机信息小于等于5都是正常的。
示例1
查看主机内存情况1
2
3
4#command、script、shell,都可以实现远程shell命令运行
ansible test3 -m command -a 'free -m' #command运行远程权限范围所有的shell命令
ansible test3 -m shell -a '受控端脚本路径' #shell模块还可以执行远程主机的shell脚本文件,执行脚本时`-a`参数后跟脚本的路径
ansible test3 -m script -a '主控端脚本路径' #script模块可以在远程主机执行主控端存储的shell脚本文件,相当于scp+shell组合,执行脚本时`-a`参数后跟脚本的路径示例2
使用yum/dnf安装指定软件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16]ansible podman -m dnf -a 'name=vim state=installed'
podman | CHANGED => {
"ansible_facts": { #包含Ansible自动发现的信息,这里显示Python解释器的路径。
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true, #true 表示Ansible在目标主机上进行了更改。
"msg": "", #表示没有特定的消息返回。
"rc": 0, # 0 表示命令执行成功,返回码为0。
"results": [ #列出了执行的结果
"Installed: vim-enhanced-2:8.2.2637-21.el9.x86_64",
"Installed: vim-common-2:8.2.2637-21.el9.x86_64",
"Removed: vim-common-2:8.2.2637-20.el9_1.x86_64",
"Removed: vim-enhanced-2:8.2.2637-20.el9_1.x86_64"
]
}
name:后跟要操作的包名
state:表示对包执行的操作,installed(安装)、latest(更新或者安装最新)、removed(卸载)
- 示例3
启动某一项服务,并设置开机启动1
ansible test3 -m service -a'name=xxxx state=started enabled=yes'
常用模块
文件操作
fetch
将远程主机的文件拉取到ansible主机。
1 | ansible test3 -m fetch -a'src=/etc/fstab dest=/home/test' |
src:表示要拉取的远程主机的文件路径,只能是文件而不能是目录
dest:表示将文件存放在ansible的路径
拉取到ansible主机的fstab文件路径是/home/test/test3/etc/fstab,说明在指定dest路径下会自动创一个主机的文件夹(/home/test/test3),然后在该主机文件夹下也会自动创建拉取的文件在远程主机中的路径结构以及文件。
copy
将ansible主机上的文件拷贝到远程主机上。
src:用于指定需要copy的文件或目录
dest:用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数
content:当不使用src指定拷贝的文件时,可以使用content直接将content后的内容直接覆盖到dest的文件中国,src与content两个参数必有其一,否则会报错。
force :当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner :指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group :指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode :指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r–r–”,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
1 | #将ansible主机中/home/yyg/test.txt复制到test3的/home/yyg下 |
file
对文件的基本操作:创建文件或目录、删除文件或目录、修改文件权限等
path:指定要操作的文件或目录【必须参数】
state:可选参数
- directory:指定的path为一个目录,并创建目录;若目录存在则不进行操作
- touch:指定的path是文件,并创建文件;若存在则更新文件的时间戳
- link:指定的path是软连接
- hard:指定的path是硬连接
- absent:删除目录或者文件
src:当state是link或者hard时,还参数指向的是链接源
owner:用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
group:用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
mode:设置文件的权限,例如mode=777
recurse:当要操作目录时,recurse=yes表示递归操作
1 | #在test3上创建一个/home/yyg/test.txt文件 |
blockinfile
向指定的文件(默认尾部)插入文本,并自动插入标记
path:指定操作的文件
block:要插入的文本
marker:自定义标记,默认会在插入的文本上行和下行插入# BEGIN ANSIBLE MANAGED BLOCK
、# END ANSIBLE MANAGED BLOCK
。当marker=”{mark} 2020-04-20”,标记就会变成BEGIN 2020-04-20
、END 2020-04-20
,当然也可以不加{mark}
state:默认参数为present表示更新标记的文本;当state=absent时,表示删除标记的文本
backup:表示修改文件之前是否进行备份。
insertbefore:可以与正则表达式一起使用,表示将文本添加在正则匹配的行后(有多行可以匹配时,以最后一个满足正则的行为准)
insertafter:可以与正则表达式一起使用,表示将文本添加在正则匹配的行前(有多行可以匹配时,以最后一个满足正则的行为准);当insertafter=BOF时表示将文本插入在文件开头。
create: 操作的文件不存在时是否进行创建,默认create=no
1 | #向test3的/home/yyg/test.txt插入两行数字 |
1 | #向test3的/home/yyg/test.txt插入三行数字并自定义标记 |
1 | #对test3下/home/yyg/test.txt默认标记的文本进行修改 |
lineinfile
确保文件中有指定的一行;替换指定的一行;删除指定文本
path:指定要操作的文件
line:指定要操作的文本或者替换为的文本
state:默认是present,absent为删除指定的文本
regexp:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换;当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
1 | [root@test3 yyg]# more linefile |
1 | [root@test3 yyg]# more linefile1 |
1 | [root@qweasdzxc yyg]# more linefile2 |
1 | [root@qweasdzxc yyg]# more linefile3 |
find
在远程主机中查找符合条件的文件。
paths:必须参数,指定在那个路径下查找文件(不会在子目录中查找),可以有多个路径,路径之间用逗号隔开
recurse:默认是no,递归查找path下的子目录时需设定为yes
hidden:默认no,设置为yes时查找隐藏文件
file_type:默认情况下只会查找“文件”,当需要查找其他类型时,需进行指定:any、dierctory、file、link
patterns:指定查找的文件名,可以使用通配符。
use_regex:当patterns需使用正则表达式时,需设置为yes
contains:指定一个正则表达式搜索文件中的内容
age:根据文件mtime时间进行查找,单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。age=3d(mtime在3天前的文件)、age=-3d(mtime在进3天内的文件)
age_stamp:指定搜索的是文件的什么时间atime、ctime、mtime
size:根据文件的大小进行查找(单位t、g、m、k、b),size=3m(大于3m的文件)、size=-3m(小于等于3m的文件)
1 | 在test3主机的/home/yyg目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。 |
1 | 在test3主机的/home/yyg目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略。 |
1 | 在test3主机的/home/yyg目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。 |
replace
根据指定的正则表达式替换文件中所有匹配的内容。
path:必须参数,指定要操作的文件
regexp:必须参数,指定一个表达式。
replace:指定最终替换成的字符串
backup:修改前是否进行备份
1 | [root@zabbix ~]# ansible test3 -m replace -a'path=/home/yyg/find.txt regexp="abc" replace="ABC"' |
命令模块
command
在远程主机上执行命令,命令不会经过shell处理,例如指定的命令中含有重定向、管道等,这些字符就会失效。
chdir:指定一个目录,命令会在该目录下执行
creates:指定一个文件,当文件存在时不执行命令
removes:指定一个文件,当文件不存在时不执行命令
1 | test3下/home/yyg目录下有testfile,当这个文件存在时,在/home/yyg目录下执行命令ll |
shell
在远程主机上执行命令,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理,所以可以使用管道、重定向
chdir:指定一个目录,命令会在该目录下执行
creates:指定一个文件,当文件存在时不执行命令
removes:指定一个文件,当文件不存在时不执行命令
script
在远程主机上执行ansible主机上的脚本,不需要手动拷贝到远程主机后再执行
chdir:指定一个目录,命令会在该目录下执行
creates:指定一个文件,当文件存在时不执行命令
removes:指定一个文件,当文件不存在时不执行命令
1 | 在test3的/home/yyg 目录下执行ansible主机上的/home/script.sh |
三者区别
- 使用 command 模块来执行简单的命令,无需 shell 功能。
- 使用 shell 模块来执行复杂的命令,需要 shell 功能。
- 使用 script 模块来执行本地脚本文件,处理更复杂的操作。
系统类型模块
cron
相当于crontab命令。
【时间参数,默认情况下是*】
minute:定时执行中的分钟
hour:小时
day:日
month:月
weekday:星期
special_time:特殊时间用以替换定时的时间,reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)
user:执行定时任务的用户
job:指定定时执行的命令或者脚本
name:指定定时任务的名称,会在注释中显示
state:当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent
disabled:可以根据任务名将定时任务取消(即注释),也要将任务的job和设定的时间写准确,否则例如,当时间写错误时,被注释的任务时间将被改为写错的时间
backup:参数yes、no(默认),在修改定时任务时备份原定时任务清单,在/tmp目录下创建备份文件。
1 | 在test3主机上创建计划任务,任务名称为"test special time",任务将在重启时执行,任务内容为输出test字符 |
service
管理远程主机上的服务。
name:指定服务名
state:要将服务设定的状态started、stopped、restarted、reloaded
enabled:是否设置为开启启动,参数yes、no
1 | 将test3上的firewalld服务关闭,并设置为开启不启动 |
用户、组模块
user
管理远程主机上的用户
name:必须参数,指定用户名
home:指定用户的家目录
group:指定用户的数组
groups:指定用户的附加组。当用户原已有附加组,需要在此基础上添加时需要配合append参数使用,否则将会将原附加组覆盖,而不是添加
append:将groups参数提供的附加组,增添到用户的附加组中
shell:指定用户的默认shell
uid:指定用户的UID
state:参数present创建(默认)、absent,absent表示将用户删除
remove:当state=absent remove=yes时,表示将用户以及将用户的家目录进行删除
group
管理远程主机上的组
name:必须参数,指定组
state:present,absent,absent表示将组删除
gid:用于指定组的gid
包管理模块
yum_repository
管理远程主机上的yum仓库
name:必须参数,用于指定要操作的唯一仓库的ID,也就是每个仓库对应的”中括号”内的仓库ID
baseurl:用于设置yum仓库的baseurl
description:此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file:此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个’.repo’配置文件中可以存在多个yum源
enabled:此参数用于设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。
gpgcheck:此参数用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。
gpgcakey:当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥
state:默认值为present,当值设置为absent时,表示删除对应的yum源
1 | #使用如下命令在test3主机上设置ID为test的yum源,仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo |
yum
在远程主机上通过yum源管理软件包
name:必须参数,用于指定需要管理的软件包
state:指定软件包的状态;present(默认值)、installed、latest、absent、removed,其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包
enablerepo:用于指定安装软件包时临时启用的yum源,即使该yum源在没有启用的情况下
disablerepo:用于临时禁用yum源
disable_gpg_check:用于对rpm包的公钥gpg验证,默认为no,表示不用验证,直接安装;在对应yum源没有开启gpgcheck情况下需将该参数设置为yes,否则会报错无法进行安装
1 | 在test3上安装nginx |