Ansible常用模块详解

Ansible常用模块介绍

ansible内置了丰富的模块供用户使用,但是经常使用到的模块却不多。本文主要记录了ansible的一些常用模块以及详细参数 、注意事项等 ,供大家学习。

模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) “执行什么动作”

ansible官方网站:

https://docs.ansible.com/

命令模块

ping

应用场景:
测试主机和ansible之间的连通性
举例:
对webserver主机组测试是否连通

1
ansible webservers -m ping

command 基础模块

概要
命令模块 适合使用简单的命令(cat、ls) 无法支持”<”,”>”,”|”,”;”,”&”等符号
官方文档:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

参数解释
chdir在执行命令前,进入到指定目录中
creates判断指定文件是否存在,如果存在,不执行后面的操作
removes判断指定文件是否存在,如果存在,执行后面的操作
free_form必须要输入一个合理的命令
1
2
3
4
5
[root@zabbix ~]# ansible webservers -m command -a "hostname"
10.1.1.60 | CHANGED | rc=0 >>
db01
10.1.1.20 | CHANGED | rc=0 >>
web01

shell 万能模块

概要
类似command模块升级版—万能模块
官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module

参数解释
chdir在执行命令前,进入到指定目录中
creates判断指定文件是否存在,如果存在,不执行后面的操作
removes判断指定文件是否存在,如果存在,执行后面的操作
free_form必须要输入一个合理的命令

文件模块

copy 拷贝文件
功能:实现主控端向目标主机copy文件。

官网文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html#copy-module

参数:

1
2
3
4
5
6
7
#src    主控端文件位置
#dest 要将源文件复制到远程机器的绝对路径,必选项。
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode 文件的权限设定,执行a+x这种方式
#backup 在覆盖之前将源文件备份,备份文件包含时间信息。 如果与远程主机下的文件不一致,才会备份
#directory_mode:递归设定目录的权限。

拷贝文件:

1
ansible webservers -m copy -a "src=/root/tcp dest=/tmp/"

拷贝文件,设置权限:

1
ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ mode=600"

在传输数据文件信息时对远程主机源文件进行备份:

1
ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ backup=yes"

在传输文件时修改文件的属主和属组信息:

1
ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ owner=nobody group=nobody"

创建一个文件并直接编辑文件的信息:

1
ansible webservers -m copy -a "content='www.boysec.cn' dest=/tmp/tcp"

file 设置文件属性

file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

包含如下选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况

state:
 =directory:如果目录不存在,就创建目录
 =file:即使文件不存在,也不会被创建
 =link:创建软链接
 =hard:创建硬链接
 =touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
 =absent:删除目录、文件或者取消链接文件

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 创建一个目录,如果目录存在,则不做任何操作。
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec state=directory'

# 创建一个文件,如果文件存在,则更新文件时间,与touch命令相同
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch'

# 创建软链接文件信息
ansible 10.1.1.60 -m file -a 'src=/tmp/boysec/text dest=/tmp/test state=link'

# 创建硬链接文件信息
ansible 10.1.1.60 -m file -a 'src=/tmp/boysec/text dest=/tmp/text state=hard'

# 删除远程文件或者是目录
ansible 10.1.1.60 -m file -a 'dest=/tmp/text state=absent'
ansible 10.1.1.60 -m file -a 'path=/tmp/test state=absent'

# 创建文件时,指定属主或者修改属主
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch owner=nobody group=nobody'
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch owner=root'

#创建文件或目录时,指定权限 或者修改权限
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text1 state=touch mode=0644'

#递归修改属主
ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec state=directory owner=mysql recurse=yes'

fetch 批量拉取数据

它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。

  • – src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。
  • – dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存。

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fetch_module.html

将/tmp/tcp拉取到ansible管理端本地的/tmp/目录下:

1
ansible 10.1.1.60 -m fetch -a 'src=/tmp/tcp dest=/tmp/tcp-{{ inventory_hostname }} flat=yes'

定时任务

cron

cron模块主要用于添加、删除、更新操作系统的crontab任务计划

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/cron_module.html

cron模块使用详解:

