ansible的几个常用模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible的几个常用模块相关的知识,希望对你有一定的参考价值。

Ansible是什么呢?ansible是最新出现的自动化运维工具,基于python开发,集合了众多的运维工具(puppet,cfengine,chef等)的优点,实现了批量管理系统配置,批量程序部署,反正啥都是批量实现就对了。

ansible有如下优点:

? 1.部署简单,需要在主控端安装ansible环境,被控端不需要任何操作。

? 2.默认使用ssh协议对设备进行管理

? 3.可扩展性强且支持API及自定义模块,可通过Python扩展

? 4.通过Playbooks来指定强大的配置,状态管理;

? ? ..........等等等

Playbooks也就是对模块命令的集合,把简单的模块学会了,那Playbooks就是组合一下就行了!

ansible这个东西是怎么样执行命令DOA远程host主机呢?主要分为以下几个步骤:

? 1.加载配置文件默认/etc/ansible/ansible.cfg

? 2.查找对应的主机配置文件,找到要执行的主机? #/etc/ansible目录下有个host文件

? 3.加载对应命令的模块,如ping

? 4.通过ansible将模块或命令生成对应的临时py文件传到远程host主机上

? 5.对应执行用户家目录的.ansible/tmp/的.py为后缀的文件

? 6.给x执行权限

? 7.执行并返回结果

? 8.删除临时.py后缀文件,sleep 0退出? ?#大致过程就是这几步

安装:安装的话直接yum -y install ansible即可(简单容易!)

配置文件:/etc/ansible/ansible.cfg 主配置文件? /etc/ansible/hosts 用来管理组和主机 #远程执行的主机可以分组执行,也可以单台主机执行,这样容易分类管理。

下面就来实际操作一下ansible这个程序但是要实现ansible需要把被控端的IP地址加入到hosts文件内:#像下面一样[web]这个东西自己随便定义好记容易理解就行也可以叫组名,执行ansible命令的时候可以调用这个组名,也就是说组下所有主机都会执行相应的操作。

技术分享图片

ansible有几个很常用的模块下面就一一道来:

? 1.先来个最简单的ping 哈哈哈^_^

? ?突然插播一条消息!!!ansible要实现需要无密码登陆ssh钥匙打通,所以自行操作。需要ansible服务端能无密登录到任何需要控制的机器就OK!? 好的? 回归正题0.0

? ?继续说这个ping

[[email protected]?ansible]#?ansible?web?-m?ping?
172.17.200.76?|?SUCCESS?=>?{
????"changed":?false,?
????"ping":?"pong"
}
[[email protected]?ansible]#??????#这里显示从200.76这台主机返回执行结果,显示正常通信ping-pong乒乓球一样的读音0.0在
[[email protected]?ansible]#?ansible?172.17.200.2?-m?ping?????
?[WARNING]:?No?hosts?matched,?nothing?to?do????#不输入组名输入一个不存在的主机显示报错

[[email protected]?ansible]#

? 2.command模块:? #这个就舒服了,可以执行命令,下面是command的一些参数

????hdir # 在执行命令之前,先切换到该目录

????creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断

????executable # 切换shell来执行命令,需要使用命令的绝对路径

????free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。

????removes # 一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断

#加上面参数执行command,也可以不加直接执行
[[email protected]?ansible]#?ansible?web?-m?command?-a?"?cat?1.sh?"????????????
?172.17.200.76?|?SUCCESS?|?rc=0?>>
#!/bin/bash?????????????#这里产看了200.76家目录下的文件内容
date?>?/app/date.log?????

[[email protected]?ansible]#?ansible?web?-m?command?-a?"?creates="1.sh"?cat?1.sh?"
172.17.200.76?|?SUCCESS?|?rc=0?>>
skipped,?since?1.sh?exists??#而在这里加上了creates参数,即使有这个文件也不会查看。

[[email protected]?ansible]#?

[[email protected]?ansible]#?ansible?web?-m?command?-a?"?cat?1.sh?"???????????
172.17.200.76?|?SUCCESS?|?rc=0?>>
#!/bin/bash
date?>?/app/date.log??????????#这里可以查看家目录下的文件内容

