ansible的常用模块

1,539 阅读8分钟

测试机器的信息:

103.235.168.2 ansible

103.235.168.56 client1

103.235.168.40 client2

基础命令

ansible命令基础

• ansible <host-pattern> [options]
– host-pattern 主机自定义的分组
– -M 指定模块路径
– -m 使用模块,默认 command 模块
– -a or --args 模块参数
– -i inventory 文件路径,或可执行脚本
– -k 使用交互式登彔密码
– -e 定义变量
– -v 详绅信息,-vvvv 开启 debug 模式

①列出ansible所支持的模块
[root@localhost ~]# ansible-doc -l    #模块太多,按q退出

②查看模块的详细帮助信息,比如查看fetch模块的帮助
[root@localhost ~]# ansible-doc -s fetch

③查看所有的组,以及组的主机
[root@localhost ~]# ansible zabbix-agent --list-host
   [zabbix-agent]
    103.235.168.56
103.235.168.40

ansible命令正则

(1)all全量匹配

匹配所有的主机,all和*效果一样
# ansible all -m ping
# ansible "*" -m ping 
匹配103.235.168.网段的主机
[root@localhost ansible]# ansible 103.235.168.* -m ping

(2) 逻辑(or)匹配

多台主机和多个组同时执行,用冒号:分隔

#ansible 103.235.168.56:103.235.168.40:103.235.168.58 -m ping (3)逻辑非(!)匹配 逻辑非用感叹号(!)表示,主要针对多重条件的匹配规则,使用方式如下:

(4)逻辑与(&)匹配

和逻辑非一样,逻辑与也主要针对多重条件的匹配规则,只是逻辑上的判断不同。逻辑与使用&表示,请看如下示例:

(5)多条件组合

Ansible同样支持多条件的复杂组合,该情况企业应用不多,这里做简单举例说明。

(6)模糊匹配

*通配符在Ansible表示0个或多个任意字符,主要应用于一些模糊规则匹配,在平时的使用中应用频率非常高,请参考如下示例:

(7)域切割

Ansible底层基于Python,因此也支持域切割。Python字符串域切割的示例如下:

通过截取数组下标可以获得对应变量值。

~(web|db).*.example.com

ansible "~(beta|web|green).example.(com|org)" -m ping

ansible ~192.168.[0-9]{2}.[0-9]{2,} -m ping

Ansible常用模块

ping模块

测试主机是否是通的,用法很简单,不涉及参数:

[root@localhost ansible]# ansible zabbix-agent -m ping 
103.235.168.56 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
103.235.168.40 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Command模块

command模块用于在给的的节点上运行系统命令,比如echo hello。

它不会通过shell处理命令,因此不支持像$HOME这样的变量和,以及<, >, |, ;和&等都是无效的。也就是在command模块中无法使用管道符。

对目标服务器执行shell命令

[root@localhost ~]# ansible zabbix-agent -m command -a "ls"
103.235.168.56 | SUCCESS | rc=0 >>
anaconda-ks.cfg

103.235.168.40 | SUCCESS | rc=0 >>
anaconda-ks.cfg
#上面是根据分组执行命令,这是全部的主机执行命令
[root@localhost ~]# ansible all -m command -a "ls"  
103.235.168.56 | SUCCESS | rc=0 >>
anaconda-ks.cfg

103.235.168.40 | SUCCESS | rc=0 >>
anaconda-ks.cfg

#切换目录执行命令
[root@localhost ~]# ansible 103.235.168.56 -m command -a 'sh haha.sh chdir=/root'
103.235.168.56 | SUCCESS | rc=0 >>
hello world

copy模块

复制文件到远程主机,copy模块包含如下选项:

● backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no,默认是no,不备份。

● content:用于替代"src",可以直接设定指定文件的值,src与content两个参数必有其一,否则会报错。

● dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

● directory_mode:递归的设定目录的权限,默认为系统默认权限

● force:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。

● others:所有的file模块里的选项都可以在这里使用

● src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

● validate :复制前是否检验需要复制目的地的路径。

#单纯地复制一个文件到目标主机
[root@localhost ~]# ansible zabbix-agent -m copy -a 'src=/root/haha.txt dest=/root/' 

#修改用户组和权限地复制一个文件到目标主机,用户和用户组必须存在,不然会报错。
如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
[root@localhost ~]# ansible 103.235.168.40 -m copy -a 'src=/root/haha.txt dest=/opt/ owner=foo group=foo mode=0644' 

#复制一份文件过去,覆盖掉原文件,并且备份原文件
[root@localhost ~]# ansible 103.235.168.56 -m copy -a 'src=/root/haha.txt dest=/root/ backup=yes' 

