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命令的时候可以调用这个组名,也就是说组下所有主机都会执行相应的操作。

image.png

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才是重头戏,虽然重头戏其实也就是这些命令的集合那就扔到下次再来讲解吧

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