)在上一篇文章中介绍过,Ansible通过调用特定的模块来执行特定的任务,所以模块对于Ansible来说是非常重要的。这里我们通过Ansible的ad-hoc模式来介绍Ansible的常用模块。
1、ad-hoc模式
Ansible主要通过ad-hoc和playbook两种模式来执行任务。ad-hoc通过Ansible提供的ansible命令一次执行一个任务。
ad-hoc的常用选项如下:
- -m:指定执行任务要调用的模块,如果不指定默认使用command模块
- -a:指定调用模块的对应参数,模块对应的参数及用法可以使用ansible-doc –s 模块名来查看
- -u:使用被管理主机的指定用户执行任务
- -k:提示输入SSH登录密码而不是基于密钥的验证
- -b:提升权限
- --become-method:指定提升权限的方法,常用的有sudo和su,默认为sudo
- --become-user:指定执行sudo或su命令时切换的用户,默认为root用户
- -K:提示输入提升权限时需要的密码
- -B:后台运行的超时时间
- -C:测试一下会改变什么内容,不会真正执行
- -f:设置线程数
- -i:指定主机清单文件的路径,默认为/etc/absible/hosts
ad-hoc的语法如下:
ansible 主机或主机组 -m 模块 -a '模块参数' 其他ad-hoc选项
注意:主机或主机组是在主机清单中定义的部分,比如在/etc/absible/hosts中定义的主机和主机组。
2、一个例子:使用ad-hoc在远程主机上执行date命令
实验环境
在Ansible系列文章中,都使用如下的实验环境及配置。
实验环境中有以下四台运行CentOS的主机,分别为:
- 主机A:IP地址192.168.0.110,操作系统为CentOS 7.6.1810
- 主机B:IP地址192.168.0.88,操作系统为CentOS 7.6.1810
- 主机C:IP地址192.168.0.106,操作系统为CentOS 6.10
- 主机D:IP地址192.168.0.61,操作系统为CentOS 6.10
其中主机A通过YUM安装ansible做为主控端,主机B分组为centos7,主机C和主机D分组为centos6。主机清单的配置如下:
[centos7] 192.168.0.88 [centos6] 192.168.0.106 192.168.0.61
通过ad-hoc模式在centos6分组的两台主机上执行date命令
输入以下命令:
[root@localhost ~]# ansible centos6 -m command -a 'date' -k
执行后将提示输入centos6组中两台主机的密码(注意:两台主机的密码必须相同),然后观察返回的结果:
提示我们需要进行SSH的首次登录验证,此时只要在/etc/ansible/ansible.cfg中取消host_key_checking字段的注释即可。
取消注释后我们在运行上面的命令,观察返回的结果:
命令在centos6主机组的两台主机上执行成功。
3、command模块
上面的例子中,我们通过command模块在centos6组的两台主机上执行了date命令。command这个模块的功能就是用于在被管理的主机上执行命令。该模块依赖Python环境,且当命令中包含类似‘$HOME’和特殊符号“<”、“>”、“|”、“;”、“&”、“*”时无法执行。
比如我们在centos7组的主机中通过command模块执行ps –ef|grep ssh命令,查看结果:
执行报错,因为命令中存在特殊字符“|”。
command模块有以下选项(选项使用方法:选项=参数):
- argv:允许以一个列表的形式而不是字符串形式提供命令。但是列表和字符串不能混用,一次只能使用一个
- chdir:在执行命令前先切换到指定的目录
- creates:当指定的文件存在时,命令不执行,反之则命令执行
- removes:当指定的文件存在时,命令执行,反之则命令不执行
- stdin:command模块默认从标准输入中接收命令,使用该选项可以从指定的位置接收命令
一个例子:在centos7组的主机中执行pwd命令,在执行该命令前先将目录切换到/etc
输入以下命令:
[root@localhost ~]# ansible centos7 -m command -a 'chdir=/etc pwd' -k
返回的结果:
4、shell模块
该模块也是用于在被管理主机上执行命令。但该模块在执行命令时使用的是/bin/sh,所以使用该模块可以执行任何命令。该模块也依赖Python环境。
我们在centos7组的主机上执行刚才使用command模块无法执行的命令ps –ef|grep ssh,查看执行结果:
命令成功执行。
shell模块新增了以下选项,无argv选项,其他选项同command模块:
- executable:更改执行命令时使用的shell,参数为可执行文件的绝对路径
5、raw模块
raw模块的功能与command和shell完全相同,但是它不依赖于Python环境。所以raw模块很适合在没有安装Python环境的远程主机或者是无法安装Python环境的交换机路由器上执行命令。
raw模块仅有executable,功能同shell的executable选项。
6、script模块
script模块的功能时将主控端指定的shell脚本拷贝到被管理主机上执行。该模块的执行也不依赖Python环境。
script模块的选项同shell,仅多出以下选项:
- decrypt:自动解码源文件
7、ping模块
ping模块用于测试远程主机是否存活。
注意:该模块使用SSH连接测试主机是否存活,而不是仅通过网络是否连通进行判断。
实验环境中,主控端没有和centos7组中的主机设置SSH公钥私钥登录,必须使用密码才能SSH登录。此时执行以下命令:
[root@localhost ~]# ansible centos7 -m ping
返回结果:
此时为上面的命令加上-k选项以在执行时输入密码:
8、file模块
file模块用于在被管理主机上进行文件操作。
模块常用选项:
- path:必须使用,用于指定文件的路径
- state:用于指定文件的类型。可能的值有, directory - 代表目录,如果目录不存在则创建;file - 代表文件,如果该文件不存在则不会被创建,该选项为默认值;link - 创建符号链接;hard - 创建硬链接;touch - 如果文件不存在,则创建一个空白文件。如果文件或目录已存在,则更新它的最后修改时间;absent - 删除目录、文件或取消链接文件的指向
- owner:定义文件的属主
- group:定义文件的属组
- mode:定义文件的权限
- recurse:文件的权限是否递归,仅对目录有效,值为yes|no
- src:建立链接时指定源文件,当state=link或state=hard时使用
- dest:链接文件路径,当state=link或state=hard时使用
- force:在两种情况下使用以强制创建符号链接,一种是源文件不存在但之后会建立;另一种是目标符号链接已存在但需要更新。该选项的值为yes|no
一个例子:在centos7组的主机上的/root目录下建立一个名为test的文件,文件的属主和属组为root,权限为764
在主控端输入如下命令:
[root@localhost ~]# ansible centos7 -m file -a 'path=/root/test owner=root group=root mode=764 state=touch' -k
命令执行返回结果: