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
[root@centos6 ansible]# ansible web -m ping 172.17.200.76 | SUCCESS => { "changed": false, "ping": "pong" } [root@centos6 ansible]# #这里显示从200.76这台主机返回执行结果,显示正常通信ping-pong乒乓球一样的读音0.0在 [root@centos6 ansible]# ansible 172.17.200.2 -m ping [WARNING]: No hosts matched, nothing to do #不输入组名输入一个不存在的主机显示报错 [root@centos6 ansible]#
2.command模块: #这个就舒服了,可以执行命令,下面是command的一些参数
hdir # 在执行命令之前,先切换到该目录
creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
removes # 一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断
#加上面参数执行command,也可以不加直接执行 [root@centos6 ansible]# ansible web -m command -a " cat 1.sh " 172.17.200.76 | SUCCESS | rc=0 >> #!/bin/bash #这里产看了200.76家目录下的文件内容 date > /app/date.log [root@centos6 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参数,即使有这个文件也不会查看。 [root@centos6 ansible]# [root@centos6 ansible]# ansible web -m command -a " cat 1.sh " 172.17.200.76 | SUCCESS | rc=0 >> #!/bin/bash date > /app/date.log #这里可以查看家目录下的文件内容 [root@centos6 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 #到这里,哇这是什么鬼。返回结果一团糟 [root@centos6 ansible]#
这个命令看似很厉害,但是不支持什么管道符啊and符啊什么的,反正就是不实用
3.shell模块: #这个就更舒服了,command可以执行命令但是有缺点,这个无视任何特殊符号(不是真的无视,功能还是可以实现的0.0)
[root@centos6 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:::::: [root@centos6 ansible]# #就连shadow文件都可以看,无敌是多么的寂寞0.0(其实因为ssh无密登录,都可以登录root了啥不能干,哈哈哈)
# 所以shell模块是真的舒服,这样岂不是可以执行任何操作!!批量!!执行!!多少台机器都无所谓,加个IP的事儿。
4.copy:#上面可以执行命令了,但是从控制端的脚本啊,文件啊什么的想要拷贝到远程N台主机上,那也是累的一批啊。(可是我们有ansible)
src: 本地源文件路径
dest:远程文件存放路径
backup:拷贝文件时若目的文件存在,且内容不相同则先备份目的文件,然后进行拷贝(系统自动生成备份的文件名,贴心!)
directory_mode:递归权限设置
force:为yes强制覆盖(内容不同时,相同覆盖也没意义),为no时只有文件不存在才会拷贝。
content:直接修改文件内容
others;可以使用file模块的选项在此处可以使用
[root@centos6 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 } [root@centos6 ansible]#
上面也有用其他选项的用法,举一反三即可。用法都差不多 #backup自认为比较实用
5.file:#设置文件属性
force:强制创建软链接,两种情况源不存在和目标软连接存在这两种都是有点小问题的。为yes强制创建。
group/owner:设置所属人所属组
recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
[root@centos6 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 } [root@centos6 ansible]#
#这里把远处的66文件所属人修改为mlon了其他参数使用类推即可,也是很实用的0.0
6.fetch:#从远程把文件拉到本地,我感觉用处没多大但还是要说说万一用到了呢。
[root@centos6 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 } [root@centos6 u01]# ls 172.17.200.76 app [root@centos6 u01]#
#拷贝到本机会在指定目录下创建一个对应IP的目录文件存放在目录里面。
7.yum #能远程安装软件是不是一件很舒服的事情!
这里state的状态可以是启动present 卸载:absent 安装最新版:latest
[root@centos6 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", #中间内容不重要有点多,省略掉。。。。 [root@centos6 u01]#
这里可以使用service模块的用法
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置 需要加上ed结尾
[root@centos6 u01]# ansible web -m service -a "name=nginx state=restarted" 172.17.200.76 | SUCCESS => { "changed": true, "name": "nginx", "state": "started", "status": { #依旧中间省略。 [root@centos6 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分别是两个模块
[root@centos6 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 } [root@centos6 u01]#
#上面简单的创建了一个用户指定uid,需要使用组信息或创建组,要使用group模块
9.script:一看就是脚本了 #没什么直接选择script模块执行就好
[root@centos6 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" #脚本执行结果 该目录下有这些文件 ] } [root@centos6 u01]#
有这么多模块的使用,感觉已经能掌控大局了。其实Playbooks才是重头戏,虽然重头戏其实也就是这些命令的集合那就扔到下次再来讲解吧
到此,大致使用的模块都差不多了。肯定还有许多功能没有说到,欢迎评论补充,灰常感谢!!