ansible常见模块
查看模块的帮助说明:
ansible-doc 模块名【详细说明】
ansible-doc -s 模块名【简短说明】
1、command模块
可忽略-m选项,此命令不支持$VARNAME <> | ; & 等特殊符号,用shell模块可实现。
常用参数:
chdir:
【此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。】
creates:
【看到 creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果 /testdir/test文件存在,就不执行我们指定的命令。】
removes:
【与 creates 参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果 /testdir/tests 文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件。】
[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "chdir=/testdir ls"
ansible-demo3 | SUCCESS | rc=0 >>
testfile1
testfile2
【chdir 参数表示执行命令之前,会先进入到指定的目录中,所以上面命令表示查看 ansible-demo3 主机上 /testdir 目录中的文件列表】
[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "creates=/testdir/testfile1 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
skipped, since /testdir/testfile1 exists
【creates=var;判断var存在时就不执行后续命令】
[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "creates=/testdir/testfile3 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "removes=/testdir/testfile1 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
【removes=var;判断var存在时就才执行后续命令】
[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "removes=/testdir/testfile3 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
skipped, since /testdir/testfile3 does not exist
2、shell模块
比command模块详细,使用的是shell执行命令
ansible all -m shell -a 'echo $HOSTNAME' 【注意得用单引号】
调用bash执行命令,类似cat /tmp/stan.md | awk -F '|' '{print $1}' &>/tmp/test.txt 这种负载的命令,使用shell模块也可能失败;
解决办法:写入脚本里,copy到远程执行,再把需要的结果拉回执行命令的机器
举例:shell模块
tasks:
- name: test
shell: mv *.txt /tmp 【使用通配符移动txt后缀的文件到/tmp目录】
args:
chdir: /hudechao 【参数chdir表示执行shell命令之前先切换到此目录下】
executable: /bin/bash 【参数executable表示使用/bin/bash解释器就可以在shell模块中使用通配符的元字符】
tasks:
- name: test
shell: echo '123' >> ../test_file/file.txt
args:
executable: /bin/bash
chdir: /hudechao/ansible/test_file 【注:shell模块操作文件等,chdir的路径必须是文件所在的绝对路径否则shell模块有可能执行失败】
tasks:
- name: test
shell: echo '456' >> /tmp/file.txt 【如果是创建文件/tmp/file.txt,可以不用指定路径,不过,最好是指定chdir路径】
args:
chdir: /tmp
常用参数:
chdir: 在执行shell命令之前,首先进入到chdir参数指定的目录中
creates: 此参数指定一个文件,当指定的文件存在时,就不执行对应shell命令
removes: 此参数指定一个文件,当指定的文件不存在时,就不执行对应shell命令
executale:默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,如果要使用其它类型的shell执行,指定shell文件即可。
3、script模块
ansible all -m script -a '/home/software/host.sh'
4、copy模块
把本地的src文件复制到远程目标主机上
ansible all -m copy -a 'src=/home/software/list.sh dest=/home/software backup=yes'
【一般要自定源:src、指定目标位置:dest、如果有就备份backup=yes、等等】
ansible all -m copy -a 'src=/home/software/list.sh dest=/home/software backup=yes mode=755 owner=hudechao'
【赋值过去并修改权限和属主】
ansible all -m copy -a 'content=hahaha dest=/home/software/file.txt'
【利用conten的内容直接生成文件file.txt】
- name: copy test
copy:
sec: /home/software/list.sh
dest: /home/software
backup: yes
copy模块参数:
src: 将本地路径复制到远程服务器; 可以是绝对路径或相对的。如果是一个目录,它将被递归地复制。如果路径以/结尾,则只有该目录下内容被复制到目的地,
如果没有使用/来结尾,则包含目录在内的整个内容全部复制。
dest: 目标绝对路径。如果src是一个目录,dest也必须是一个目录。如果dest是不存在的路径,并且如果dest以/结尾或者src是目录,则dest被创建。如果src和dest
是一个文件,如果dest的父目录不存在,任务将失败
backup: yes/no(默认值no) 在覆盖之前将原文件备份,备份文件包含时间信息
content: hahaha 当用content代替src参数的时候,可以把文档的内容设置到特定的值
owner: 设置目标文件或目录的所属用户
group: 设置目标文件或目录的所属组
mode: 设置目标文件或目录的权限:一般以0开头,如0755
remote_src: 如果设置为yes(默认值为No),它会从目标主机上先搜索src文件
validate: yes/no(默认值no),复制前是否检验需要复制目的地的路径
5、fetch模块
从客户端取文件至本机上,目录可先tar
ansible all -m fetch -a 'src=/home/software/list.sh dest=/home/software'
fetch:
src: /home/33.txt //客户端的IP地址假设为:10.132.42.36;src的绝对路径必须是文件不能是目录
dest: /tmp/hudechao
#flat: yes //flat表示直接地
1、如果不加flat: yes
则复制到dest目录下保存方式为:/tmp/hudechao/10.132.42.36/home/33.txt
2、如果加上flat:yes
则dest:/tmp/hudechao/ 目标路径末尾必须带上 / ,且如果dest目录下有33.txt同名文件,则会覆盖掉
6、打压缩包和解压缩包模块
archive 压缩
unarchive 解压缩
- unarchive: src=foo.tgz dest=/var/lib/foo 【解压缩foo.tgz包,解压到/var/lib/foo目录下】
属性:remote_src=no/yes【默认值no,表示要从本地复制压缩包到目标主机解压;yes表示压缩包在目标主机上已存在且如果src是URL,则从网上下载并解压】
- name: test
unarchive:
src: /home/package/file.tar
dest: /hudechao/ansible/unarchive
owner: hudehcao
group: hudechao
mode: 0755
[unarchive模块自己的赋权限选项:owner和group,最后修改的只是针对在/hudechao/ansible/unarchive/file.txt解压后的目标文件file.txt]
[如果目录下有其它文件,则不会更改其权限,如/hudechao/ansible/unarchive/test.txt,test.txt的权限不会被更改]
7、file 模块
设置文件属性
ansible all -m file -a 'path=/home/software/file.txt owner=root mode=0755'
ansible all -m file -a 'src=/home/software/testfile dest=/home/software/testfile_link state=link'
根据state的值创建软连接;state的不同值代表不用的含义;ansible-doc file查看帮助命令state
ansible all -m file -a 'name=/home/123 state=touch' 【在远程机器上创建文件/home/123】
recurse=yes/True 表示递归设置属性,当创建目录时,如递归的设置目录的属组都是一个。
设置权限mode=0755,首位带上0否则可能出现赋权限差异问题。
- name: test
file:
path: /hudechao/test [这里功能是:对/test这个目录进行赋权限]
owner: hudechao
group: hudechao
recurse: yes [recurse值设置为yes表示:如果test目录下还有文件或目录,就递归设置其权限]
8、hostname模块
管理主机名
ansible all -m hostname -a "name=Tom"
9、cron模块
计划任务,支持时间:minute、hour、day、month、weekday
ansible all -m cron -a 'minute=*/5 job="ls /root" name=Check' 【创建时钟同步任务】
ansible all -m cron -a 'state=absent name=Check' 【删除计划任务,这里name是对定时任务的别名】
ansible all -m cron -a 'disabled=true job="ls /root" name=Check' 【禁用定时任务或者yes,job和name都必须有】
ansible all -m cron -a 'disabled=false job="ls /root" name=Check' 【启用定时任务或者no,job和name都必须有】
10、yum模块
yum包下载安装
ansible all -m yum -a 'name=httpd state=latest' 【安装】
ansible all -m yum -a 'name=httpd,vsftpd,apache state=latest' 【安装多个逗号隔开】
ansible all -m yum -a 'name=flatpak-libs-0.8.8-4.el7_5.x86_64.rpm state=latest' 【指定安装单个rpm包】
ansible all -m yum -a 'name=httpd state=absent' 【删除卸载】
11、service模块
ansible all -m service -a 'name=httpd state=started'
ansible all -m service -a 'name=httpd state=restarted'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
12、user模块
ansible all -m user -a 'name=hudechao comment="test user" uid=1048 home=/home/hudechao group=root'
ansible all -m user -a 'name=hudechao system=yes home=/home/hudechao group=root'
ansible all -m user -a 'name=hudechao state=absent remove=yes' 【删除用户及家目录;remove=yes表示删除家目录】
shell命令查看用户是否被创建:getnet passwd 用户名
ansible all -m user -a 'name=hudechao group=root' password={{ user_passwd | password_hash('sha512') }} generate_ssh_keys=yes update_password=yes
【password={{ user_passwd | password_hash('sha512') }} 表示创建用户设置密码并对密码使用sha512加密算法加密】
【generate_ssh_keys=yes 表示创建用户时,也生成秘钥文件id_rsa.pub,id_rsa】
- name: create user
user:
name: hudechao
uid: 1048
home: /home/hudechao 【设置用户hudechao的家目录】
group: hudechao 【group表示为用户hudechao设置唯一的属组】
groups: hudechao,Lily 【groups表示为用户hudechao添加多个属组】
state: absent 【表示删除用户hudechao】
13、group模块
管理用户组
ansible all -m group -a 'name=hudehcao system=yes'
ansible all -m group -a 'name=hudehcao state=absent'
14、lineinfile 模块
修改文件内容
tasks:
- name: test
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^MaxStartup.*'
line: 'MaxStartup 1000:30:1000'
regexp: '^MaxStartup.*' 匹配MaxStartup的'M'开头的行;用line的值去替换,当没有正则匹配到就插入line的值
regexp: '^(MaxStartup)' 匹配以MaxStartup开头的行;
regexp: 'MaxStartup$' 匹配以MaxStartup的'p'结尾的行;
regexp: '(MaxStartup)$' 匹配以MaxStartup结尾的行;
- name: test
lineinfile:
path: /home/file.txt
regexp: '^Max'
insertafter: '^Jerry'
insertbefore: '^Jerry'
line: '123'
模块参数解释:
insertafter: '^Jerry' ,也是正则表达式,表示如果regexp的正则表达式没有匹配到时,就匹配 '^Jerry',并且匹配到后即将line的值插入在'^Jerry'的后面(另起一行)
insertbefore: '^Jerry' ,也是正则表达式,表示如果regexp的正则表达式没有匹配到时,就匹配 '^Jerry',并且匹配到后即将line的值插入在'^Jerry'的前面(另起一行)
lineinfile模块还可实现文件内容的注释:
- name: test
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^MaxStartup.*'
line: '#MaxStartup 1000:30:1000'
regexp: '^MaxStartup.*' 匹配MaxStartup开头的行;用line的值去替换,替换的开头加入了#号即表注释
15、timezone模块
timezone: name="Asia/Shanghai"
16、setup模块
setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
1)、举例:获取ansible-demo3 主机的信息:
[root@ansible-manager ~]# ansible ansible-demo3 -m setup
ansible-demo3 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.128.83"
"ansible_all_ipv6_addresses": [
"fe80::250:56ff:fe35:785f"
"ansible_apparmor": {
"status": "disabled"
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/02/2015",
......
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "VMware",
"gather_subset": [
"all"
"module_setup": true
"changed": false
返回的信息非常多,很多情况我们并不需要全部的信息,可以通过过滤获得指定的信息。
2)、设置filter参数指定需要获取的参数:获取 ansible-demo3 主机的 IPV4 地址
[root@ansible-manager ~]# ansible ansible-demo3 -m setup -a "filter=ansible_all_ipv4_addresses"
ansible-demo3 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.128.83"
"changed": false
3)、通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息
[root@ansible-manager ~]# ansible ansible-demo3 -m setup -a "filter=*mb"
ansible-demo3 | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 1542,
"ansible_memory_mb": {
"nocache": {
"free": 1654,
"used": 168
"real": {
"free": 1542,
"total": 1822,
"used": 280
"swap": {
"cached": 0,
"free": 2047,
"total": 2047,
"used": 0
"ansible_memtotal_mb": 1822,
"ansible_swapfree_mb": 2047,
"ansible_swaptotal_mb": 2047
"changed": false
4)、其他常用信息列出如下:
ansible_all_ipv4_addresses: 仅显示ipv4的信息
ansible_devices: 仅显示磁盘设备信息
ansible_distribution: 显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version: 仅显示系统版本
ansible_machine: 显示系统类型,例:32位,还是64位
ansible_eth0: 仅显示eth0的信息
ansible_hostname: 仅显示主机名
ansible_kernel: 仅显示内核版本
ansible_lvm: 显示lvm相关信息
ansible_memtotal_mb: 显示系统总内存
ansible_memfree_mb: 显示可用系统内存
ansible_memory_mb: 详细显示内存情况
ansible_swaptotal_mb: 显示总的swap内存
ansible_swapfree_mb: 显示swap内存的可用内存
ansible_mounts: 显示系统磁盘挂载情况
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)
17、cron模块
cron 模块可以帮助我们管理远程主机中的计划任务,功能相当于 crontab 命令
1)、常用参数
minute参数: 此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即 minute=5,当不使用此参数时,分钟设定位的值默认为”*”
hour参数: 此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即 hour=1,当不使用此参数时,小时设定位的值默认为”*”
day参数: 此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”*”
month参数: 此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”*”
weekday参数:此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”*”
【上述同shell的crontab一样:分、时、日、月、周】
special_time参数:在上述示例3与示例4中,计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有(即special_time=如下各值) reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)
user参数: 此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job参数: 此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令
name参数: 此参数用于设置计划任务的名称(名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务)
state参数: 当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent
disabled参数:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做
backup参数: 如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes
2)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”crontab test”,任务于每天1点5分执行,任务内容为输出test字符
ansible ansible-demo3 -m cron -a " name='crontab test' minute=5 hour=1 job='echo test' "
3)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出 test 字符
ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "
4)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”special time test”,任务将在重启时执行,任务内容为输出 test 字符
ansible ansible-demo3 -m cron -a " name='special time test' special_time=reboot job='echo test' "
5)、举例:
由于”special time test”已经存在,所以,当我们再次操作同名的任务时,ansible 将会认为是修改原来的任务。执行如下命令,原计划任务会被修改,因为启用了 backup,所以任务在修改前会被备份
ansible ansible-demo3 -m cron -a " name='special time test' special_time=hourly job='echo test' backup=yes "
6)、举例:
任务”special time test”已经存在于 ansible-demo3 主机中,如果我们想要删除这个计划任务,可以执行如下命令,删除任务的同时可以进行备份
ansible ansible-demo3 -m cron -a " name='special time test' state=absent backup=yes "
7)、举例:
默认操作的是 root 用户的计划任务,如果想要操作远程主机中其他用户的计划任务,可以指定要操作的用户
ansible ansible-demo3 -m cron -a "user=ding name='special time test' special_time=hourly job='echo test' "
8)、举例:
注释“crontab test” 的计划任务
ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' disabled=yes backup=yes"
18、格式化磁盘(filesystem模块):
ansible all -m filesystem -a "fstype=ext4 dev=/dev/sdb"
19、创建挂载(mount模块):(/tmp/app目录挂载到/dev/sdb磁盘下)
ansible all -m mount -a 'name=/tmp/app src=/dev/sdb fstype=ext4 state=mounted opts=rw'
其中state的可选值为:absent\mounted\umounted
20、template模块
- name: test
template:
src: /home/ansible/test.conf.j2
dest: /home/hudechao/test.conf
owner: hudechao
group: hudechao
[template模块可以认为是copy模块功能一样,复制本地的test.conf.j2文件到目标主机路径下]
[赋权限选项owner和group,只针对目标路径下的test.conf文件,如果/home/hudechao/路径下有其它文件或目录则不会被更改]
21、fail 模块,接输出自定义信息,通常和when模块连用
- name: test
fail:
msg: "[Erro], The ID is not defined"
when: ID is not defined
- name: test1
ping:
register: ping_test
- name: test2
fail:
msg: "Ping test is fail"
when: ping_test.ping!="pong"
[fail模块的msg选项,一般写成如上格式,写成fail: msg= "message"可能会报错]
when判断变量有无被定义
-name: 检查变量名是否被定义
fail:
msg: "[Error] varname is not defined"
when: varname is not defined 【这里就是判断如下的变量文件(/vars/var1.cfg、./vars/var2.cfg)中有无定义变量名varname】
-name: 配置用户互信
hosts: localhost
remote_user: root