模块简介
可以从ansible-doc -l | grep module_name来找出想要的模块。再使用ansible-doc -s module_name来查看此模块的用法。官方将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块 ,列表和说明:https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
关于模块的使用方法,需要注意的是”state”。很多模块都会有该选项,且其值几乎都包含有”present”和”absent”,表示肯定和否定的意思。
ansible绝大多数模块都天然具有幂等特性,只有极少数模块如shell和command模块不具备幂等性。所谓的幂等性是指多次执行同一个操作不会影响最终结果。例如,ansible的yum模块安装rpm包时,如果待安装的包已经安装过了,则再次或多次执行安装操作都不会真正的执行下去。再例如,copy模块拷贝文件时,如果目标主机上已经有了完全相同的文件,则多次执行copy模块不会真正的拷贝。ansible具有幂等性的模块在执行时,都会自动判断是否要执行。
常用模块
ping模块
测试主机是否是通的,用法很简单,不涉及参数:
1 | [root@localhost ~]# ansible 192.168.1.61 -m ping |
setup模块
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下: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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50//获取系统版本信息
[root@localhost ~]# ansible localhost -m setup -a "filter=ansible_distribution*"
localhost | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "CentOS",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "Core",
"ansible_distribution_version": "7.7",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
//查看主机内存信息
[root@node1 ~]# ansible home -m setup -a 'filter=ansible_*_mb'
home | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 1305,
"ansible_memory_mb": {
"nocache": {
"free": 1891,
"used": 121
},
"real": {
"free": 1305,
"total": 2012,
"used": 707
},
"swap": {
"cached": 0,
"free": 4999,
"total": 4999,
"used": 0
}
},
"ansible_memtotal_mb": 2012,
"ansible_swapfree_mb": 4999,
"ansible_swaptotal_mb": 4999
},
"changed": false
}
//将所有主机的信息输入到/tmp/setup目录下
[root@node1 ~]# ansible home -m setup --tree /tmp/setup
//会生成文件到/tmp/setup目录下,保存格式为字典格式
[root@node1 ~]# ll /tmp/setup/home
-rw-r--r-- 1 root root 8604 Jan 1 01:20 /tmp/setup/home
command与shell模块
ansible默认的模块是command,可以执行一些shell命令。但command不能解析变量(如$HOME)和某些操作符("<", ">", "|", ";"以及"&"),所以明确要使用这些不可解析的操作符时,使用shell模块来代替command。
shell和command的用法基本一样,实际上shell模块执行命令的方式是在远程使用/bin/sh来执行的,如/bin/sh ping。
除了以上2个模块之后,还有2个命令模块,
- raw模块:用法和shell 模块一样,其也可以执行任意命令,就像在本机执行一样;
- script模块:其是将管理端的shell 在被管理主机上执行,其原理是先将shell 复制到远程主机,再在远程主机上执行,原理类似于raw模块。
注:raw模块和comand、shell 模块不同的是其没有chdir、creates、removes参数,chdir参数的作用就是先切到chdir指定的目录后,再执行后面的命令,这在后面很多模块里都会有该参数 。
command模块包含如下选项:
1 | creates 一个文件名,当该文件存在,则该命令不执行 |
使用chdir的示例
1 | [root@localhost ~]# ansible 192.168.1.61 -m shell -a 'chdir=/tmp/ warn=false touch test1.file' |
以上2个命令都成功运行了,但是第一条命令是创建在/tmp,而raw命令是创建在家目录下。说明raw是没有chdir参数的。
1 | [root@localhost ~]# ansible 192.168.1.61 -m shell -a 'ls -l /tmp/test*' |
creates与removes示例
如下示例
1 | # /root/a.txt文件不存在时,是不会执行uptime指令的 |
script模块示例
要执行的脚本文件script.sh内容如下:
1 | #/bin/bash |
执行ansible指令:
1 | ansible 10.212.52.252 -m script -a 'script.sh' |egrep '>>|stdout' |
file 模块
file模块主要用于在远程主机上进行文件操作,可用于创建/删除目录和文件,file模块可以递归创建目录,但是不能在不存在的目录中创建文件,只能先创建目录,再在此目录中创建文件。
file模块包含如下选项:
1 | force: 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no |
使用示例: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
31
32
33
34
35
36
37
38
39#创建一个软链接
[root@node1 ~]# ansible home -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'
home | SUCCESS => {
"changed": true,
"dest": "/tmp/fstab",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 10,
"src": "/etc/fstab",
"state": "link",
"uid": 0
}
#删除刚刚创建的软链接
[root@node1 ~]# ansible home -m file -a 'path=/tmp/fstab state=absent'
home | SUCCESS => {
"changed": true,
"path": "/tmp/fstab",
"state": "absent"
}
#创建一个权限为644的/tmp/test的文件
[root@node1 ~]# ansible home -m file -a 'path=/tmp/test state=touch owner=root group=root mode=644'
home | SUCCESS => {
"changed": true,
"dest": "/tmp/test",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
[root@node1 ~]# ansible home -m shell -a 'ls -l /tmp/test'
home | SUCCESS | rc=0 >>
-rw-r--r-- 1 root root 0 Jan 3 22:45 /tmp/test
copy模块
其作用是复制本地文件到远程主机上。ansible copy会检查文件md5查看是否需要拷贝,相同则不会拷贝,否则会拷贝。
copy模块包含如下选项:
1 | backup: 在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no,默认为no。 |
示例如下:
1 | #可以使用content直接写内容到远程主机上,默认不会备份。 |
template模块
与copy模块类似,但ansible会渲染里面的变量。在实际应用中,我们的配置文件有些地方可能会根据远程主机的配置的不同而有稍许的不同,template可以使用变量来接收远程主机上setup收集到的facts信息,针对不同配置的主机,定制配置文件。用法大致与copy模块相同。
例如centos6与centos7所使用的yum源不一样,可以使用template来简化操作。可以将以下内容保存为repo.j2文件:
1 | [epel] |
然后在task复制就可以了。
1 |
|
这样就实现了一个文件适合2个系统的需求了。
service与systemd模块
用于管理服务
该模块包含如下选项:
1 | arguments: 给命令行提供一些选项 |
使用示例:
1 | [root@localhost ~]# ansible 192.168.1.61 -m systemd -a 'name=sshd state=started' |head -n 7 |
主要看changed,如果是false表示未进行操作或者修改。
ansible test -m service -a "name=httpd state=started enabled=yes"
asnible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"
cron模块
用于管理计划任务,包含如下选项:
1 | backup: 对远程主机上的原任务计划内容修改之前做备份 |
示例:
1 | #创建一个crontab |
ansbile cron在新建一个模块时,在创建任务的上面,会加上”#Ansible: name”这个主题。
yum模块
使用yum包管理器来管理软件包,name需要配合state来使用,如果state指定为present/installed/latest将安装包,其中latest是安装最新包,默认为present。如果指定为absent/removed则用于卸载包。其选项有:
1 | config_file: yum的配置文件 |
示例如下:
1 | ansible test -m yum -a 'name=httpd state=latest' |
如果目标主机有安装了包,则changed返回false1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19[root@node1 ~]# ansible node2 -m yum -a "name=screen state=latest"
192.168.1.122 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror, security\nLoading mirror speeds from cached hostfile\n * base: mirrors.btte.net\n * extras: mirrors.btte.net\n * updates: mirrors.aliyun.com\nSetting up Install Process\nResolving Dependencies\n-->Running transaction check\n---> Package screen.x86_64 0:4.0.3-19.el6 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n screen x86_64 4.0.3-19.el6 base 494 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package(s)\n\nTotal download size: 494 k\nInstalled size: 795 k\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r Installing : screen-4.0.3-19.el6.x86_64 1/1 \n\r Verifying : screen-4.0.3-19.el6.x86_64 1/1 \n\nInstalled:\n screen.x86_64 0:4.0.3-19.el6 \n\nComplete!\n"
]
}
[root@node1 ~]# ansible node2 -m yum -a "name=screen state=latest"
192.168.1.122 | SUCCESS => {
"changed": false,
"msg": "",
"rc": 0,
"results": [
"All packages providing screen are up to date",
""
]
}
yum_repository模块
用于配置yum源。可以实现非常完整的yum仓库配置。但是一般只需简单的添加yum源即可。
1 | baseurl # 地址 |
例如:
1 | [root@localhost yaml]# ansible 192.168.1.61 -m yum_repository -a 'name=aliyun_epel description="epel repo" baseurl=http://mirrors.aliyun.com/epel/7/$basearch/ gpgcheck=no enabled=yes' |
user模块与group模块
user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
1、user模块
1 | home: 指定用户的家目录,需要与createhome配合使用 |
使用示例:
1 | user: name=johnd comment="John Doe" uid=1040 group=admin |
注:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
1 | echo "123456" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin |
使用上面的密码创建用户
1 | [root@node1 ~]# ansible node2 -m user -a 'password="$1$RK0XivXG$Bju.cNS4InMrnFRH.ykDS1" name="fdm" createhome="yes"' |
删除用户,连同家目录一起删除1
2
3
4
5
6
7
8
9
10
11[root@node1 ~]# ansible node2 -m user -a 'name="fdm" state="absent" remove="yes"'
192.168.1.122 | SUCCESS => {
"changed": true,
"force": false,
"name": "fdm",
"remove": true,
"state": "absent"
}
[root@node1 ~]# ansible node2 -m shell -a 'ls -la /home/fdm'
192.168.1.122 | FAILED | rc=2 >>
ls: cannot access /home/fdm: No such file or directory
不同的发行版默认使用的加密方式可能会有区别,具体可以查看/etc/login.defs文件确认,centos 6.5版本使用的是SHA512加密算法。
2、group示例
ansible all -m group -a 'name=somegroup state=present'
synchronize模块
synchronize模块用于实现rsync的简单版常用功能,它无法实现完整版的rsync,毕竟rsync功能太多太细致。如果要使用rsync,还是应该使用command或shell模块来调用rsync命令。其参数如下:
1 | archive: 归档,相当于同时开启recursive(递归)、links、perms、times、owner、group、-D选项都为yes,默认该项为开启 |
使用示例:
1 | src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync" |
filesystem模块
在块设备上创建文件系统。选项:
1 | dev: 目标块设备 |
示例:
1 | #先创建块设备 |
mount模块
配置挂载点,选项:
1 | fstype:必选项,挂载文件的类型 |
示例:
1 | #挂载刚刚格式化成功的diskimg |
其他用法:
1 | name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present |
get_url 模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
1 | sha256sum: 下载完成后进行sha256 check; |
示例:
1 | [root@node1 ~]# ansible node2 -m get_url -a 'url=https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png dest=/tmp' |
archive模块
用于在远端压缩文件。当然,前提是在远端主机上要有对应的压缩工具。支持zip/gz/tar/bz2。模块包含如下选项:
1 | dest # 目标归档文件名。除非path指定要压缩的是单文件,否则需要dest选项 |
示例:
1 | # 将目录/path/to/foo/压缩为/path/to/foo.tgz |
unarchive模块
默认复制ansible端的归档文件到被控主机,然后在被控主机上进行解包。如果设置选项remote_src=yes,则表示解包被控主机上的归档文件。
要求在被控主机上有对应的解包命令。unzip命令用于解压”.zip”文件,gtar(tar包提供)命令用于解压”.tar”、”.tar.gz”、”.tar.bz2”和”.tar.xz”。模块包含如下选项:
1 | copy: 在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 |
示例如下:
1 | # 复制ansible端的foo.tgz文件到远端并解包 |
debug模块
用于输出自定义的信息,类似于echo、print等输出命令。ansible中的debug主要用于输出变量值、表达式值,以及用于when条件判断时。使用方式非常简单。
1 | msg # 调试输出的消息 |
示例:
1 | [root@localhost yaml]# cat test.yaml |
上述 var=ret 将所有的信息都输出来了,
wait_for模块
有些时候任务之间对状态、文件、端口等资源是有依赖关系的,只有满足了前提,任务才会继续。wait_for模块就是用于判断任务在满足什么条件的情况下会继续。主要用来判断端口是否开启、文件是否存在、文件中是否存在某些字符串。
1 | delay # 在检查操作进行之前等待的秒数 |
示例:
1 | # 连接上主机后10秒后才检查8000端口是否处于开放状态,300秒(默认值)内未开放则超时。 |