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才是重头戏,虽然重头戏其实也就是这些命令的集合那就扔到下次再来讲解吧
到此,大致使用的模块都差不多了。肯定还有许多功能没有说到,欢迎评论补充,灰常感谢!!
????