1
2
3
4
5
6
7
8
9
10
11
name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59, * ,*/2)
hour:时(0-23, * ,*/2)
day:日(1-31, * ,*/2)
month:月(1-12, * , */2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令,state要等于present
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent

实例:

1
2
3
4
5
6
7
8
9
ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' backup=yes job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'"
也可以简写
ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'" #其他默认为*

# 删除
ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' state=absent"

# 注释定时任务
ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1' disabled=yes"

挂载模块

mount

用于批量管理主机进行挂载卸载操作

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/posix/mount_module.html

mount模块参数:

1
2
3
4
5
6
7
8
9
10
src:  需要挂载的存储设备或文件信息
path: 指定目标挂载点目录
fstype: 指定挂载时的文件系统类型
state
present/mounted --- 进行挂载
present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****
absent/unmounted --- 进行卸载
absent: 会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
unmounted: 会实现立即卸载, 但是不会会删除fstab文件信息 *****

实例:

1
2
3
4
5
6
7
8
9
10
# 实现远程批量挂载操作
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=present"
## 以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=mounted"
## 以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载


# 卸载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=absent"
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=unmounted"

安装模块

yum_repository

yum_repository模块管理远程主机上的yum仓库

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_repository_module.html

参数解释:

1
2
3
4
5
6
7
8
name	:相当于.repo文件定义中括号的[仓库ID]
baseurl :相当于.repo文件中baseurl
description :相当于.repo文件中的name
file :相当于.repo文件的名称,不使用时默认以name加.repo命令
enabled=yes|no :相当于.repo文件中enabled
gpgcheck=yes|no :相当于.repo文件中gpgcheck
gpgkey :前提是gpgcheck=yes,相当于.repo文件中gpgkey,验证gpg公钥
state=present|absent :默认present,absent表示删除

实例:

  1. 创建阿里云epel源
1
ansible all -m yum_repository -a 'name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=yes gpgcheck=no gpgcakey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 state=present file=AlicloudEpel'
  1. 删除阿里云epel源
1
ansible all -m yum_repository -a 'file=AlicloudEpel name=epel state=absent'

yum

使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_module.html

模块参数解释:

1
2
3
4
5
6
7
8
name  --- 指定安装软件名称
state --- 指定是否安装软件
installed --- 安装软件
present
latest
absent --- 卸载软件
removed
latest --- 安装最新的软件

安装软件:

1
ansible 10.1.1.20 -m yum -a "name=iotop state=installed"

服务模块

service

用于管理服务运行状态

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html#service-module

模块参数解释:

1
2
3
4
5
6
name:   --- 指定管理的服务名称
state: --- 指定服务状态
started 启动
restarted 重启
stopped 停止
enabled --- 指定服务是否开机自启动

启动服务

1
ansible 10.1.1.60 -m service -a "name=nfs state=started enabled=yes" 

用户模块

group

远程批量创建用户组信息

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/group_module.html

参数解释:

1
2
3
4
5
gid	 :指定创建的组ID信息
name : 指定创建组名称信息
state
absent : 删除指定的用户组
present : 创建指定的用户组

创建用户组:

1
ansible 10.1.1.12 -m group -a "name=boysec gid=1111"

删除用户组:

1
ansible 10.1.1.12 -m group -a "name=boysec gid=1111 state=absent"

user

远程批量创建用户信息

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html

参数解释:

1
2
3
4
5
6
7
8
9
name        指定用户名信息
uid        指定用户uid信息
group      指定用户主要属于哪个组
groups      指定用户属于哪个附加组信息
shell      指定是否能够登录
create_home 是否创建家目录信息
home 指定家目录创建在什么路径默认/home
password    * 设置密码时不能使用明文方式,只能使用密文方式
可以给用户设置密码还可以给用户修改密码

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 普通用法
ansible 10.1.1.60 -m user -a "name=boysec01"
# 指定用户uid信息
ansible 10.1.1.60 -m user -a "name=boysec02 uid=1111"

# 指定用户组信息
ansible 10.1.1.60 -m user -a "name=boysec03 group=boysec02"
ansible 10.1.1.60 -m user -a "name=boysec04 groups=boysec02"

# 创建虚拟用户
ansible 10.1.1.60 -m user -a "name=boysec create_home=no shell=/sbin/nologin"

# 给指定用户创建密码
# 方法一
PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
生成密文密码信息方法:
[root@zabbix ]# ansible 10.1.1.60 -m debug -a "msg={{ '123456' | password_hash('sha512', 'boysec01') }}"
10.1.1.60 | SUCCESS => {
"msg": "$6$boysec01$OE3fthAQpwCRsNwaSZbFN0/CW/aJSAOVtDqK1KoyZ.IdfcfcdNSWTStWydm/pCxH3UlF0NsRngNOSsP1LvvQi."
}
# 方法二
yum install -y python-pip
pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password: $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.

ansible 10.1.1.60 -m user -a "name=boysec password='$6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk'"

# 删除用户
ansible 10.1.1.60 -m user -a "name=boysec02 state=absent"

压缩解压

unarchive解压

unarchive模块:从管理端选择文件后将其解包. 解压缩的功能

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/unarchive_module.html

参数解释:

1
2
3
4
5
dest (required)  :解压到目标主机的路径信息
src (required)  :本地端需要解压的压缩包的路径信息
copy          :默认为yes,当copy=yes,则把本地的压缩包拷贝到远程主机,然后执行压缩,那么当copy=no时则直接解压远程主机上给出的压缩包。
mode          :设置解压缩后的文件权限
owner :解压后文件或目录的属主

实例:

1
2
ansible 10.1.1.60 -m unarchive -a "dest=/tmp/boysec src=test.tar.gz"    # 解压远程的包到受控端
ansible 10.1.1.60 -m unarchive -a 'src=/package/test.tar.gz dest=/tmp/ copy=no' # 解压受控端本地的包到本地目录

archive压缩

archive模块: 压缩命令的模块

参数解释:

1
2
3
path			:需要压缩的文件或目录
dest :压缩后的文件位置
format:bz2, gz, tar, xz, zip :指定打包的类型

实例:

1
ansible 10.1.1.60 -m archive -a 'path=/var/log dest=/tmp/system_log.tar.gz'

文件修改

lineinfile

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html

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

参数解释:

1
2
3
4
5
6
7
8
9
path	 :必须参数,指定要操作的文件。
line : 使用此参数指定文本内容。
regexp :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state :当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
backrefs :默认是yes,backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容,backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。
insertafter :借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore :借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup :是否在修改文件之前对文件进行备份。
create :当要操作的文件并不存在时,是否创建对应的文件。

实例:

1
2
ansible 10.1.1.60 -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#" backup=yes' 
ansible 10.1.1.60 -a "cat /etc/fstab"

replace

replace模块:可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html

参数解释:

1
2
3
4
5
6
7
path	:必须参数,指定要操作的文件,2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。

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

replace : 指定最终要替换成的字符串。

backup :是否在修改文件之前对文件进行备份,最好设置为yes。

实例:

1
2
ansible 10.1.1.60 -m replace -a "path=/etc/fstab regexp='(^UUID.*)' replace='#\1' backup=yes" # 不要重启系统
ansible 10.1.1.60 -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1' backup=yes"

下载文件

get_url 模块

官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html

该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:

1
2
3
4
5
6
sha256sum:下载完成后进行sha256 check;
timeout:下载超时时间,默认10s
url:下载的URL
url_password、url_username:主要用于需要用户名密码进行验证的情况
dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。
headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。

实例:

1
ansible 10.1.1.60 -m get_url -a "dest=/tmp/ url='http://download.boysec.cn/msfinstall' mode=755"

获取主机信息及调试

setup

可以用来查看远程主机的一些基本信息:

1
ansible 10.1.1.20 -m setup

只将主机某个信息打印出来

1
ansible rsync -m setup -a "filter=ansible_all_ipv4_addresses"

常用主机信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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个数(只显示总的个数)。

debug

使用 Ansible 最痛苦的就是远程命令没有生效,但又看不到报错信息,Debug 就是为了解决这个烦恼。

1
2
3
msg:调试输出的消息
var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:debug的级别(默认是0级,全部显示)

实例:

1
2
3
4
5
6
7
8
9
- hosts: web
remote_user: root
tasks:
- name: Get path
shell: |
pwd
register: result
- name: Get debug info
debug: var=result verbosity=0

result.cmd 运行的命令
result.stdout 运行的结果