[[email protected]?ansible]#?ansible?web?-m?command?-a?"?cat?1.sh?|grep?date?"
172.17.200.76?|?FAILED?|?rc=1?>>
#!/bin/bash
date?>?/app/date.logcat:?|grep:?No?such?file?or?directory
cat:?date:?No?such?file?or?directory
?????????????????????????????????????#到这里,哇这是什么鬼。返回结果一团糟
[[email protected]?ansible]#

? ? ?这个命令看似很厉害,但是不支持什么管道符啊and符啊什么的,反正就是不实用

? 3.shell模块:? #这个就更舒服了,command可以执行命令但是有缺点,这个无视任何特殊符号(不是真的无视,功能还是可以实现的0.0)

[[email protected]?ansible]#?ansible?web?-m?shell?-a?"cat?/etc/shadow"?
172.17.200.76?|?SUCCESS?|?rc=0?>>
root:$6$7mmVwpix7l72ki5v$WnFDr//REwT.UNbYcJ0QJJV0kpUDMAiHSPk2x4IJkixOwLuFWQd0UpHL3aJZQC9K1en8F54DPcreTiMa2ltpV.::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
....................??#中间省略
ntp:!!:17500::::::
nginx:!!:17501::::::

[[email protected]?ansible]#???#就连shadow文件都可以看,无敌是多么的寂寞0.0(其实因为ssh无密登录,都可以登录root了啥不能干,哈哈哈)

?? ? ? ? ?# 所以shell模块是真的舒服,这样岂不是可以执行任何操作!!批量!!执行!!多少台机器都无所谓,加个IP的事儿。

? 4.copy:#上面可以执行命令了,但是从控制端的脚本啊,文件啊什么的想要拷贝到远程N台主机上,那也是累的一批啊。(可是我们有ansible)

????src: 本地源文件路径

????dest:远程文件存放路径

????backup:拷贝文件时若目的文件存在,且内容不相同则先备份目的文件,然后进行拷贝(系统自动生成备份的文件名,贴心!)

????directory_mode:递归权限设置

????force:为yes强制覆盖(内容不同时,相同覆盖也没意义),为no时只有文件不存在才会拷贝。

????content:直接修改文件内容

????others;可以使用file模块的选项在此处可以使用

[[email protected]?ansible]#?ansible?web?-m?copy?-a?"src=/etc/ansible/66?dest=~/66"??#实现66拷贝到远程主机家目录下
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"checksum":?"91a747bdfe4541bc3d2e8162e0f7fb53e9e8cfe3",?
????"dest":?"/root/66",?
????"gid":?0,?
????"group":?"root",?
????"md5sum":?"73b4c20e598d6b495de7515ad4ea2fdc",?
????"mode":?"0644",?
????"owner":?"root",?
????"secontext":?"system_u:object_r:admin_home_t:s0",?
????"size":?3,?
????"src":?"/root/.ansible/tmp/ansible-tmp-1512816608.79-204967594766212/source",?
????"state":?"file",?
????"uid":?0
}
[[email protected]?ansible]#

? ? ?上面也有用其他选项的用法,举一反三即可。用法都差不多? ?#backup自认为比较实用

? 5.file:#设置文件属性

? ? force:强制创建软链接,两种情况源不存在和目标软连接存在这两种都是有点小问题的。为yes强制创建。

? ? group/owner:设置所属人所属组

? ? recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况

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

? ? ? ?state:

? ? ? ?directory:如果目录不存在,就创建目录

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

? ? ? ?link:创建软链接

? ? ? ?hard:创建硬链接

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

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

[[email protected]?ansible]#?ansible?web?-m?file?-a?"path=~/66?owner=‘mlon‘"
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"gid":?0,?
????"group":?"root",?
????"mode":?"0644",?
????"owner":?"mlon",?
????"path":?"/root/66",?
????"secontext":?"system_u:object_r:admin_home_t:s0",?
????"size":?7,?
????"state":?"file",?
????"uid":?1000
}
[[email protected]?ansible]#

????#这里把远处的66文件所属人修改为mlon了其他参数使用类推即可,也是很实用的0.0

? 6.fetch:#从远程把文件拉到本地,我感觉用处没多大但还是要说说万一用到了呢。