#复制文件,如果有同名,则不复制。
[root@localhost ~]# ansible 103.235.168.56 -m copy -a 'src=/root/haha.txt dest=/root/ force=no'

set up模块

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果)

#查看所有主机的主机信息(输出信息超级多)
[root@localhost ~]# ansible all -m setup  #输出内容会很多

#根据主机名查看主机内存信息
[root@localhost ~]# ansible 103.235.168.56 -m setup -a 'filter=ansible_*_mb'

#查看地接口为eth0-2的网卡信息
[root@localhost ~]# ansible 103.235.168.56 -m setup -a 'filter=ansible_*_mb'

#将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
[root@localhost ~]# ansible all -m setup --tree /tmp/facts 

file模块

file模块主要用于远程主机上的文件操作,file模块包含如下选项:

● force:当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况。情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。

● group:定义文件/目录的属组

● mode:定义文件/目录的权限

● owner:定义文件/目录的属主

● path:必选项,定义文件/目录的路径

● recurse:递归的设置文件的属性,只对目录有效

● src:要被链接的源文件的路径,只应用于state=link的情况

● dest:被链接到的路径,只应用于state=link的情况

● state: directory:如果目录不存在,创建目录

file:即使文件不存在,也不会被创建

link:创建软链接(软链接可以对目录进行连接,硬链接不可以。新建立一个文件,这个文件就是专门用来指向别的文件的)

hard:创建硬链接(实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件)

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

absent:删除目录、文件或者取消链接文件