[[email protected]?u01]#?ansible?web?-m?fetch?-a?"src=/app/123.txt?dest=./"
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"checksum":?"a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0",?
????"dest":?"/u01/172.17.200.76/app/123.txt",?
????"md5sum":?"ba1f2511fc30423bdbb183fe33f3dd0f",?
????"remote_checksum":?"a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0",?
????"remote_md5sum":?null
}
[[email protected]?u01]#?ls
172.17.200.76??app
[[email protected]?u01]#

????#拷贝到本机会在指定目录下创建一个对应IP的目录文件存放在目录里面。

? 7.yum? #能远程安装软件是不是一件很舒服的事情

????这里state的状态可以是启动present? 卸载:absent? 安装最新版:latest

[[email protected]?u01]#?ansible?web?-m?yum?-a?"name=nginx?state=present"???#present为启动服务
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"msg":?"Repository?‘base‘?is?missing?name?in?configuration,?using?id\n",?
????
????#中间内容不重要有点多,省略掉。。。。
[[email protected]?u01]#

? ?这里可以使用service模块的用法? ?

???? arguments #命令行提供额外的参数

???? enabled #设置开机启动。

???? name= #服务名称

???? runlevel #开机启动的级别,一般不用指定。

???? sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。

???? state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置 需要加上ed结尾

[[email protected]?u01]#?ansible?web?-m?service?-a?"name=nginx?state=restarted"
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"name":?"nginx",?
????"state":?"started",?
????"status":?{
????
????#依旧中间省略。
????
[[email protected]?u01]#

???? #现在可以安装也可以启动或者停止服务了,掌控大局的感觉!

? 8.user/group 用户和组的管理

? ?先看user有哪些参数;

????comment:用户描述信息

????createhome;是否创建家目录

????group/groups:组和附加组

????home:指定家目录

????move_home:上面home指定家目录时可以移动家目录

????name;指定用户名

????password:指定密码(这个选项有点问题,有明白的可以评论回复我感谢大神。指定密码到shadow文件不经过加密,难道需要MD5加密之后在指定吗?没试过,在这赐教一波)

????shell:指定shell类型

????state:不指定为创建,指定absent为删除

????system:指定为系统用户,已存在不能指定。

????uid:指定uid

? ?现在看看group的参数:

????gid:指定gid

????name:管理组的名称

????state:状态默认创建,指定为absent未删除? #state=absent

????system:指定为系统组

#注意user和group分别是两个模块

[[email protected]?u01]#?ansible?web?-m?user?-a?"uid=1022?name=mlon1?"???????????
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"comment":?"",?
????"createhome":?true,?
????"group":?1022,?
????"home":?"/home/mlon1",?
????"name":?"mlon1",?
????"shell":?"/bin/bash",?
????"state":?"present",?
????"system":?false,?
????"uid":?1022
}
[[email protected]?u01]#

????#上面简单的创建了一个用户指定uid,需要使用组信息或创建组,要使用group模块

? 9.script:一看就是脚本了? #没什么直接选择script模块执行就好

[[email protected]?u01]#?ansible?web?-m?script?-a?"/bin/bash?/app/123.sh"???#指定bash和文件路径script模块
172.17.200.76?|?SUCCESS?=>?{
????"changed":?true,?
????"rc":?0,?
????"stderr":?"Shared?connection?to?172.17.200.76?closed.\r\n",?
????"stdout":?"123??123.sh??date.log\r\n",?
????"stdout_lines":?[
????????"123??123.sh??date.log"????#脚本执行结果??该目录下有这些文件
????]
}
[[email protected]?u01]#

有这么多模块的使用,感觉已经能掌控大局了。其实Playbooks才是重头戏,虽然重头戏其实也就是这些命令的集合那就扔到下次再来讲解吧

到此,大致使用的模块都差不多了。肯定还有许多功能没有说到,欢迎评论补充,灰常感谢!!

????

以上是关于ansible的几个常用模块的主要内容,如果未能解决你的问题,请参考以下文章

ansible常用命令大全

常用的几个JQuery代码片段

ansible 和文件复制相关的几个模块

1ansible 模块使用

Ansilbe 额外模块

ansible 的file 模块