#在103.235.168.56主机上新建一个文件,如果文件存在,则更新文件的时间戳,与touch命令作用相同
[root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/haha.txt  state=touch' 

#在103.235.168.56主机上创建一个名为 /root/testdir 的目录,如果 /root/testdir 目录已经存在,则不进行任何操作。 [root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/testdir state=directory'

#在 103.235.168.56 上为 haha.txt 文件创建软链接文件,软链接名为 linkfile,执行下面命令的时候,haha.txt已经存在。 [root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/linkfile state=link src=/root/haha.txt'

#在 103.235.168.56 上为 haha.txt 文件创建硬链接文件,软链接名为 hardfile,执行下面命令的时候,haha.txt已经存在。 [root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/hardfile state=link src=/root/haha.txt'

#在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述 force 参数的解释。

[root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/hardfile state=link src=/root/haha.txt force=yes' 

#删除远程机器上的指定文件或目录。
[root@localhost ~]# ansible 103.235.168.56 -m file -a 'path=/root/hardfile1 state=absent' 
103.235.168.56 | SUCCESS => {
    "changed": true, 
    "path": "/root/hardfile1", 
    "state": "absent"   #看到这里就可以看出来,这个文件被删除成功了
}

#在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
ansible ansible-demo3 -m file -a "path=/testdir/abc state=touch owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc state=directory owner=ding"

#在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。
ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory group=ding"

#在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。
ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible ansible-demo3 -m file -a "path=/testdir/abb mode=0644"
ansible ansible-demo3 -m file -a "path=/testdir/binfile mode=4700"
ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory mode=0644"

#当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为ding。
ansible ansible-demo3 -m file -a "path=/testdir/abd state=directory owner=ding group=ding recurse=yes"

service模块

service 模块可以帮助我们管理远程主机上的服务。比如,启动或停止远程主机中的 nginx 服务。

● name参数:此参数用于指定需要操作的服务名称,比如 nginx。

● state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。

● enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

#将firewalld服务关闭、开启,开机自启动
[root@localhost ~]# ansible 103.235.168.56 -m service -a 'name=firewalld state=stopped'
[root@localhost ~]# ansible 103.235.168.56 -m service -a 'name=firewalld state=started'
[root@localhost ~]# ansible 103.235.168.56 -m service -a 'name=firewalld enabled=yes'
[root@localhost ~]# ansible 103.235.168.56 -m service -a 'name=firewalld enabled=no'

shell模块

让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。与command模块几乎相同,但在执行命令的时候使用的是/bin/sh。

#切换到root目录,并且输入东西到文件中
[root@localhost ~]# ansible 103.235.168.56 -m shell -a 'chdir=/root echo shelltext > haha.txt'

#切换到root目录,检索文件里面的内容
[root@localhost ~]# ansible 103.235.168.56 -m shell -a 'chdir=/root cat haha.txt | grep shell'

script模块

script模块的作用是将本地script传送到远程主机之后执行

给定的脚本将通过远程节点上的shell环境进行处理

script模块在远程系统上不需要python的支持

#在root新建一个脚本,然后再去测试
#vim user.sh
#!/bin/bash
id zhang3
if  [ $? != 0  ];then
useradd li4
fi
#在远程主机执行本地的脚本,可以通过去远程主机查看是否添加用户成功
[root@localhost ~]# ansible 103.235.168.56 -m script -a 'chdir=/root /root/user.sh'

get_url模块

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

· sha256sum:下载完成后进行sha256 check;

· timeout:下载超时时间,默认10s

· url:下载的URL

· url_password、url_username:主要用于需要用户名密码进行验证的情况

· dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。

· headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。

#下载文件到指定目录
[root@localhost ~]# ansible 103.235.168.56 -m get_url -a "url=http://nginx.org/download/nginx-1.6.3.tar.gz dest=/opt/ timeout=15 mode=0440"

find模块

· paths参数 :必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名 path 或者别名 name 可以代替 paths。

· recurse参数 : 默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible 并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用 recurse 参数,当 recurse 参数设置为 yes 时,表示在指定目录中递归的查找文件。

· hidden参数 :默认情况下,隐藏文件会被忽略,当 hidden 参数的值设置为 yes 时,才会查找隐藏文件。

· file_type参数 : 默认情况下,ansible 只会根据条件查找”文件”,并不会查找”目录”或”软链接”等文件类型,如果想要指定查找的文件类型,可以通过 file_type 指定文件类型,可指定的文件类型有 any、directory、file、link 四种。

· patterns参数 : 使用此参数指定需要查找的文件名称,支持使用 shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用 shell 匹配对应的文件名,如果想要使用 python 的正则去匹配文件名,需要将 use_regex 参数的值设置为 yes。

· use_regex参数:默认情况下,find 模块不会使用正则表达式去解析 patterns 参数中对应的内容,当 use_regex 设置为 yes 时,表示使用 python 正则解析 patterns 参数中的表达式,否则,使用 glob 通配符解析 patterns 参数中的表达式。

· contains参数:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find 模块会根据对应的正则表达式匹配文件内容。

· age参数 :使用此参数可以根据时间范围查找文件,默认以文件的 mtime 为准与指定的时间进行对比,比如,如果想要查找 mtime 在3天之前的文件,那么可以设置 age=3d,如果想要查找 mtime 在3天以内的文件,可以设置 age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。

· age_stamp参数 :文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以 mtime 为准。

· size参数 :使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置 size=3m,如果想要查找小于50k的文件,可以设置 size=-50k,可以使用的单位有 t、g、m、k、b。

· get_checksum参数 :当有符合查找条件的文件被找到时,会同时返回对应文件的 sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长。

#查找文件内容中包含 abc 字符串的文件,隐藏文件会被忽略,不会进行递归查找。 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root/ contains="shell*"'

#目录以及其子目录中查找文件内容中包含 abc 字符串的文件,隐藏文件会被忽略。 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root/ contains="shell*" recurse=yes'

#查找以 .sh 结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找,不会进行递归查找。 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root/ patterns="*.sh" hidden=yes file_type=any'

#查找 mtime 在1天以内的文件,包括子目录的查找 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root/ age=-1d recurse=yes'

#查找大于50k的文件,包括子目录的查找 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root/ size=50k recurse=yes'

#目录中以及其子目录中查找以 .sh 结尾的文件,并且返回符合条件文件的 sha1 校验码,包括隐藏文件。 [root@localhost ~]# ansible 103.235.168.56 -m find -a 'paths=/root patterns=*.sh get_checksum=yes hidden=yes recurse=yes'

yum模块

yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。

· name参数:必须参数,用于指定需要管理的软件包,比如 nginx。

· state参数:用于指定软件包的状态

,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。

· disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。

· enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。

· disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。

· enablerepo 参数和 disablerepo 参数可以同时使用。

#安装httpd(三条命令的效果是一样的)

[root@localhost ~]# ansible 103.235.168.56 -m yum -a 'name=httpd disable_gpg_check=yes'
[root@localhost ~]# ansible 103.235.168.40 -m yum -a 'name=net-tools  state=present disable_gpg_check=yes'

[root@localhost ~]# ansible 103.235.168.40 -m yum -a 'name=net-tools state=installed disable_gpg_check=yes'

#确保主机上安装了 yum 源中最新版本的httpd
[root@localhost ~]# ansible 103.235.168.56 -m yum -a 'name=httpd state=latest disable_gpg_check=yes'

#通过 yum 源安装的 httpd 被卸载了。如下两条命令效果相同。
[root@localhost ~]# ansible 103.235.168.56 -m yum -a 'name=httpd state=absent '
[root@localhost ~]# ansible 103.235.168.56 -m yum -a 'name=httpd state=removed'