精华内容
下载资源
问答
  • Ansible自动化运维工具1、为什么会自动化运维软件的出现?由于互联网的快速发展导致产品更新换代的速度逐渐加快,运维人员每天都要进行大量的维护操作,依旧按照传统的方式进行维护会使工作效率低下。这时候,自动...

                                 Ansible自动化运维工具


    1、为什么会有自动化运维软件的出现?

    由于互联网的快速发展导致产品更新换代的速度逐渐加快,运维人员每天都要进行大量的维护操作,依旧按照传统的方式进行维护会使工作效率低下。这时候,自动化运维软件的产生很好的解决了这样的一个问题,尽可能的安全高效的完成运维工作。

    2、自动化运维软件有哪些分类?

    一般我们把自动化运维工具划分为两类:一类是需要使用代理工具,也就是基于专用的Agent程序来完成管理功能,如:Puppet,Func,Zabbix等;另一类是不需要配置代理工具的,可以基于SSH服务来完成管理功能,如:Ansible、Fabric等。

    3、Ansible的什么优点能够脱颖而出?

    ansible是基于Python开发,集合众多运维工具的优点,实现批量运行命令,部署程序,配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。

    4、Ansible的核心组件

    ●ansible核心引擎

    ●host inventory主机清单:用于定于ansible所管理的主机,默认在ansible配置文件中定义被管理的主机,同时也支持自定义动态管理主机清单和指定配置文件的位置。

    ●connection plugins连接插件:负责和被管理的主机实现通讯。除支持使用SSH连接到主机外,ansible还支持其他连接的方式,所以需要有连接插件将各个主机用连接插件连接到ansible。

    ●playbook剧本:用于集中定义ansible任务的配置文件,即将多个任务定义在一个剧本中有ansible自动执行,可以控制主机针对多台被管理主机运行多个任务。

    ●core modules核心模块:是ansible自带的模块,使用这些模块将资源分发到被管理主机,是其执行特定的任务或匹配特定的状态。

    ●custom modules自定义模块:用于完成模块功能的补充,可以借助相关插件完成记录日志、发送邮件等功能。

    5、Ansible架构

    image

    图片转自大佬博客:https://blog.51cto.com/191226139/2066936


                                              安装部署Ansible服务


    ansible案例环境


    角色操作系统IP地址组名
    控制主机Centos7192.168.71.128
    被管理主机Centos7192.168.71.129web
    被管理主机Centos7192.168.71.130mysql



    1、安装ansible

    本案例使用centos7操作系统,通过yum安装ansible,需要依赖第三方的epel源。

    [root@bogon ~]# yum install epel-release -y

    [root@bogon ~]# yum install ansible -y

    [root@bogon ~]# ansible --version      #查看ansible版本号

    1.png

    [root@bogon ~]# yum install tree -y    #安装tree工具,查看ansible文件组成

    [root@bogon ~]# tree /etc/ansible

    2.png


    2、配置主机清单

    Asible通过读取默认主机清单 /etc/ansible/hosts文件,修改主机与组配置后,可同时连接到多个被管理的主机上执行任务。

    [root@bogon ~]# vim /etc/ansible/hosts

    3.png


    3、设置SSH协议生成秘钥连接

    [root@bogon ~]# ssh-keygen -t rsa         #设置rsa不对称秘钥

    Generating public/private rsa key pair.          #回车

    Enter file in which to save the key (/root/.ssh/id_rsa):     #秘钥保存位置在root目录下,使用ls -la命令可查看到./ssh文件

    Created directory '/root/.ssh'.

    Enter passphrase (empty for no passphrase):     #输入秘钥密码

    Enter same passphrase again:         #再次确认密码

    Your identification has been saved in /root/.ssh/id_rsa.

    Your public key has been saved in /root/.ssh/id_rsa.pub.

    The key fingerprint is:

    SHA256:hZDkiN37NzohGKRu+Z+eoRXozPnOOhjQFYyBHGNOwTA root@bogon

    The key's randomart image is:

    +---[RSA 2048]----+

    |EB++.oo.         |

    |=+oo++.. .       |

    | o.+o o . .      |

    |. o .. . .       |

    | o ..oo S        |

    |  =+...o.        |

    | . += o...o      |

    |  . o= +.o .     |

    |    o*O ..       |

    +----[SHA256]-----+


    4、推送秘钥到被管理主机

    [root@bogon ~]# ssh-copy-id root@192.168.71.129         #使用ssh-copy-id命令进行推送

    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

    The authenticity of host '192.168.71.129 (192.168.71.129)' can't be established.

    ECDSA key fingerprint is SHA256:xN0OXAGFTp+l2+pApp3nbZOERwU80gPh38NZZWat55w.

    ECDSA key fingerprint is MD5:59:30:06:88:69:6f:4b:ae:dc:35:50:f1:a6:51:d6:4a.

    Are you sure you want to continue connecting (yes/no)? yes       #是否建立连接,yes

    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

    root@192.168.71.129's password:            #输入被控制主机的密码


    5、使用ssh-agent代理免密操作

    [root@bogon ~]# ssh-agent bash

    [root@bogon ~]# ssh-add

    Enter passphrase for /root/.ssh/id_rsa:      #秘钥密码

    Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)


                                            Ansible应用命令基础

    1、查看模块及相关模块命令

    [root@bogon ~]# ansible-doc -l            #查看ansible所有模块,q退出

    [root@bogon ~]# ansible-doc -s command    #查看command模块的用法

    2、conmand模块

    格式:ansible+组名 -m 指定模块  -a  '命令’

    [root@bogon ~]# ansible web -m command -a 'date'      #使用command查看web组下的主机的时间

    192.168.71.129 | CHANGED | rc=0 >>

    2018年 10月 19日 星期五 22:34:23 CST

    3、cron模块

    Ansible中cron模块用于定义任务计划。其中有两种状态(state):present表示添加,absent表示移除

    [root@bogon ~]# ansible web -m cron -a 'minute="*/1" job="/usr/bin/echo hello" name="test"'    #每一分钟输出一个hello,人物名为test

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "envs": [], 

        "jobs": [

            "test"

        ]

    }

    [root@bogon ~]# ansible web -m cron -a 'name="test" state=absent'       #移除任务

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "envs": [], 

        "jobs": []

    }

    4、user模块

    Ansible中的user模块用于创建新用户和更改、删除已存在的用户。其中name选项用来知名创建用户的名称。

    [root@bogon ~]# ansible all -m user -a 'name="test01" system=yes'        #all指定所有组,name=test01,system=yes固定参数。

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "comment": "", 

        "create_home": true, 

        "group": 985, 

        "home": "/home/test01", 

        "name": "test01", 

        "shell": "/bin/bash", 

        "state": "present", 

        "system": true, 

        "uid": 990

    }

    192.168.71.130 | CHANGED => {

        "changed": true, 

        "comment": "", 

        "create_home": true, 

        "group": 985, 

        "home": "/home/test01", 

        "name": "test01", 

        "shell": "/bin/bash", 

        "state": "present", 

        "system": true, 

        "uid": 990

    }

    [root@bogon ~]# ansible web -m user -a 'name="test01" state=absent'       #state=absent,删除test01用户。

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "force": false, 

        "name": "test01", 

        "remove": false, 

        "state": "absent"

    }

    5、group模块

    group模块请求的是groupadd,groupdel,groupmod 三个指令

    [root@bogon ~]# ansible mysql -m group -a 'name=mysql system=yes'      #创建mysql组

    192.168.71.130 | CHANGED => {

        "changed": true, 

        "gid": 984, 

        "name": "mysql", 

        "state": "present", 

        "system": true

    }

    [root@bogon ~]# ansible mysql -m user -a 'name=test02 uid=1001 group=mysql system=yes'  创建用户,name指定用户名称,uid自定义,加入group组中。

    192.168.71.130 | CHANGED => {

        "changed": true, 

        "comment": "", 

        "create_home": true, 

        "group": 984, 

        "home": "/home/test02", 

        "name": "test02", 

        "shell": "/bin/bash", 

        "state": "present", 

        "system": true, 

        "uid": 1001

    }

    6、copy模块

    可以用来copy文件和写入信息到指定文件中

    [root@bogon ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bk owner=test02 mode=644'     #复制/etc/fstab文件到被控制主机下的/opt目录下改名为fstab.bk 属主为test02 权限644

    192.168.71.130 | CHANGED => {

        "changed": true, 

        "checksum": "e8641c5e427d241ea0cc641d8545b86205b803a8", 

        "dest": "/opt/fstab.bk", 

        "gid": 0, 

        "group": "root", 

        "md5sum": "3394e646a6032f7fcb08007f466bac35", 

        "mode": "0644", 

        "owner": "test02", 

        "secontext": "system_u:object_r:usr_t:s0", 

        "size": 617, 

        "src": "/root/.ansible/tmp/ansible-tmp-1539933819.19-164467458307203/source", 

        "state": "file", 

        "uid": 1001

    }

    [root@bogon ~]# ansible mysql -m copy -a 'content="this is test" dest=/opt/fstab.bk'       #写入一段话到被控制主机/opt/fstab文件中

    192.168.71.130 | CHANGED => {

        "changed": true, 

        "checksum": "b6794b2000d94d348203d0279c2e7322b922cb16", 

        "dest": "/opt/fstab.bk", 

        "gid": 0, 

        "group": "root", 

        "md5sum": "8c6d115258631625b625486f81b09532", 

        "mode": "0644", 

        "owner": "test02", 

        "secontext": "system_u:object_r:usr_t:s0", 

        "size": 12, 

        "src": "/root/.ansible/tmp/ansible-tmp-1539933966.74-136016829845719/source", 

        "state": "file", 

        "uid": 1001

    }

    7、file模块

    用来创建文件、目录和修改属主属组及权限

    [root@bogon ~]# ansible web -m user -a 'name="test" system=yes'            #创建test用户

    [root@bogon ~]# ansible web -m group -a 'name="test" system=yes'         #创建test组

    [root@bogon ~]# ansible web -m file -a 'path=/opt/fstab.bk owner=test group=test mode=666'     #修改控制主机下/opt/fstab.bk文件属主属组和权限

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "gid": 984, 

        "group": "test", 

        "mode": "0666", 

        "owner": "test", 

        "path": "/opt/fstab.bk", 

        "secontext": "unconfined_u:object_r:usr_t:s0", 

        "size": 617, 

        "state": "file", 

        "uid": 989

    }

    [root@bogon ~]# ansible web -m file -a 'path=/opt/file.txt state=touch'       #创建空文件file.txt

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "dest": "/opt/file.txt", 

        "gid": 0, 

        "group": "root", 

        "mode": "0644", 

        "owner": "root", 

        "secontext": "unconfined_u:object_r:usr_t:s0", 

        "size": 0, 

        "state": "file", 

        "uid": 0

    }

    [root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=directory mode=755'     #创建目录

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "gid": 0, 

        "group": "root", 

        "mode": "0755", 

        "owner": "root", 

        "path": "/opt/temp", 

        "secontext": "unconfined_u:object_r:usr_t:s0", 

        "size": 6, 

        "state": "directory", 

        "uid": 0

    }

    [root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=absent'   #删除目录,删除文件同理

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "path": "/opt/temp", 

        "state": "absent"

    8、yum模块

    用yum模块给被控制主机一键安装众多服务

    [root@bogon ~]# ansible all -m yum -a 'name=httpd'    #所有被控制主机yum安装httpd

    ansible web -m yum -a 'name=httpd state=absent'  #卸载服务

    9、service模块

    启动、关闭、查看服务状态

    ansible web -a 'systemctl status httpd'     #查看服务状态

    ansible web -a 'systemctl start httpd'      #开启服务

    ansible web -a 'systemctl stopped httpd'  #关闭服务

    10 shell模块

    [root@bogon ~]# ansible web -m user -a 'name=jerry'    #创建jerry用户

    192.168.71.129 | CHANGED => {

        "changed": true, 

        "comment": "", 

        "create_home": true, 

        "group": 1001, 

        "home": "/home/jerry", 

        "name": "jerry", 

        "shell": "/bin/bash", 

        "state": "present", 

        "system": false, 

        "uid": 1001

    }

    [root@bogon ~]# ansible web -m shell -a 'echo 123123 | passwd --stdin jerry'    #使用shell模块更改jerry用户密码

    192.168.71.129 | CHANGED | rc=0 >>

    更改用户 jerry 的密码 。

    passwd:所有的身份验证令牌已经成功更新。

    11、script模块

    vim /opt/abc.txt     #创建一个shell脚本

    #!/bin/bash

    echo "this is test"> /opt/abc

    ansible mysql -m script -a '/opt/abc.sh'   #使用script模块可以让被控制主机去执行该shell脚本

    12、setup模块

    ansible mysql -m setup   #查看被控制主机信息

    13、ping模块

    [root@bogon ~]# ansible web -m ping     #查看被控制主机网络情况

    192.168.71.129 | SUCCESS => {

        "changed": false, 

        "ping": "pong"

    }

    转载于:https://blog.51cto.com/13760226/2306549

    展开全文
  • 自动化运维工具介绍

    2017-07-23 16:32:41
    运维目标有三个阶段,第一是追求稳定性,...接下来简单介绍运维自动化工具,要了解运维平时用到的自动化工具,就需要了解运维人员的日常工作有哪些。一、运维的日常工作运维的日常工作可以总结为以下四个部分,分别...

    运维目标有三个阶段,第一是追求稳定性,第二是追求标准化,第三是追求自动化。对于第三阶段来说,什么是运维自动化呢?简单地讲,运维自动化就是将日常重复性工作按照事先设定好的规则,在一定时间范围内自动化运行,而不需要人工参与。接下来简单介绍运维自动化工具,要了解运维平时用到的自动化工具,就需要了解运维人员的日常工作有哪些。


    一、运维的日常工作


    运维的日常工作可以总结为以下四个部分,分别是:

    (1) 系统安装(OS Provision)

    (2) 应用程序配置(Configuration)

    (3) 命令执行与控制(Command and Control)

    (4) 程序发布(Deployment)

    接下来一一拆解。


    1.1 系统安装(OS Provision)(批量系统部署)


    运维的工作是运行和维护,那首先就需要有服务器主机。当一批服务器采购回来时,首先要做的是为这批主机安装操作系统。如果只是为一两台主机安装系统,那还可以使用手动的方式安装,但如果是安装一批主机的话那效率就太低了,因此需要有便于同时安装多台操作系统的安装工具,也就是支持批量部署系统操作。批量系统部署有两种方式,一种是在裸机(bare metal)上使用安装工具部署系统,另一种是在虚拟机(virtual machine)通过虚拟机实例安装系统,以下分别介绍这两种部署方式的安装工具。

    ① 在裸机上安装(bare metal)

    在裸机上安装时使用的安装工具常用的有 pxe 和 cobbler。

    安装工具介绍
    pxe预执行环境/预引导环境,pxe 技术能在主机未安装操作系统时,借助于网卡自身的 ROM 中的代码功能扮演成 DHCP 服务器的客户端并自己通过网络获取一个 IP 地址;还可以扮演成文件服务器的客户端来获取 bootloader 程序文件。pxe 的缺陷是只能预引导一种操作系统,例如不能同时预引导 CentOS 6/CentOS 7/ubuntu/... 中的其中两种操作系统。
    cobblercobbler 是 pxe 的二次封装,cobbler 能够整合多个预引导环境(操作系统环境)到一个镜面下。使用 cobbler 工具时需要硬件设备支持 pxe 技术。


    ②在虚拟机上安装(virtual machine)

    在虚拟机上安装就更加方便,需要安装系统时只需要创建虚拟机实例,然后下载一个模板文件就可以安装完操作系统了,在这个模板文件包含了操作系统的配置。


    1.2 应用程序部署(Configuration)(批量程序部署)


    服务器是用来提供服务的,所以为服务器装完了操作系统后,首先要做的是的部署应用程序并提供服务,这一步骤称为应用程序部署(Configuration),包括了应用程序的安装、配置和启动。在这一步骤中常用的运维工具有 Puppet、Saltstack、Chef、Cfengine、Ansible 等。其中 Puppet 是由 Ruby 研发,SaltStack、Ansible 是由 Python 研发。


    其中,Puppet 和 Saltstack 更适用于管理大规模主机的场景,最好是管理的主机数量超过 100 台,否则难以发挥出 Puppet 和 Saltstack 的优势,而且可能使用成本大于收益。对于管理小规模主机的场景,则简单轻量级的 Ansible 更适用。另外,Puppet 学习曲线较陡峭,而 Ansible 入门非常简单。


    这一部分的运维工具都支持幂等性,即前一次命令的执行不会影响后一次命令的执行。


    1.3 命令执行与控制(Command and Contorl)(批量执行命令)


    在平时的运维工作中,需要手动完成一些管理和控制操作时,可能需要在一批服务器的每台服务器上都执行一批命令。因此为了简化运维工作,就有了一些运维工具可以帮助同时控制多台主机,并在每台主机上执行运维人员指定的一批命令操作。在这一部分中常用的运维工具有 Fabric、Func 和 Ansible 等。其中 Fabric 是由 Python 开发的轻量级工具。相比于 Fabric,Func 是一个重量级的运维工具。


    1.4 程序发布(Deployment)


    程序发布,就是在主机上用新版本的程序替换旧版本的程序,简而言之是给服务程序换版本。在程序发布这一环节上,由于各个公司的应用业务不同,导致程序的发布流程、发布模式和发布过程中需要注意的细节是不一样的。所以程序发布几乎没有一个通用的工具来实现,发布工具基本都是各个公司自行研发的。


    1.4.1 程序发布的方式


    程序发布的方式可以总结为以下三种。

    (1) 手动发布 ==> 人工发布

    (2) 通过脚本发布 ==> 使用脚本也可以发布程序,但使用脚本时有以下两个缺陷。

    ① 程序环境发生变化时,脚本可能也需要随之灵活修改。如果脚本没有修改完善,可能会出现问题。

    ② 脚本自身能够提供的功能比较有限。例如在跨主机进行通信时,需要借助于外部服务程序并基于 SSH 协议进行通信,而脚本自身很难开发出基于网络通信的组件。

    (3) 通过发布程序发布 ==> 又称运维程序,是公司内部专门研发出来的运维框架。


    1.4.2 程序发布的三个要求


    合格的脚本发布的整个流程需要满足三个要求,这三个要求可以类比于在飞机上换发动机的场景。这三个要求如下。

    (1) 不能影响用户体验。

    (2) 系统不能停机。

    (3) 不能导致系统故障或造成系统完全不可用。


    1.4.3 灰度模型


    程序发布过程中需要基于灰度模型发布。灰度模型就是让一批主机下线,其它主机仍然向外提供服务,当这一批下线的主机更换程序版本完毕后,如果没有问题就开始上线提供服务,接着换另一批主机下线,以此类推。灰度模型有两种方式:

    (1) 基于主机 ==> 例如先让 20% 的主机下线更换程序,上线后再换另一批 20% 的主机,以此类推。

    (2) 基于用户 ==> 例如部分提供会员服务的网站中,可以在保障会员用户的用户体验、不保障免费用户体验的前提下进行程序发布。


    1.4.4 程序发布路径


    在程序发布过程中,可以为程序目录创建一个链接目录,这样便于管理程序版本。例如,在程序发布前,程序版本是 tuangou-1.1,而程序目录 /webapps/tuangou-1.1 的链接目录是 /webapps/tuangou。在执行程序版本更换时(假设更换为 tuangou-1.2),只需要将链接目录的链接路径修改为 /webapps/tuangou-1.2 即可。


    创建链接目录的好处,是可以方便更换程序版本,并且在高版本程序出现bug时,可以快速“回滚”,把对用户的影响降到最低。


    1.4.5 程序发布流程


    程序发布流程可以总结如下。

    在调度器上下线一批主机(标记为维护模式) --> 关闭服务 --> 部署新版本 --> 启动服务 --> 在调度器上启用这一批主机


    以上在运维日常中提到的运维工具都可以称为自动化运维工具,而自动化运维工具有 agent 和 agentless 类,接下来分别介绍。



    二、运维工具的分类


    运维工具根据在被管理端上是否装有 agent 程序,将运维工具分为 agent 和 agentless 两种类别。什么是 agent 程序呢?agent 的中文为“代理”之意,对于拥有 agent 程序的运维工具而言,当管理端(管理节点)通过网络管理被管理的主机时,被管理端主机上需要运行一个代理程序(agent 程序),并以管理员身份运行。当管理端向被管理端发送一个或多个要执行的命令时,被管理端的代理程序(agent 程序)负责代替管理端执行命令(因为 agent 程序是以管理员身份执行,所以以管理员身份代为执行其它命令)。这就是 agent 程序。


    所以,运维工具的分类可总结如下。

    ① agent:在被管理端上装有管理程序(在管理端上运行)的代理程序(agent 程序,以管理员身份运行),在管理端和被管理端之间基于安全的认证进行通信。常见的拥有 agent 程序的运维工具有 Puppet、Func 等。

    ② agentless:在被管理端上无需任何配置,由管理端配置好后即可使用。管理端和被管理端之间通常基于 SSH 协议进行通信(基于 OpenSSH),也就是两者之间的底层通信依赖于系统软件。虽然基于 SSH 协议进行通信较为简单,但容易成为安全漏洞(一旦管理端被劫持,则被管理的主机的信息也会遭到泄露)。




    转载于:https://blog.51cto.com/xuweitao/1950210

    展开全文
  • 自动化运维工具——Ansible(五)——模块的使用1. ansible模块2. fetch模块的使用2.1 配置主机清单2.2 调用fetch模块2.3 “幂等性”2.4 文件哈希值3. 总结 1. ansible模块 在前文的基础上,我们已经知道,当我们...
  • 运维自动化的知识可以说是浩瀚如海,本文将选择其中一个工具ansible为大家介绍一下。 一、哪些工作需要批量部署 1、操作系统的安装 常见的collber,red hat satelite(redhat)系统专用。 2、操作系统的配置 常见的...

    运维自动化是运维发展的必然方向,同时也是一个运维工程师实现效率最大化的必然选择。

    运维自动化的知识可以说是浩瀚如海,本文将选择其中一个工具ansible为大家介绍一下。

    一、哪些工作需要批量部署

    1、操作系统的安装

    常见的有collber,red hat satelite(redhat)系统专用。

    2、操作系统的配置

    常见的有cfengine,puppet,chef,func。其中puppet最受欢迎

    3、批量程序的部署

    4、批量命令的运行查看状态信息

    二、ansible介绍

    ansible的架构大致如下

    ansible的架构

    ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

    
    
    1. 运维工具常见的工作模式 
    2.  
    3. 1、agent模式: 基于ssl实现。代理工作在被监控端。像puppet。 
    4.  
    5. 2、agentless模式: 基于ssh服务实现工作在被监控端。监控端是ssh的客户端。  

    ansible是工作在agentless模式下具有幂等性。ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。

    
    
    1. 名词解释 
    2.  
    3. 幂等性不会重复执行相同的指令。例如不会重复安装软件 
    4.  
    5. 期望状态只需要告诉被监控端的期望状态  

    ansible是基于模块工作的ansible本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块ansible只是提供一种框架。架构包括

    连接插件connection plugins负责和被监控端实现通信。

    Host Inventory:指定操作的主机,是一个配置文件里面定义监控的主机

    各种模块核心模块command模块自定义模块

    借助于插件完成记录日志邮件等功能

    PlayBooks:剧本执行多个任务时。并非必需可以让节点一次性运行多个任务

    三、ansible的基本使用

    1、安装软件

    
    
    1. yum install ansible -y # 对应的软件在 epel 仓库中也可自己手动编译 
    2.  
    3. #源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz   

    2、定义Host Inventory

    
    
    1. # vim /etc/ansible/hosts 
    2.  
    3. [webhosts] 
    4.  
    5. 172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting 
    6.  
    7. 172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting  

    解释

    #ansible_ssh_user=root 是ssh登陆用户

    #ansible_ssh_pass=guoting 是ssh登陆密码3、测试各个模块

    # 注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy

    ansible命令最常用的用法

    ansible <Host-partten> -m MOE -a 'MOD_ARV'所支持的模块可以使用ansible-doc -l来查看

    四、ansible示例

    1、查看时间信息。command、shell模块

    查看时间信息。command、shell模块

    2、在控制端添加添加用户。user模块

    在控制端添加添加用户

    3、实现ssh秘钥认证。shell、copy模块

    实现ssh秘钥认证

    此时就可以实现基于ssh秘钥通信了此时/etc/ansible/hosts可以修改如下

    
    
    1. ###### /etc/ansible/hosts 
    2.  
    3. [webhosts] 
    4.  
    5. 172.16.10.22 
    6.  
    7. 172.16.10.33   

    4、安装软件和启动服务。yum、service模块

    安装软件和启动服务 

    5、支持管道的命令。raw模块,类似于shell模块

    支持管道的命令。

    关于ansible的基本介绍到这里就结束了,下一篇文章我们会介绍一些批量部署的小技巧哦~





    作者:newtime
    来源:51CTO
    展开全文
  • 在Linux中,我们可以通过 ansible-doc -l 命令查看到当前Ansible支持哪些模块,通过 ansible-doc -s [模块名] 又可以查看该模块有哪些参数可以使用。 ansible [主机或组] -m [模块名] -a ['模块参数'] [ansible...

    Ansible默认提供了很多模块来供我们使用。在Linux中,我们可以通过 ansible-doc -l 命令查看到当前Ansible支持哪些模块,通过 ansible-doc -s [模块名] 又可以查看该模块有哪些参数可以使用。

    ansible [主机或组] -m [模块名] -a ['模块参数'] [ansible参数]
    ansible-doc -l          # 命令查看到当前 ansible 都支持哪些模块
    ansible-doc -s [模块名]  # 查看该模块有哪些参数可以使用

    自动化运维工具Ansible常用模块按功能可分为:
    云模块、集群模块、 命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块。
    具体模块可参考官网(http://docs.ansible.com/ansible/latest/list_of_all_modules.html)。

    这里从官方分类的模块里选择最常用的一些模块进行介绍。

    一、command模块

    1、简介

    • command模块用于在给的的节点上运行系统命令,比如echo hello
    • 该模块通过-a跟上要执行的命令可以直接执行,它不会通过shell进行处理,因此诸如$ HOME和诸如“<”,“>”,“|”,“;”和“&”之类的操作将不起作用,也就是在command模块中无法使用管道符(如果需要这些功能,请使用shell模块)
    • 对于Windows目标,请改用win_command模块

    2、参数

    chdir:运行command命令前先cd到这个目录
    creates:如果这个参数对应的文件存在,就不运行command
    removes:如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
    free_form:需要执行的脚本(没有真正的参数为free_form)
    stdin(2.4后新增):将命令的stdin设置为指定的值
    warn(1.8后新增):如果command_warnings在ansible.cfg中打开,如果设置为,则不要警告有关此特定行no

    3、示例
    (1)列出指定目录下的文件

    # 在远程主机上创建test.sh脚本
    [root@Client ~]# cat /root/test.sh
    #!/bin/bash
    i=0
    echo $((i+1))
    [root@Ansible ~]# ansible web -m command -a 'ls /root'
    192.168.8.66 | SUCCESS | rc=0 >>
    anaconda-ks.cfg
    test.sh
    
    # 执行远程主机上的test.sh脚本
    [root@Ansible ~]# ansible web -m command -a 'ls /root creates=test.sh'
    192.168.8.66 | SUCCESS | rc=0 >>
    skipped, since test.sh exists
    [root@Ansible ~]# ansible web -m command -a 'ls /root removes=test.sh'
    192.168.8.66 | SUCCESS | rc=0 >>
    anaconda-ks.cfg
    test.sh

    自动化运维工具Ansible实战(四)常用模块

    说明:首先切换目录到/root 目录中,然后查看test.sh是否存在,如果存在,那么命令不会执行;如果不存在,那么执行命令。

    在这里也可以看到,命令是必须存在的,但是没有参数名为free_form参数。

    (2)切换目录执行命令

    # 查看远程主机上的test.sh脚本
    [root@Ansible ~]# ansible web -m command -a 'cat test.sh chdir=/root'
    192.168.8.66 | SUCCESS | rc=0 >>
    #!/bin/bash
    i=0
    echo $((i+1))
    
    [root@Ansible ~]# ansible web -m command -a 'sh test.sh chdir=/root'
    192.168.8.66 | SUCCESS | rc=0 >>
    1

    自动化运维工具Ansible实战(四)常用模块

    (3)无法使用管道符

    [root@Ansible ~]# ansible web -m command -a 'ls /root | grep test.sh'
    192.168.8.66 | FAILED | rc=2 >>
    test.sh
    
    /root:
    anaconda-ks.cfg
    test.shls: 无法访问|: 没有那个文件或目录
    ls: 无法访问grep: 没有那个文件或目录non-zero return code

    自动化运维工具Ansible实战(四)常用模块

    4、注意事项

    • 若要通过shell运行一个命令,比如<, >, |等,实际上我们需要shell模块
    • command模块更安全,因为它不受用户环境的影响
    • 从版本2.4开始,executable参数被删除。如果你需要此参数,请改用shell模块

    二、raw模块

    1、简介

    • raw模块执行一个原始的命令,而不是通过模块子系统。这对我们来说很有用,而且只能在两种情况下完成。第一种情况是在较老的(Python 2.4和之前的版本)主机上安装python-simplejson,因为几乎所有核心模块都需要它,作为运行模块的依赖项。另一种是对任何没有安装任何Python的设备(如路由器)进行对话。在任何其他情况下,使用shell或命令模块更合适。给raw的参数直接通过配置的远程shell运行。在可用时返回标准输出、错误输出和返回代码。该模块没有更改处理程序支持
    • 用法和shell 模块一样 ,也可以执行任意命令,就像在本机执行一样
    • raw和command模块类似,两个模块都是调用远程主机的指令,但是raw支持管道(|)命令
    • 该模块不需要远程系统上的python,就像脚本模块一样。该模块也支持Windows目标

    2、参数

    executable:改变用来执行命令的shell,应该是可执行文件的绝对路径
    free_form:需要执行的脚本(没有真正的参数为free_form)

    3、示例

    [root@Ansible ~]# ansible web -m raw -a "hostname"
    192.168.8.55 | SUCCESS | rc=0 >>
    Ansible
    Shared connection to 192.168.8.55 closed.
    
    192.168.8.66 | SUCCESS | rc=0 >>
    Client
    Shared connection to 192.168.8.66 closed.
    
    [root@Ansible ~]# ansible web -m raw -a "ifconfig ens33|sed -n 2p|cut -d' ' -f10"
    192.168.8.55 | SUCCESS | rc=0 >>
    192.168.8.55
    Shared connection to 192.168.8.55 closed.
    
    192.168.8.66 | SUCCESS | rc=0 >>
    192.168.8.66
    Shared connection to 192.168.8.66 closed.

    自动化运维工具Ansible实战(四)常用模块

    4、注意事项

    • 如果要安全可靠地执行命令,最好使用shell或command模块来代替
    • 如果从playbook中使用raw,则可能需要使用gather_facts: no禁用事实收集

    三、shell模块

    1、简介

    • shell模块让远程主机在shell模块下执行任何命令,从而支持shell的特性,如管道等
    • 与command模块几乎相同,就像在本机执行一样,但通过远程节点上的shel(/bin/sh)运行命令

    2、参数

    chdir:运行shell命令前先cd到这个目录
    creates:如果这个参数对应的文件存在,就不运行shell
    removes:如果这个参数对应的文件不存在,就不运行shell,与creates参数的作用相反
    executable:改变用来执行命令的shell,应该是可执行文件的绝对路径
    free_form:需要执行的脚本(没有真正的参数为free_form)
    stdin(2.4后新增):将命令的stdin设置为指定的值
    warn(1.8后新增):如果command_warnings在ansible.cfg中打开,如果设置为,则不要警告有关此特定行no

    3、示例
    切换目录,执行命令并保持输出

    # 在远程主机上创建test.sh脚本
    [root@Client ~]# cat /root/test.sh
    #!/bin/bash
    i=0
    echo $((i+1))
    
    # 执行远程主机上的test.sh脚本
    [root@Ansible ~]# ansible web -m shell -a "sh test.sh > result chdir=/root"
    192.168.8.66 | SUCCESS | rc=0 >>
    
    [root@Ansible ~]# ansible web -m shell -a "cat result chdir=/root"
    192.168.8.66 | SUCCESS | rc=0 >>
    1

    自动化运维工具Ansible实战(四)常用模块

    4、注意事项

    • 如果你想安全可靠的执行命令,请使用command模块,这也是编写playbook的最佳实践

    四、script模块

    1、简介

    • script模块的作用是将Ansible服务机上的script传送到远程主机之后再执行,原理类似于raw模块
    • 给定的脚本将通过远程节点上的shell环境进行处理
    • 该模块在远程系统上不需要python的支持
    • 该模块也支持Windows目标

    2、参数

    chdir(2.4后新增):运行script命令前先cd到这个目录
    creates(1.5后新增):如果这个参数对应的文件存在,就不运行script
    removes(1.5后新增):如果这个参数对应的文件不存在,就不运行script,与creates参数的作用相反
    decrypt(2.4后新增):此选项控制使用保管库对源文件进行自动解密
    free_form:需要执行脚本的本地文件路径(没有真正的参数为free_form)

    3、示例

    # 在Ansible服务器上创建一个脚本并赋予可执行权限
    [root@Ansible ~]# cat script.sh
    #!/bin/bash 
    a='Hello World'
    echo $a
    echo "这是我的Ansible服务器脚本"
    touch test.txt
    
    [root@Ansible ~]# chmod +x script.sh
    
    [root@Ansible ~]# ansible web -m script -a "script.sh chdir=/tmp"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "rc": 0,
        "stderr": "Shared connection to 192.168.8.66 closed.\r\n",
        "stdout": "Hello World\r\n这是我的Ansible服务器脚本\r\n",
        "stdout_lines": [
            "Hello World",
            "这是我的Ansible服务器脚本"
        ]
    }
    
    # 在远程主机上创建成功test.txt
    [root@Ansible ~]# ansible web -m command -a "ls /tmp"
    192.168.8.66 | SUCCESS | rc=0 >>
    ansible_G9sPom
    test.txt

    自动化运维工具Ansible实战(四)常用模块

    4、注意事项

    • 当脚本执行时,ssh连接插件将通过-tt强制伪tty分配。伪ttys没有stderr通道,所有stderr被发送到标准输出。如果需要标准输出和标准错误分离,我们需要使用到copy模块

    五、copy模块

    1、简介

    • copy模块是将本地或远程机器上的文件拷贝到远程主机上的某个位置
    • 对于Windows目标,请改用win_copy模块

    2、参数

    attributes(2.3后新增):文件或目录应具有的属性,该字符串应该包含与lsattr显示的顺序相同顺序的属性
    backup:在覆盖之前将原文件备份,备份文件包含时间信息,有两个选项:yes|no
    checksum(2.5后新增):正在传输的文件的SHA1校验和。用于确定文件的副本是否成功
    如果没有提供,那么将使用src文件的本地计算校验和
    content:当用content代替src参数的时候,可以把文档的内容直接设定指定文件的值
    decrypt(2.4后新增):此选项控制使用保管库对源文件进行自动解密
    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
    directory_mode(1.5后新增):在进行递归复制时,请设置目录的模式。如果没有设置,我们将使用系统默认值。该模式仅在新创建的目录中设置,不会影响已存在的目录
    follow(1.8后新增):表示是否遵循目标机器中的文件系统链接(如果存在)
    force:如果远程主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当远程主机的目标位置不存在该文件时,才复制。默认为yes
    group:设置文件或目录的所属组
    owner:设置文件或目录的所属用户
    local_follow(2.4后新增):是否遵循本地机器中的文件系统链接(如果存在)
    mode:设置文件权限,模式实际上是八进制数字(如0644),少了前面的零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
    remote_src(2.0后新增):如果是no,它将在原始主机上搜索src;如果是yes,它会去src的目标机子上搜索src。默认是no
    目前remote_src不支持递归复制
    src:将本地路径复制到远程主机,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync
    unsafe_writes(2.2后新增):通常情况下,该模块使用原子操作来防止数据损坏或从目标文件读取不一致,有时系统会以防止这种情况的方式进行配置或破坏
    validate:复制前是否检验需要复制目的地的路径
    others:所有的file模块里的选项都可以在这里使用

    3、示例
    (1)backup复制前备份
    复制本地文件到远程主机并对原文件进行备份(第一次复制之后,对本地文件稍作修改,第二次复制时,就能进行远程主机的备份)

    [root@Ansible ~]# ansible web -m copy -a "src=/root/test.sh backup=yes dest=/root"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum": "e42a8fe379671479fbdad43a3b8737e3ada2f8be",
        "dest": "/root/test.sh",
        "gid": 0,
        "group": "root",
        "md5sum": "5636a7c4398fc86b919631387fc712e5",
        "mode": "0644",
        "owner": "root",
        "size": 30,
        "src": "/root/.ansible/tmp/ansible-tmp-1524816562.347795-100129918473420/source",
        "state": "file",
        "uid": 0
    }
    [root@Ansible ~]# echo "echo 'Hello world'" >> test.sh 
    [root@Ansible ~]# ansible web -m copy -a "src=/root/test.sh backup=yes dest=/root"
    192.168.8.66 | SUCCESS => {
        "backup_file": "/root/test.sh.25144.2018-04-27@16:10:37~",     # 复制前的备份文件路径
        "changed": true,
        "checksum": "4d8e92c604221322f38cc04d8d6e87e84799153e",
        "dest": "/root/test.sh",
        "gid": 0,
        "group": "root",
        "md5sum": "0418be97c2fd733a9fb2aaec5977b559",
        "mode": "0644",
        "owner": "root",
        "size": 49,
        "src": "/root/.ansible/tmp/ansible-tmp-1524816636.447237-270228680719764/source",
        "state": "file",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /root"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 12
    -rw-------. 1 root root 1382 4月   3 22:24 anaconda-ks.cfg
    -rw-r--r--  1 root root   49 4月  27 16:10 test.sh
    -rw-r--r--  1 root root   30 4月  27 16:09 test.sh.25144.2018-04-27@16:10:37~     # 复制前的备份文件

    自动化运维工具Ansible实战(四)常用模块

    (2)src和dest都是文件

    [root@Ansible ~]# mkdir -p /root/dest/test
    [root@Ansible ~]# touch /root/dest/test.sh
    [root@Ansible ~]# ansible web -m copy -a "src=test.sh dest=/root/dest/test"    # dest文件的父目录不存在将报错
    192.168.8.66 | FAILED! => {
        "changed": false,
        "checksum": "e42a8fe379671479fbdad43a3b8737e3ada2f8be",
        "msg": "Destination directory /root/dest does not exist"
    }
    [root@Ansible ~]# ansible web -m copy -a "src=test.sh dest=/root/dest/"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum": "e42a8fe379671479fbdad43a3b8737e3ada2f8be",
        "dest": "/root/dest/test.sh",
        "gid": 0,
        "group": "root",
        "md5sum": "5636a7c4398fc86b919631387fc712e5",
        "mode": "0644",
        "owner": "root",
        "size": 30,
        "src": "/root/.ansible/tmp/ansible-tmp-1524812376.162108-152354561278684/source",
        "state": "file",
        "uid": 0
    }

    自动化运维工具Ansible实战(四)常用模块

    (3)src是目录
    A、源目录以/结尾,只拷贝了目录下的内容

    [root@Ansible ~]# ls /root/test/
    123.txt  test.sh
    [root@Ansible ~]# ansible web -m copy -a "src=/root/test/ dest=/tmp/"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/tmp/",
        "src": "/root/test/"
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 4
    -rw-r--r-- 1 root root  0 4月  27 17:04 123.txt
    drwx------ 2 root root 65 4月  27 17:05 ansible_ejRWFz
    -rw-r--r-- 1 root root 49 4月  27 17:04 test.sh

    自动化运维工具Ansible实战(四)常用模块

    B、源目录未以/结尾,直接将src目录本身拷贝到目标主机

    [root@Ansible ~]# ls /root/test/
    123.txt  test.sh
    [root@Ansible ~]# ansible web -m copy -a "src=/root/test dest=/tmp/"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/tmp/",
        "src": "/root/test"
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 4
    -rw-r--r-- 1 root root  0 4月  27 17:04 123.txt
    drwx------ 2 root root 65 4月  27 17:07 ansible_ownGJc
    drwxr-xr-x 2 root root 36 4月  27 17:07 test     # 这是一个目录
    -rw-r--r-- 1 root root 49 4月  27 17:04 test.sh

    自动化运维工具Ansible实战(四)常用模块

    (4)设置文件权限(owner/group/mode)

    [root@Ansible ~]# ansible web -m copy -a "src=/root/test.sh dest=/root dest=/tmp owner=test group=test mode=0644"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum": "4d8e92c604221322f38cc04d8d6e87e84799153e",
        "dest": "/tmp/test.sh",
        "gid": 1001,
        "group": "test",
        "md5sum": "0418be97c2fd733a9fb2aaec5977b559",
        "mode": "0644",
        "owner": "test",
        "size": 49,
        "src": "/root/.ansible/tmp/ansible-tmp-1524817478.2402651-108214522667207/source",
        "state": "file",
        "uid": 1001
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 4
    drwx------ 2 root root 65 4月  27 16:26 ansible_zczZtp
    -rw-r--r-- 1 test test 49 4月  27 16:24 test.sh

    自动化运维工具Ansible实战(四)常用模块

    (5)content参数
    把目录层次设置到特定的值,并输出到指定文件中。

    [root@Ansible ~]# ansible web -m copy -a "content='root \n dest \n' dest=/root/dest"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum": "87984f77e2ad345c677b5191d78d5caeb7d41316",
        "dest": "/root/dest",
        "gid": 0,
        "group": "root",
        "md5sum": "dc18f79caca390e17c89e1c850f9f8a5",
        "mode": "0644",
        "owner": "root",
        "size": 13,
        "src": "/root/.ansible/tmp/ansible-tmp-1524818107.6488795-679046311890/source",
        "state": "file",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m command -a "cat /root/dest"
    192.168.8.66 | SUCCESS | rc=0 >>
    root 
     dest

    自动化运维工具Ansible实战(四)常用模块

    (6)force参数
    如果远程主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当远程主机的目标位置不存在该文件时,才复制。

    [root@Ansible ~]# ansible web -m copy -a "src=test.sh dest=/root/xztest force=no"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum": "4d8e92c604221322f38cc04d8d6e87e84799153e",
        "dest": "/root/xztest",
        "gid": 0,
        "group": "root",
        "md5sum": "0418be97c2fd733a9fb2aaec5977b559",
        "mode": "0644",
        "owner": "root",
        "size": 49,
        "src": "/root/.ansible/tmp/ansible-tmp-1524818671.0156403-161213944315961/source",
        "state": "file",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m copy -a "src=test.sh dest=/root/xztest force=no"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "dest": "/root/xztest",
        "src": "/root/test.sh"
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /root"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 8
    -rw-------. 1 root root 1382 4月   3 22:24 anaconda-ks.cfg
    -rw-r--r--  1 root root   49 4月  27 16:44 xztest

    自动化运维工具Ansible实战(四)常用模块

    六、file模块

    1、简介

    • file模块,设置文件、符号链接和目录的属性,或删除文件、符号链接、目录
    • 许多其他模块支持与file模块相同的选项(包括复制、模板和汇编)
    • 对于Windows目标,请改用win_file模块

    2、参数

    attributes(2.3后新增):文件或目录应具有的属性。要获得支持的标志,请查看目标系统上chattr的手册页。该字符串应该包含与lsattr显示的顺序相同顺序的属性
    follow(1.8后新增):是否遵循目的机器中的文件系统链接,(如果存在)。在Ansible 2.5之前,默认是no
    force:强制创建软链接
    group:设置文件或目录的所属组
    owner:设置文件或目录的所属用户
    mode:设置文件权限,模式实际上是八进制数字(如0644),少了前面的零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
    path:定义目标文件/目录的路径,也可以用dest、name代替
    recurse:是否递归设置文件的属性,只对目录有效(仅适用于state=directory)
    selevel:要被链接的源文件的路径(仅适用于state=link)
    dest:被链接到的路径(仅适用于state=link)
    src:要链接到的文件路径(仅适用于state=link)
    state:若果是directory,所有的子目录将被创建(如果它们不存在);若是file,文件将不会被创建(如果文件不存在);link表示符号链接;若是absent,目录、文件或链接会被递归删除;touch代表生成一个空文件;hard代表硬链接
    touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    unsafe_writes(2.2后新增):是否以不安全的方式进行,可能导致数据损坏

    3、示例
    (1)设置文件权限(owner/group/mode)

    [root@Ansible ~]# ansible web -m command -a "ls -l /root/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    -rwxr-xr-x 1 root root 31 4月  28 10:41 /root/test.sh
    
    [root@Ansible ~]# ansible web -m file -a "path=/root/test.sh owner=test group=test mode=0777" 
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "gid": 1001,
        "group": "test",
        "mode": "0777",
        "owner": "test",
        "path": "/root/test.sh",
        "size": 31,
        "state": "file",
        "uid": 1001
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /root/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    -rwxrwxrwx 1 test test 31 4月  28 10:41 /root/test.sh

    自动化运维工具Ansible实战(四)常用模块

    (2)创建空文件(state=touch)

    [root@Ansible ~]# ansible web -m file -a "path=/tmp/xz_test state=touch mode=0644"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/tmp/xz_test",
        "gid": 0,
        "group": "root",
        "mode": "0644",
        "owner": "root",
        "size": 0,
        "state": "file",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp/xz_test"
    192.168.8.66 | SUCCESS | rc=0 >>
    -rw-r--r-- 1 root root 0 4月  28 10:49 /tmp/xz_test

    自动化运维工具Ansible实战(四)常用模块

    (3)创建目录(state=directory)
    A、目录是递归创建的

    [root@Ansible ~]# ansible web -m file -a "path=/tmp/test/xzxs/ state=directory mode=0755"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "gid": 0,
        "group": "root",
        "mode": "0755",
        "owner": "root",
        "path": "/tmp/test/xzxs/",
        "size": 6,
        "state": "directory",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp/"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 0
    drwx------ 2 root root 65 4月  28 10:56 ansible_iy9v52
    drwxr-xr-x 3 root root 18 4月  28 10:56 test
    -rw-r--r-- 1 root root  0 4月  28 10:49 xz_test
    
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp/test/"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 0
    drwxr-xr-x 2 root root 6 4月  28 10:56 xzxs

    自动化运维工具Ansible实战(四)常用模块

    B、目标文件不存在
    state=file时会报错,但是state=absent不会报错,执行状态也不会变化

    [root@Ansible ~]# ansible web -m file -a "path=/tmp/test/xzxs/1.txt state=file mode=0644"
    192.168.8.66 | FAILED! => {
        "changed": false,
        "msg": "file (/tmp/test/xzxs/1.txt) is absent, cannot continue",
        "path": "/tmp/test/xzxs/1.txt",
        "state": "absent"
    }
    [root@Ansible ~]# ansible web -m file -a "path=/tmp/test/xzxs/1.txt state=absent mode=0644"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "path": "/tmp/test/xzxs/1.txt",
        "state": "absent"
    }

    自动化运维工具Ansible实战(四)常用模块

    (4)创建软链接(state=link)

    [root@Ansible ~]# ansible web -m file -a "src=/etc/fstab dest=/tmp/123.txt state=link"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/tmp/123.txt",
        "gid": 0,
        "group": "root",
        "mode": "0777",
        "owner": "root",
        "size": 10,
        "src": "/etc/fstab",
        "state": "link",
        "uid": 0
    }
    [root@Ansible ~]# ansible web -m command -a "ls -l /tmp/"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 0
    lrwxrwxrwx 1 root root 10 4月  28 11:06 123.txt -> /etc/fstab   # 创建软链接
    drwx------ 2 root root 65 4月  28 11:06 ansible_pfisoW
    drwxr-xr-x 3 root root 18 4月  28 10:56 test
    -rw-r--r-- 1 root root  0 4月  28 10:49 xz_test

    自动化运维工具Ansible实战(四)常用模块

    (5)删除文件、目录或者软链接(state=absent)

    [root@Ansible ~]# ansible web -m file -a "path=/tmp/test/ state=absent"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "path": "/tmp/test/",
        "state": "absent"
    }
    [root@Ansible ~]# ansible web -m file -a "path=/tmp/xz_test state=absent"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "path": "/tmp/xz_test",
        "state": "absent"
    }
    [root@Ansible ~]# ansible web -m file -a "path=/tmp/123.txt state=absent"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "path": "/tmp/123.txt",
        "state": "absent"
    }

    自动化运维工具Ansible实战(四)常用模块

    七、ping模块

    1、简介

    • ping模块用于确认和对象机器之间是否能够ping通,正常情况会返回pong
    • ping模块在剧本中没有任何意义,但从/usr/bin/ansible或者/ansible-2.5.0/bin/ansible可以验证主机是否可以登录
    • 这不是ICMP ping,这只是一个简单的测试模块,需要远程节点上的Python
    • 对于Windows目标,请改用win_ping模块
    • 对于网络目标,请改用net_ping模块

    2、参数

    data:要返回的数据为ping返回值。如果此参数设置为crash,模块将导致异常

    3、示例

    # 默认返回是pong
    [root@Ansible ~]# ansible web -m ping
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    
    # 设置返回值是hello
    [root@Ansible ~]# ansible web -m ping -a "data=hello"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "ping": "hello"
    }
    
    # 设置返回值是crash,模块导致异常
    [root@Ansible ~]# ansible web -m ping -a "data=crash"
    192.168.8.66 | FAILED! => {
        "changed": false,
        "module_stderr": "Shared connection to 192.168.8.66 closed.\r\n",
        "module_stdout": "Traceback (most recent call last):\r\n  File \"/tmp/ansible_oNemnu/ansible_module_ping.py\", line 84, in <module>\r\n    main()\r\n  File \"/tmp/ansible_oNemnu/ansible_module_ping.py\", line 74, in main\r\n    raise Exception(\"boom\")\r\nException: boom\r\n",
        "msg": "MODULE FAILURE",
        "rc": 1
    }

    自动化运维工具Ansible实战(四)常用模块

    八、service模块

    1、简介

    • service模块用于控制远程主机的服务,说白了,就是Linux下的service命令
    • 支持的init系统包括BSD init,OpenRC,SysV,Solaris SMF,systemd,upstart
    • 对于Windows目标,请改用win_service模块

    2、参数

    arguments:如果打开这个标记,backrefs会改变模块的一些操作:insertbefore和insertafter参数会被忽略。当regexp不匹配文件中的任何行时,文件不会做任何修改,否则 使用扩展的line参数 替换 最后一个匹配正则表达式的行
    enabled:服务是否开机自动启动yes|no。enabled和state至少要有一个被定义
    name:必选项,服务名称
    pattern:如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运
    runlevel:运行级别
    sleep(1.3后新增):如果服务被重新启动,则睡眠多少秒再执行停止和启动命令
    state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
    use(2.2后新增):以哪个用户的身份执行

    3、示例
    (1)启动、停止、重启或重载服务

    # 启动(started)
    [root@Ansible ~]# ansible web -m service -a "name=httpd state=started"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
        "status": {
            ……
        }
    }
    # 停止(stopped)
    [root@Ansible ~]# ansible web -m service -a "name=httpd state=stopped"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "stopped",
        "status": {
            ……
        }
    }
    # 重启(restarted)
    [root@Ansible ~]# ansible web -m service -a "name=httpd state=restarted"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
    "status": {
            ……
        }
    }
    # 重载(reloaded)
    [root@Ansible ~]# ansible web -m service -a "name=httpd state=reloaded"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
    "status": {
            ……
        }
    }
    
    **(2)设置服务开机自启动**
    [root@Ansible ~]# ansible web -m service -a "name=httpd enabled=yes"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "enabled": true,
        "name": "httpd",
        "status": {
            ……
        }
    }

    九、systemd模块

    1、简介

    • systemd模块用于控制远程主机的systemd服务,说白了,就是Linux下的systemd命令。需要远程主机支持systemd
    • 用法和service模块基本相同

    2、参数

    daemon_reload:在执行任何其他操作之前运行守护进程重新加载,以确保systemd已经读取其他更改
    enabled:服务是否开机自动启动yes|no。enabled和state至少要有一个被定义
    masked:是否将服务设置为masked状态,被mask的服务是无法启动的
    name:必选项,服务名称
    no_block(2.3后新增):不要同步等待操作请求完成
    state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
    user:使用服务的调用者运行systemctl,而不是系统的服务管理者

    3、示例
    (1)启动、停止、重启或重载服务

    # 启动(started)
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=started"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
        "status": {
            ……
        }
    }
    # 停止(stopped)
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=stopped"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "stopped",
        "status": {
            ……
        }
    }
    # 重启(restarted)
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=restarted"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
        "status": {
            ……
        }
    }
    # 重载(reloaded)
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=reloaded"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
        "status": {
            ……
        }
    }

    (2)设置服务masked状态

    # 先将服务停止
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=stopped"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "stopped",
        "status": {
            ……
        }
    }
    
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd masked=yes"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "status": {
            ……
        }
    }
    # 服务已无法启动
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=started"
    192.168.8.66 | FAILED! => {
        "changed": false,
        "msg": "Unable to start service httpd: Failed to start httpd.service: Unit is masked.\n"
    }
    # 撤销mask
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd masked=no"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "status": {
            ……
        }
    }
    # 可以启动成功
    [root@Ansible ~]# ansible web -m systemd -a "name=httpd state=started"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "httpd",
        "state": "started",
    "status": {
            ……
        }
    }

    十、lineinfile模块

    1、简介

    • lineinfile模块用于确保一个特定的行在一个文件中,或使用一个正则表达式替换现有的行
    • 如果想要改变文件中相似的多行,可以使用replace模块。如果想要插入、更新、删除一个行块,可以使用blockinfile模块

    2、参数

    attributes(2.3后增加):文件或目录应具有的属性。要获得支持的标志,请查看目标系统上chattr的手册页。该字符串应该包含与lsattr显示的顺序相同顺序的属性
    backrefs:如果打开这个标记,backrefs会改变模块的一些操作:insertbefore和insertafter参数会被忽略。当regexp不匹配文件中的任何行时,文件不会做任何修改,否则 使用扩展的line参数 替换 最后一个匹配正则表达式的行
    backup:用于创建一个包含时间戳信息的备份文件。以便在错误的修改了文件的时候,能够找回原始的文件
    create:与state=present一起使用。如果指定了这个参数,当要修改的文件不存在的时候,会创建它。否则会报错
    firstmatch(2.5后增加):用于insertafter或insertbefore。如果设置,insertafter并inserbefore找到第一行有正则表达式匹配
    group:设置文件/目录的所属组
    insertafter:当regexp不匹配文件中的任何行的时候,会将新行插入到其所指定的正则表达式匹配的行中的最后一行的后面。insertafter也支持一个特殊的值:EOF(代表文件的末尾)。若没有匹配的行,那么就会插入EOF
    insertbefore:当regexp不匹配文件中的任何行的时候,会将line参数所指定的行,插入到insertbefore所指定的正则表达式匹配的行中的最后一行的前面,当insertbefore所指定的正则表达式不匹配任何行时,会插入到文件的末尾,同时insertbefore还可以是一个特殊的值:BOF(代表文件的开始);否则,会使用line参数所指定的行替换regexp所匹配的行中的最后一行
    line:要插入或者替换的行。如果设置了backrefs参数,那么line中可以包含位置分组或命名分组,lineinfile模块会使用regexp捕获的分组填充它们
    mode:设置文件权限,模式实际上是八进制数字(如0644),少了前面的零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
    others:file模块的其他参数可以在这里使用
    owner:设置文件或目录的所属用户
    path:要修改的文件,也可以使用dest、destfile、name
    regexp(1.7后增加):用于搜索文件中的每一行的正则表达式。对于state=present,这个正则表达式所匹配的行中的最后一行会被替换;对于state=present,会删除所有匹配的行
    state:用于设置 新增或替换一行,还是删除行(present、absent)
    unsafe_writes(2.2后增加):是否以不安全的方式进行,可能导致数据损坏
    validate:复制前是否检验需要复制目的地的路径

    3、示例
    (1)文本替换
    将/etc/selinux/config文件中所有匹配^SELINUX=正则表达式的行中的最后一行使用SELINUX=disabled替换
    如果regexp不匹配文件中的任何一行,则将line所指定的行插入到文件的末尾

    [root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line replaced"
    }
    # 查看结果
    [root@Ansible ~]# ansible web -m command -a "cat /etc/selinux/config"
    192.168.8.66 | SUCCESS | rc=0 >>
    
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled                                   # 修改成功
    # SELINUXTYPE= can take one of three two values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted

    自动化运维工具Ansible实战(四)常用模块

    (2)删除行
    将/tmp/test.sh文件中所有匹配^pwd的行删除

    # 删除前内容
    [root@Ansible ~]# ansible web -m command -a "cat /tmp/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    #!/bin/bash
    echo "Hello world"
    pwd
    pwd1=123456789
    pwd2=test
    # 删除行
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/tmp/test.sh regexp='^pwd' state=absent"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "found": 3,
        "msg": "3 line(s) removed"
    }
    # 再次运行,没有匹配
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/tmp/test.sh regexp='^pwd' state=absent"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": false,
        "found": 0,
        "msg": ""
    }
    # 删除后
    [root@Ansible ~]# ansible web -m command -a "cat /tmp/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    #!/bin/bash
    echo "Hello world"

    自动化运维工具Ansible实战(四)常用模块

    (3)替换行并设置文件权限

    # 执行前
    [root@Ansible ~]# ansible web -m command -a "cat /etc/hosts"
    192.168.8.66 | SUCCESS | rc=0 >>
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.8.55 Ansible
    192.168.8.66 Client
    # 执行中
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/hosts regexp='^127.0.0.1' line='127.0.0.1 localhost' owner=root group=root mode=0644"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line replaced"
    }
    # 执行后
    [root@Ansible ~]# ansible web -m command -a "cat /etc/hosts"
    192.168.8.66 | SUCCESS | rc=0 >>
    127.0.0.1 localhost
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.8.55 Ansible
    192.168.8.66 Client

    自动化运维工具Ansible实战(四)常用模块

    (4)insertafter和insertbefore
    当文件中没有匹配正则表达式^Listen80的行时,会将Listen 80插入到^#Listen所匹配的最后一行的后面

    [root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen80' insertafter='^#Listen' line='Listen 80'"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line added"
    }
    # insertbefore的使用方法类似
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^#Listen80' insertbefore='^Listen 80' line='#Listen 80'"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line added"
    }

    自动化运维工具Ansible实战(四)常用模块

    (5)为文件新增一行
    直接在文件中新增一行(如果line不存在则会插入),而不通过正则表达式进行匹配

    [root@Ansible ~]# ansible web -m lineinfile -a "path=/root/test.sh line='xiaozuo test'"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line added"
    }
    # 再次执行
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/root/test.sh line='xiaozuo test'"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": false,
        "msg": ""
    }
    # 执行后的文件
    [root@Ansible ~]# ansible web -m command -a "cat /root/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    #!/bin/bash
    echo 'Hello world'
    xiaozuo test          # 新增的行

    自动化运维工具Ansible实战(四)常用模块

    (6)backrefs用法
    backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。
    backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。

    # backrefs为yes时,匹配到了,并把匹配内容替被换为line内容
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/root/test.sh line='xiaozuo xiansen' regexp='^xiaozuo' backrefs=yes"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line replaced"
    }
    # backrefs为yes时,没有匹配到,则文件保持不变
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/root/test.sh line='xiaozuo xiansen' regexp='^xiaozuo1' backrefs=yes"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": false,
        "msg": ""
    }
    # backrefs为no时,没有匹配到,则添加一行line
    [root@Ansible ~]# ansible web -m lineinfile -a "path=/root/test.sh line='xiaozuo xiansen' regexp='^xiaozuo1' backrefs=no"
    192.168.8.66 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line added"
    }
    # 执行后的文件
    [root@Ansible ~]# ansible web -m command -a "cat /root/test.sh"
    192.168.8.66 | SUCCESS | rc=0 >>
    #!/bin/bash
    echo 'Hello world'
    xiaozuo xiansen
    xiaozuo xiansen
    • 自动化运维工具Ansible实战(四)常用模块

    十一、setup模块

    1、简介
    setup模块被剧本自动调用,以收集有关可用于剧本的远程主机的有用变量
    ****也可以直接通过/usr/bin/ansible或者/ansible-2.5.0/bin/ansible来检查主机可用的变量
    该模块也支持Windows目标

    2、参数

    fact_path(1.3后增加):用于本地(.fact)的路径, 如果文件不可执行,则会读取该目录中的文件;(如果可执行)并将其结果添加到ansible_local的信息中
    filter:过滤串
    gather_subset(2.1后增加):将收集的其他信息限制在给定的子集中。可能的值:all,min,hardware,network,virtual,ohai和facter可以指定一个值列表来指定一个更大的子集。值也可以与初始值一起使用,!以指定不应收集该特定子集(如:!hardware, !network, !virtual, !ohai, !facter. if !all)。为避免收集最小子集,请指定!all和!min子集。要仅收集特定信息,请使用!all、!min,并指定特定的信息子集
    gather_timeout(2.2后增加):设置单个信息收集的默认超时值,以秒为单位

    3、示例
    (1)收集fact并进行保存

    # 将所有主机的信息输入到/tmp/facts目录下
    [root@Ansible ~]# ansible web -m setup --tree /tmp/facts
    192.168.8.66 | SUCCESS => {
        "ansible_facts": {
            "ansible_all_ipv4_addresses": [
                "192.168.8.66"
                ……
            ]
            "module_setup": true
        },
        "changed": false
    }
    [root@Ansible ~]# ls /tmp/facts/
    192.168.8.66

    (2)收集内存信息

    [root@Ansible ~]# ansible web -m setup -a "filter=ansible_*_mb"
    192.168.8.66 | SUCCESS => {
        "ansible_facts": {
            "ansible_memfree_mb": 119,
            "ansible_memory_mb": {
                "nocache": {
                    "free": 484,
                    "used": 2524
                },
                "real": {
                    "free": 119,
                    "total": 3008,
                    "used": 2889
                },
                "swap": {
                    "cached": 43,
                    "free": 1980,
                    "total": 2047,
                    "used": 67
                }
            },
            "ansible_memtotal_mb": 3008,
            "ansible_swapfree_mb": 1980,
            "ansible_swaptotal_mb": 2047
        },
        "changed": false
    }

    自动化运维工具Ansible实战(四)常用模块

    (3)收集主机网卡信息

    [root@Ansible ~]# ansible web -m setup -a "filter=ansible_ens33"
    192.168.8.66 | SUCCESS => {
        "ansible_facts": {
            "ansible_ens33": {
                "active": true,
                "device": "ens33",
                ……
                "ipv4": {
                    "address": "192.168.8.66",
                    "broadcast": "192.168.8.255",
                    "netmask": "255.255.255.0",
                    "network": "192.168.8.0"
                },
                "ipv6": [
                    {
                        "address": "fe80::118:fa64:e919:e3be",
                        "prefix": "64",
                        "scope": "link"
                    }
                ],
                "type": "ether"
            }
        },
        "changed": false
    }

    (4)收集fact回报信息

    [root@Ansible ~]# ansible web -m setup -a 'gather_subset=!all,!any,facter'
    192.168.8.66 | SUCCESS => {
        "ansible_facts": {
            "ansible_apparmor": {
                "status": "disabled"
            },
            "ansible_architecture": "x86_64",
            "ansible_cmdline": {
                "BOOT_IMAGE": "/vmlinuz-3.10.0-514.el7.x86_64",
                "LANG": "zh_CN.UTF-8",
                "quiet": true,
                "rhgb": true,
                "ro": true,
                "root": "UUID=edeced73-160f-4b2f-beff-cb5ac7ab9904"
            },
            "ansible_date_time": {
                "date": "2018-04-28",
                "day": "28",
                ……
            "module_setup": true
        },
        "changed": false
    }

    (5)收集自定义显示信息

    [root@Ansible ~]# ansible web -m setup -a "fact_path='/root/'"
    192.168.8.66 | SUCCESS => {
        "ansible_facts": {
            "ansible_all_ipv4_addresses": [
                "192.168.8.66"
            ],
            ……
            "module_setup": true
        },
        "changed": false
    }

    十二、stat模块

    1、简介

    • stat模块获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等

    2、参数

    checksum_algorithm(2.0后增加):确定文件校验和的算法。如果主机不能使用指定的算法,会抛出一个错误(默认为sha1)
    follow:是否遵循符号链接
    get_attributes(2.3后增加):如果存在,使用lsattr工具获取文件属性
    get_checksum(1.8后增加):是否返回文件的校验和(默认sha1)
    get_md5:是否返回文件的md5总和
    get_mime(2.1后增加):使用特殊文件格式并返回有关文件性质的数据
    path:文件、对象的完整路径以获取信息

    3、示例
    (1)显示文件的所有信息

    [root@Ansible ~]# ansible web -m stat -a "path=/etc/sysctl.conf"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "stat": {
            "atime": 1524903484.3457322,
            ……
            "block_size": 4096,
            "blocks": 8,
            "charset": "us-ascii",
            "checksum": "174e13595eb0138cb67ba86af0ee090277d5a86a",
            "ctime": 1523506659.1721358,
            "dev": 2051,
            ……
            "gid": 0,
            "gr_name": "root",
            "inode": 16973829,
            ……
            "mimetype": "text/plain",
            "mode": "0644",
            "mtime": 1523506659.1651359,
            "nlink": 1,
            "path": "/etc/sysctl.conf",
            "pw_name": "root",
            ……
            "size": 473,
            "uid": 0,
            "version": "18446744073344397267",
            ……
        }
    }

    (2)显示MD5值

    [root@Ansible ~]# ansible web -m stat -a "path=/etc/sysctl.conf get_md5=yes"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "stat": {
            "atime": 1524903484.3457322,
            ……
            "block_size": 4096,
            "blocks": 8,
            "charset": "us-ascii",
            "checksum": "174e13595eb0138cb67ba86af0ee090277d5a86a",
            "ctime": 1523506659.1721358,
            "dev": 2051,
            ……
            "gid": 0,
            "gr_name": "root",
            "inode": 16973829,
            ……
            "md5": "6683269958dbb7ad3a91435b1f83424e",   # md5值
            "mimetype": "text/plain",
            "mode": "0644",
            "mtime": 1523506659.1651359,
            "nlink": 1,
            "path": "/etc/sysctl.conf",
            "pw_name": "root",
            ……
            "size": 473,
            "uid": 0,
            "version": "18446744073344397267",
            ……
        }
    }

    十三、cron模块

    1、简介

    • cron模块用于远程主机crontab配置,管理计划任务

    2、参数

    backup:对远程主机上的原任务计划内容修改之前创建crontab的备份
    cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
    day:日(1-31,/2,……)
    hour:小时(0-23,/2,……)
    minute:分钟(0-59,/2,……)
    month:月(1-12,/2,……)
    weekday:周(0-7,,……)
    disabled(2.0后增加)
    env(2.1后增加)
    insertafter(2.1后增加):和state=present和一起使用env。如果指定,则在声明指定的环境变量之后将插入环境变量
    insertbefore(2.1后增加):和state=present和一起使用env。如果指定,则将在声明指定的环境变量之前插入环境变量
    job:要执行的任务,依赖于state=present
    name:该任务的描述,如果state=absent,则为必需。请注意,如果名称未设置且state=present,则将始终创建新的crontab项,而不管现有项是什么
    reboot:如果作业应该在重新启动时运行。此选项已弃用。用户应该使用special_time
    special_time(1.3后增加):指定什么时候执行,参数:reboot、yearly、annually、monthly、weekly、daily、hourly
    state:确认该任务计划是创建还是删除
    user:以哪个用户的身份执行crontab

    3、示例
    (1)新增一个重启任务

    [root@Ansible ~]# ansible web -m cron -a "name='a job for reboot' special_time=reboot job='/some/job.sh'"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": [
            "a job for reboot"
        ]
    }

    (2)新增一个定时任务

    # 在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间
    [root@Ansible ~]# ansible all -m cron -a "name='custom job' minute=*/3 hour=* day=* month=* weekday=* job='/usr/sbin/ntpdate 192.168.8.66'"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": [
            "a job for reboot",
            "custom job"
        ]
    }
    [root@Ansible ~]# ansible all -m command -a "crontab -l"
    192.168.8.66 | SUCCESS | rc=0 >>
    #Ansible: a job for reboot
    @reboot /some/job.sh
    #Ansible: custom job
    */3 * * * * /usr/sbin/ntpdate 192.168.8.66

    自动化运维工具Ansible实战(四)常用模块

    (3)删除定时任务

    [root@Ansible ~]# ansible all -m cron -a "name='custom job' state=absent"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": [
            "a job for reboot"
        ]
    }
    [root@Ansible ~]# ansible all -m command -a "crontab -l"
    192.168.8.66 | SUCCESS | rc=0 >>
    #Ansible: a job for reboot
    @reboot /some/job.sh

    自动化运维工具Ansible实战(四)常用模块

    十四、yum模块

    1、简介

    • yum模块是使用yum软件包管理器安装,升级,降级,删除和列出软件包和组

    2、参数

    allow_downgrade(2.4后新增):是否允许指定的软件包和版本降级,可能已安装的该软件包为更高的版本。设置allow_downgrade = True可以使此模块以非幂等方式运行
    conf_file:yum的配置文件
    disable_gpg_check:是否禁用正在安装的软件包签名的GPG检查。只有当状态存在或最新时才有效
    disable_plugin(2.5后新增):要为安装/更新操作禁用的插件名称。禁用的插件不会在事务之外持续存在
    enable_plugin(2.5后新增):用于安装/更新操作的插件名称。启用的插件不会在事务之外持续存在
    disablerepo:重新定位存储库以禁用安装/更新操作,不启用某个源
    enablerepo:重新定位存储库以启用安装/更新操作,启用某个源
    exclude (2.0后新增):要在状态=存在或最新时排除的包名称
    installroot(2.3后新增):指定一个替代的installroot,相对于它将安装所有软件包
    list:包名相对于yum list <package>运行相当于。除了列出的软件包,使用还可以列出如下:installed,updates,available和repos
    name:指定要安装的包,如果有多个版本需要指定版本,否则安装最新的包。当使用state=latest时,这可以是'*',这意味着运行yum -y update
    security(2.4后新增):如果设置为yes,state=latest则只安装标记为安全相关的更新
    skip_broken(2.3后新增):通过从交易中删除导致问题的软件包来解决问题
    state:安装(present或installed),安装最新版(latest),卸载程序包(absent)
    update_cache(1.9后新增) :强制yum检查缓存是否过期并在需要时重新下载。只有当状态存在或最新时才有效
    update_only(2.5后新增):使用最新的,仅更新安装的软件包。不要安装软件包。只有在状态最新时才有效
    validate_certs(2.1后新增):这仅适用于使用https url作为rpm的来源。例如用于本地安装。如果设置为no,SSL证书将不会被验证。
    这应该只设置为no在使用自签名证书的个人控制站点上使用,因为它可以避免验证源站点。
    2.1之前的代码工作,如果这是设置yes

    3、示例
    (1)安装Apache软件包

    [root@Ansible ~]# ansible all -m yum -a "state=present name=httpd"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "msg": "",
        "rc": 0,
        "results": [
            "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package       Arch           Version                      Repository      Size\n================================================================================\nInstalling:\n httpd         x86_64         2.4.6-45.el7.centos          CentOS         2.7 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.7 M\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : httpd-2.4.6-45.el7.centos.x86_64                             1/1 \n  Verifying  : httpd-2.4.6-45.el7.centos.x86_64                             1/1 \n\nInstalled:\n  httpd.x86_64 0:2.4.6-45.el7.centos                                            \n\nComplete!\n"
        ]
    }

    自动化运维工具Ansible实战(四)常用模块

    (2)删除Apache软件包

    [root@Ansible ~]# ansible all -m yum -a "state=absent name=httpd"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "msg": "",
        "rc": 0,
        "results": [
            "已加载插件:fastestmirror\n正在解决依赖关系\n--> 正在检查事务\n---> 软件包 httpd.x86_64.0.2.4.6-45.el7.centos 将被 删除\n--> 解决依赖关系完成\n\n依赖关系解决\n\n================================================================================\n Package       架构           版本                        源               大小\n================================================================================\n正在删除:\n httpd         x86_64         2.4.6-45.el7.centos         @CentOS         9.4 M\n\n事务概要\n================================================================================\n移除  1 软件包\n\n安装大小:9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  正在删除    : httpd-2.4.6-45.el7.centos.x86_64                            1/1 \n  验证中      : httpd-2.4.6-45.el7.centos.x86_64                            1/1 \n\n删除:\n  httpd.x86_64 0:2.4.6-45.el7.centos                                            \n\n完毕!\n"
        ]
    }

    自动化运维工具Ansible实战(四)常用模块

    (3)升级所有软件包

    [root@Ansible ~]# ansible all -m yum -a "state=latest name='*'"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "msg": "",
        "rc": 0,
        "results": [
            "Nothing to do here, all packages are up to date"
        ]
    }

    自动化运维工具Ansible实战(四)常用模块

    (4)升级所有软件包,不包括Apache相关软件包

    [root@Ansible ~]# ansible all -m yum -a "state=latest name='*' exclude='httpd'"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "msg": "",
        "rc": 0,
        "results": [
            "Nothing to do here, all packages are up to date"
        ]
    }

    自动化运维工具Ansible实战(四)常用模块

    (5)从远程repo安装nginx rpm

    [root@Ansible ~]# ansible all -m yum -a "state=present name=http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm"

    (6)从本地文件安装nginx rpm

    [root@Ansible ~]# ansible all -m yum -a "state=present name=/usr/local/nginx-1.14.0-1.el7_4.ngx.x86_64.rpm"

    (7)安装'Development tools'软件包组

    [root@Ansible ~]# ansible all -m yum -a "state=present name='@Development tools'"

    十五、user、group模块

    1、简介

    • user模块是请求的是useradd, userdel, usermod三个指令
    • group模块请求的是groupadd, groupdel, groupmod 三个指令
    • user、group模块管理远程主机用户帐户和用户属性

    2、参数
    (1)user模块参数

    append:如果yes仅添加组,则不会将它们设置为组中的列表
    comment:(可选)设置用户帐户的描述(又名GECOS)
    create_home:除非设置为no,否则在创建帐户或主目录不存在时,将为用户创建主目录。在版本2.5中更改createhome为create_home
    expires(1.9后增加):用户在epoch中的到期时间,在不支持此操作的平台上会被忽略。目前支持Linux,FreeBSD和DragonFlyBSD
    force:与starte一起使用时state=absent,行为如同userdel --force
    generate_ssh_key:是否为有问题的用户生成SSH密钥。这不会覆盖现有的SSH密钥
    group:(可选)设置用户的主要组(采用组名)
    groups:指定用户的属组。将用户放在组列表中。当设置为空字符串('groups =')时,用户将从除主组以外的所有组中移除
    home:指定用户的家目录,需要与createhome配合使用
    login_class:可以选择设置FreeBSD,DragonFlyBSD,OpenBSD和NetBSD系统的用户登录类
    move_home:如果设置为yes使用时home=,尝试将用户的主目录移动到指定的目录(如果它尚未存在)
    name:要创建,删除或修改的用户的名称
    password:可选择将用户的密码设置为加密值。在Darwin / OS X系统上,这个值必须是明文。谨防安全问题。有关生成这些密码值的各种方法的详细信息,请参阅http://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module
    remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r
    seuser(2.1后增加):(可选)在启用selinux的系统上设置选择器类型(user_u)
    shell:指定用户的shell环境
    skeleton(2.0后增加):可选择设置家庭骨架目录。需要create_home选项!
    ssh_key_bits:可以指定要创建的SSH密钥中的位数
    ssh_key_comment:(可选)为SSH密钥定义注释
    ssh_key_file:可以指定SSH密钥文件名。如果这是一个相对文件名,那么它将相对于用户的主目录
    ssh_key_passphrase:为SSH密钥设置密码。如果未提供密码,则SSH密钥将默认为不含密码
    ssh_key_type:可以指定要生成的SSH密钥的类型。可用的SSH密钥类型将取决于目标主机上的实现
    state:是创建还是删除
    system:创建帐户时,如果设置为yes,则成为系统帐户。此设置无法在现有用户上更改
    uid:(可选)设置用户的UID
    update_password(1.3后增加):always将会更新密码,如果它们不同。on_create将只为新创建的用户设置密码

    (2)group模块参数

    gid:(可选)设置用户的GID
    name:要管理的组的名称
    state:该组是否应该存在于远程主机上,创建(present),删除(absent)
    system:如果是,则表示所创建的组是系统组,默认no

    3、示例
    (1)将用户xiaozuo添加到特定的uid和admin组中

    [root@Ansible ~]# ansible all -m user -a "name=xiaozuo comment=test uid=1040 group=root"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "comment": "test",
        "create_home": true,
        "group": 0,
        "home": "/home/xiaozuo",
        "name": "xiaozuo",
        "shell": "/bin/bash",
        "state": "present",
        "system": false,
        "uid": 1040
    }
    [root@Ansible ~]# ansible all -m command -a "id xiaozuo"
    192.168.8.66 | SUCCESS | rc=0 >>
    uid=1040(xiaozuo) gid=0(root) 组=0(root)

    自动化运维工具Ansible实战(四)常用模块

    (2)删除xiaozuo用户

    [root@Ansible ~]# ansible all -m user -a "name=xiaozuo state=absent remove=yes"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "force": false,
        "name": "xiaozuo",
        "remove": true,
        "state": "absent"
    }
    [root@Ansible ~]# ansible all -m command -a "id xiaozuo"
    192.168.8.66 | FAILED | rc=1 >>
    id: xiaozuo: no such usernon-zero return code

    自动化运维工具Ansible实战(四)常用模块

    (3)创建group组

    [root@Ansible ~]# ansible all -m group -a "name=admin"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "gid": 1002,
        "name": "admin",
        "state": "present",
        "system": false
    }

    自动化运维工具Ansible实战(四)常用模块

    (4)删除group组

    [root@Ansible ~]# ansible all -m group -a "name=admin state=absent"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "name": "admin",
        "state": "absent"
    }

    自动化运维工具Ansible实战(四)常用模块

    (5)为用户james创建一个2048位SSH密钥:

    [root@Ansible ~]# ansible all -m user -a "name=james generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "comment": "",
        "create_home": true,
        "group": 1002,
        "home": "/home/james",
        "name": "james",
        "shell": "/bin/bash",
        "ssh_fingerprint": "2048 cb:78:0e:12:d7:74:f5:30:fc:23:a4:33:cc:50:1b:57  ansible-generated on Client (RSA)",
        "ssh_key_file": "/home/james/.ssh/id_rsa",
        "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7WBkImiornzorZCzK0cSo2ZWwHHky4hRts8LFuTbgMCH2q7uI6DVyCxBMJSmgFLKLMgiXyTA0TwYckWW08XdfwjZ6X6KAhAGHFpb497eFRkJJiHgP4TM28YpTaoqKLfjHsQmNRqaC84zZCRbxorAZONhhgnz499YectLLS6QtJtCBlOuP3U5ianJrftD5hg/g4R651F23+cSxNHJ8f7A6dpNuc+iFc4wdrz4DiVn4g5WvXyrL6H9MXcUJfhbisgonVif4KD9xKuPNIXLH5yKRggF07Na0RiLVWq9Je4r4dvQFybETdFBtLd4R/UlzOjw6aq9HQO/bPGt3ivHVz2/l ansible-generated on Client",
        "state": "present",
        "system": false,
        "uid": 1002
    }

    自动化运维工具Ansible实战(四)常用模块

    十六、synchronize模块

    1、简介

    • 由于synchronize模块会调用rsync命令,因此首先要记得提前安装好rsync软件包
    • synchronize模块用于将Ansible机器的指定目录推送(push)到远程主机的指定目录下

    2、参数

    archive: 归档,相当于同时开启recursive(递归)、links(链接)、perms(权限)、times(时间)、owner(所有者)、group(组标志)和-D选项都为yes,默认该项为开启
    checksum(1.6后增加): 跳过检测sum值,默认关闭,archive选项默认处于启用状态时,checksum选项不会禁用它
    compress(1.7后增加): 在传输过程中压缩文件数据。在大多数情况下,请保持启用状态
    copy_links:复制符号链接文件,指向的项目(指示对象)被复制,而不是符号链接,默认为no,注意后面还有一个links参数
    delete: 删除不存在的文件,默认no
    dest:目标主机上将从源同步的路径; 路径可以是绝对的或相对的
    dest_port(1.5后增加):默认目录主机上的ssh端口号,默认是22
    dirs:传速目录不进行递归,默认为no,即进行目录递归
    existing_only(1.5后增加):跳过在接收器上创建新文件
    group:保留组
    link_dest(2.5后增加):在rsync期间添加一个目标到硬链接
    links:将符号链接复制为符号链接
    owner:保留所有者(仅限超级用户)
    partial(2.0后增加):告诉rsync保留部分文件,该文件应该使文件的其余部分以更快的速度传输
    perms:保留权限
    private_key(1.6后增加):指定用于基于SSH的rsync连接的私钥(例如~/.ssh/id_rsa)
    recursive:递归到目录中
    rsync_opts(1.6后增加):通过传入数组来指定其他rsync选项
    rsync_path:指定要在远程主机上运行的rsync命令
    rsync_timeout:在几秒钟内为rsync命令指定一个 --timeout
    set_remote_user:主要用于/etc/ansible/hosts中定义或默认使用的用户与rsync使用的用户不同的情况
    src:源主机上将被同步到目标的路径;路径可以是绝对的或相对的
    times:保留修改时间
    use_ssh_args(2.0后增加):使用ansible.cfg中指定的ssh_args
    verify_host(2.0后增加):验证目标主机密钥
    mode: 指定同步的方向。push或pull 模块,push模的话,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件

    3、示例
    (1)使用synchronize模块时,远程主机首先要安装rsync软件包(我这里已经安装过了)

    [root@Ansible ~]# ansible all -m yum -a "state=present name=rsync"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "msg": "",
        "rc": 0,
        "results": [
            "rsync-3.0.9-17.el7.x86_64 providing rsync is already installed"
        ]
    }

    自动化运维工具Ansible实战(四)常用模块

    (2)远程客户端安装好rsync包后就可以在Ansible服务端使用rsync进行同步

    [root@Ansible ~]# ansible all -m synchronize -a "src=/test/ dest=/tmp/backup/ compress=yes"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "cmd": "/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L /test/ 192.168.8.66:/tmp/backup/",
        "msg": "cd+++++++++ ./\n",
        "rc": 0,
        "stdout_lines": [
            "cd+++++++++ ./"
        ]
    }
    [root@Ansible ~]# ansible all -m command -a "ls -ld /tmp/backup/"
    192.168.8.66 | SUCCESS | rc=0 >>
    drwxr-xr-x 2 root root 6 5月   1 15:38 /tmp/backup/

    自动化运维工具Ansible实战(四)常用模块

    (3)将Client的/tmp/backup/ 目录拉取到Ansible的/test 目录下

    [root@Ansible ~]# ansible all -m command -a "ls -l /tmp/backup/"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 0
    -rw-r--r-- 1 root root 0 5月   1 15:50 abc.txt
    
    [root@Ansible ~]# ansible 192.168.8.66 -m synchronize -a "mode=pull src=/tmp/backup/ dest=/test/ compress=yes"192.168.8.66 | SUCCESS => {
        "changed": true,
        "cmd": "/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L 192.168.8.66:/tmp/backup/ /test/",
        "msg": ".d..t...... ./\n>f+++++++++ abc.txt\n",
        "rc": 0,
        "stdout_lines": [
            ".d..t...... ./",
            ">f+++++++++ abc.txt"
        ]
    }
    [root@Ansible ~]# ll /test/
    总用量 0
    -rw-r--r-- 1 root root 0 5月   1 15:50 abc.txt

    自动化运维工具Ansible实战(四)常用模块

    十七、mount模块

    1、简介

    • mount模块控制/etc/fstab中的活动和配置挂载点

    2、参数

    backup(2.5后增加):创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地修改了该文件,就可以获取原始文件
    boot(2.2后增加):确定文件系统是否应该在启动时加载。仅适用于Solaris系统
    fstab:如果需要在chroot环境中配置挂载点,这才能使用到
    fstype:文件系统类型。当需要的状态是present或mounted
    opts:传递给mount命令的参数
    path:安装点的路径(例如/mnt/files)。在2.3之前,这个选项只能用作dest、destfile和name
    name:挂载点。从Ansible 2.3开始,name选项已被更改为path,但name仍然适用
    src:要安装在路径上的设备。需要时状态设置为present或mounted
    state:必选项。删除挂载点(absent)、自动创建挂载点并挂载(mounted)、只处理fstab中的配置(present)、卸载(unmounted)

    3、示例
    (1)把本地的磁盘挂载到远程主机上

    [root@Ansible ~]# ansible all -m mount -a "name=/mnt src=/dev/sda3 fstype=xfs state=mounted opts=rw"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dump": "0",
        "fstab": "/etc/fstab",
        "fstype": "xfs",
        "name": "/mnt",
        "opts": "rw",
        "passno": "0",
        "src": "/dev/sda3"
    }
    [root@Ansible ~]# ansible all -a "cat /mnt/etc/fstab"
    192.168.8.66 | SUCCESS | rc=0 >>
    
    #
    # /etc/fstab
    # Created by anaconda on Tue Apr  3 22:19:07 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=edeced73-160f-4b2f-beff-cb5ac7ab9904 /                       xfs     defaults        0 0
    UUID=a4f23d30-13d8-423f-b77b-86a78f4dfa2a /boot                   xfs     defaults        0 0
    UUID=46bab4fe-7f95-4b24-aff2-bfcf6967ab70 swap                    swap    defaults        0 0
    /dev/sda3 /mnt xfs rw 0 0

    自动化运维工具Ansible实战(四)常用模块

    十八、get_url模块

    1、简介

    • get_url模块是将文件从HTTP,HTTPS或FTP下载到远程主机,类似于wget。远程主机必须能够直接访问远程资源
    • HTTP重定向可以从HTTP重定向到HTTPS,因此应该确保这两种协议的代理环境都是正确的
    • 在Ansible 2.4中,当使用-check运行时,它将执行HEAD请求来验证URL,但不会下载整个文件或对照哈希进行验证
    • 对于Windows目标,请改用win_get_url模块

    2、参数

    attributes(2.3后增加):文件或目录属性,该字符串应该包含与lsattr显示的顺序相同顺序的属性
    backup(2.1后增加):创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地修改了该文件,就可以获取原始文件
    checksum(2.0后增加):如果将校验和传递给此参数,则目标文件的摘要将在下载后进行计算,以确保其完整性并验证传输是否成功完成。格式:<算法>:<校验和>,例如checksum="sha256:D98291AC[...]B6DC7B97"
    client_cert(2.4后增加):PEM格式的证书链文件用于SSL客户端身份验证。该文件也可以包含密钥,如果包含密钥,client_key则不需要
    client_key(2.4后增加):PEM格式的文件,其中包含您的私钥用于SSL客户端身份验证。如果同时client_cert包含证书和密钥,则不需要此选项
    dest:将文件下载到的绝对路径
    force:如果是yes,将每次下载文件,并替换该文件内容;如果是no,该文件只在目标不存在时下载。一般应该yes只适用于小本地文件
    force_basic_auth(2.0后增加):httplib2,uri模块使用的库仅在web服务响应具有401状态的初始请求时才发送认证信息。由于某些基本身份验证服务无法正确发送401,因此登录将失败。此选项强制在初始请求时发送基本身份验证标头
    group:设置文件或目录的所属组
    owner:设置文件或目录的所属用户
    headers(2.0后增加):以“key:value,key:value”格式将自定义HTTP标头添加到请求中
    mode:设置文件或目录的权限。对于那些习惯于/usr/bin/chmod的记住,模式实际上是八进制数字(如0644or 01777)。离开前导零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
    others:file模块的所有参数也可以在这里使用
    sha256sum(1.3后增加):如果将SHA-256校验和传递给此参数,则目标文件的摘要将在下载后进行计算,以确保其完整性并验证传输是否成功完成。此选项已弃用。改为使用checksum
    timeout(1.8后增加):URL请求超时(以秒为单位)
    tmp_dest(2.1后增加):临时文件下载到的绝对路径
    url:下载的URL地址
    url_password(1.6后增加):用于HTTP基本身份验证的密码
    url_username(1.6后增加):用于HTTP基本身份验证的用户名
    use_proxy:如果no,它不使用代理,即使在目标主机上的环境变量中定义了一个代理
    validate_certs:如果no,SSL证书不会被验证。这只能用于使用自签名证书的个人控制网站

    3、示例
    (1)下载页面

    [root@Ansible ~]# ansible all -m get_url -a "url=https://www.baidu.com/ dest=/tmp mode=0440"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum_dest": null,
        "checksum_src": "77e920ff2d5ce5ac4bb3c399c7f3fa29dd7ced82",
        "dest": "/tmp/index.html",
        "gid": 0,
        "group": "root",
        "md5sum": "8f1f3fef541f7dbb36a8755a9f0eff40",
        "mode": "0440",
        "msg": "OK (227 bytes)",
        "owner": "root",
        "size": 227,
        "src": "/tmp/tmp4yv2WD",
        "state": "file",
        "status_code": 200,
        "uid": 0,
        "url": "https://www.baidu.com/"
    }
    [root@Ansible ~]# ansible all -m command -a "ls -l /tmp/"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 4
    drwx------ 2 root root  65 5月   2 09:48 ansible_ngh7w4
    -r--r----- 1 root root 227 5月   2 09:48 index.html

    自动化运维工具Ansible实战(四)常用模块

    (2)下载文件并强制基本认证

    [root@Ansible ~]# ansible all -m get_url -a "url=https://www.baidu.com dest=/tmp mode=0440 force_basic_auth=yes"
    192.168.8.66 | SUCCESS => {
        "changed": false,
        "checksum_dest": "77e920ff2d5ce5ac4bb3c399c7f3fa29dd7ced82",
        "checksum_src": "77e920ff2d5ce5ac4bb3c399c7f3fa29dd7ced82",
        "dest": "/tmp/index.html",
        "gid": 0,
        "group": "root",
        "md5sum": "8f1f3fef541f7dbb36a8755a9f0eff40",
        "mode": "0440",
        "msg": "OK (227 bytes)",
        "owner": "root",
        "size": 227,
        "src": "/tmp/tmpU6TsG7",
        "state": "file",
        "status_code": 200,
        "uid": 0,
        "url": "https://www.baidu.com"
    }

    自动化运维工具Ansible实战(四)常用模块

    (3)从文件路径下载文件

    [root@Ansible ~]# ansible all -m get_url -a "url=http://192.168.8.8/file/file.txt dest=/tmp/test.txt"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "checksum_dest": null,
        "checksum_src": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
        "dest": "/tmp/test.txt",
        "gid": 0,
        "group": "root",
        "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
        "mode": "0644",
        "msg": "OK (0 bytes)",
        "owner": "root",
        "size": 0,
        "src": "/tmp/tmpfdh4qg",
        "state": "file",
        "status_code": 200,
        "uid": 0,
        "url": "http://192.168.8.8/file/file.txt"
    }
    # 查看下载文件
    [root@Ansible ~]# ansible all -m command -a "ls -l /tmp/test.txt"
    192.168.8.66 | SUCCESS | rc=0 >>
    -rw-r--r-- 1 root root 0 5月   2 10:12 /tmp/test.txt

    自动化运维工具Ansible实战(四)常用模块

    十九、sysctl包管理模块

    1、简介

    • sysctl模块用于远程主机sysctl的配置
    • sysctl模块可以在更改配置之后执行/sbin/sysctl –p

    2、参数

    ignoreerrors:使用此选项可忽略有关未知键的错误
    name:指定sysctl变量的键值,使用,分隔多个值
    reload:更新sysctl的配置。如果yes,则更新,执行/sbin/sysctl -p sysctl_file。如果no,即使更新了也不重新加载sysctl_file
    state:条目在sysctl文件中是否存在
    sysctl_file:指定绝对路径sysctl.conf。如果不是/etc/sysctl.conf,可以使用该参数指定
    sysctl_set(1.5后新增):使用sysctl命令和设置,并在必要时使用-w进行设置
    value:sysctl密钥的期望值

    3、示例
    (1)在/etc/sysctl.conf中将vm.swappiness设置为5

    [root@Ansible ~]# ansible all -m sysctl -a "name=vm.swappiness value=5 state=present sysctl_file=/etc/sysctl.conf"
    192.168.8.66 | SUCCESS => {
        "changed": true
    }
    # 查看是否替换成功
    [root@Ansible ~]# ansible all -m command -a "tail -1 /etc/sysctl.conf"
    192.168.8.66 | SUCCESS | rc=0 >>
    vm.swappiness=5

    自动化运维工具Ansible实战(四)常用模块

    (2)从/etc/sysctl.conf中删除vm.swappiness条目

    [root@Ansible ~]# ansible all -m sysctl -a "name=vm.swappiness state=absent sysctl_file=/etc/sysctl.conf"
    192.168.8.66 | SUCCESS => {
        "changed": true
    }

    自动化运维工具Ansible实战(四)常用模块

    (3)支持ipv4的路由转发(路径与Centos版本有关)

    # 在文件中设置ip转发并且不重新加载sysctl文件
    [root@Ansible ~]# ansible all -m sysctl -a "name=net.ipv4.ip_forward value=1 sysctl_set=yes sysctl_file=/usr/lib/sysctl.d/50-default.conf"
    192.168.8.66 | SUCCESS => {
        "changed": true
    }
    # 在文件中设置ip转发并在必要时重新加载
    [root@Ansible ~]# ansible all -m sysctl -a "name=net.ipv4.ip_forward value=1 sysctl_set=yes state=present reload=yes sysctl_file=/usr/lib/sysctl.d/50-default.conf"
    192.168.8.66 | SUCCESS => {
        "changed": false
    }

    自动化运维工具Ansible实战(四)常用模块

    二十、unarchive模块

    1、简介

    • unarchive模块用于解压文件
    • 默认情况下,它将在解包之前将源文件从本地复制到目标主机
    • 设置remote_src = yes将解包目标主机上已有的解压文件
    • 对于Windows目标,请改用win_unzip模块

    2、参数
    这个模块有两种用法:
    (1)将Ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下,copy=yes
    (2)将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no
    具体的参数如下:

    attributes(2.3后新增):文件或目录的属性
    copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在
    creates(1.6后新增):指定的绝对路径(文件或目录)已经存在时,则解压指令不执行
    decrypt(2.4后新增):控制使用保管库对源文件进行自动解密
    dest:远程主机上的一个绝对路径,即文件解压的路径
    exclude(2.1后新增):列出想要从非归档操作中排除的目录和文件条目
    extra_opts(2.1后新增):通过传入数组来指定其他选项
    group:解压后文件或目录的所属组
    owner:解压后文件或目录的所属组用户
    keep_newer(2.1后新增):不要替换比归档文件更新的现有文件
    list_files(2.0后新增):如果设置为yes,则会列出压缩包里的文件,默认为no
    mode:解压后文件或目录的权限。对于那些习惯于/usr/bin/chmod的记住,模式实际上是八进制数字(如0644or 01777)。离开前导零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
    remote_src(2.2后新增):设置为yes表示归档文件已经在远程系统上,而不是本地的Ansible控制器。这个选项是与之互斥的copy
    src:如果copy为yes,则需要指定压缩文件的源路径。如果remote_src=no(默认),将归档文件的本地路径复制到目标服务器; 可以是绝对的或相对的。如果remote_src=yes,将目标服务器上的路径解压到现有的存档文件。
    如果remote_src=yes并src包含://,远程机器将首先从URL下载文件。(version_added 2.0)。这仅适用于简单情况,对于完全下载支持,请使用get_url模块
    validate_certs(2.2后新增):仅适用于使用https URL作为文件的来源

    3、示例
    (1)将 ansible.tar解压缩到远程主机/tmp/ 中

    # 创建一个本地tar包
    [root@Ansible ~]# cd /etc/
    [root@Ansible etc]# tar cf ansible.tar ansible/
    # 将ansible.tar解压到远程主机上
     [root@Ansible etc]# ansible all -m unarchive -a "src=/etc/ansible.tar dest=/tmp/ mode=0755"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/tmp/",
        "extract_results": {
            "cmd": [
                "/usr/bin/gtar",
                "--extract",
                "-C",
                "/tmp/",
                "-f",
                "/root/.ansible/tmp/ansible-tmp-1525230128.965889-28889483585284/source"
            ],
            "err": "",
            "out": "",
            "rc": 0
        },
        "gid": 0,
        "group": "root",
        "handler": "TarArchive",
        "mode": "01777",
        "owner": "root",
        "size": 142,
        "src": "/root/.ansible/tmp/ansible-tmp-1525230128.965889-28889483585284/source",
        "state": "directory",
        "uid": 0
    }
    # 进行验证
    [root@Ansible etc]# ansible all -m command -a "ls -l /tmp"
    192.168.8.66 | SUCCESS | rc=0 >>
    总用量 0
    drwxr-xr-x 2 root root 38 5月   2 10:12 ansible
    drwx------ 2 root root 65 5月   2 11:02 ansible_z_94tQ

    自动化运维工具Ansible实战(四)常用模块

    (2)将远程主机test.tar解压缩到指定目录/opt/ 中

    # 在远程主机创建一个tar包
    [root@Client ~]# mkdir /root/test
    [root@Client ~]# tar cf test.tar test/
    [root@Client ~]# ll
    总用量 12
    drwxr-xr-x 2 root root     6 5月   2 11:12 test
    -rw-r--r-- 1 root root 10240 5月   2 11:12 test.tar
    # 在Ansible服务端进行操作
    [root@Ansible ~]# ansible all -m unarchive -a "src=/root/test.tar dest=/opt/ remote_src=yes"
    192.168.8.66 | SUCCESS => {
        "changed": true,
        "dest": "/opt/",
        "extract_results": {
            "cmd": [
                "/usr/bin/gtar",
                "--extract",
                "-C",
                "/opt/",
                "-f",
                "/root/test.tar"
            ],
            "err": "",
            "out": "",
            "rc": 0
        },
        "gid": 0,
        "group": "root",
        "handler": "TarArchive",
        "mode": "0755",
        "owner": "root",
        "size": 18,
        "src": "/root/test.tar",
        "state": "directory",
        "uid": 0
    }

    自动化运维工具Ansible实战(四)常用模块

    以上就是Ansible常用的模块,如果还需要其它的模块的话可以查看官方文档,也可以通过命令来进行查看
    1、查看所有的模块命令: ansible-doc -l
    2、查看具体某个模块用法:ansible-doc -s MODULE_NAME

    展开全文
  • fablinker是一个类似的开源自动化运维工具,在一台服务器上可管理控制多个远程主机。 基于fabric开发,兼容python2.7,python3 +。相对的ansible和fabric,fablinker基于命令行交互操作,使用起来更加方便快捷。 ...
  • 在Linux中,我们可以通过 ansible-doc -l 命令查看到当前Ansible支持哪些模块,通过 ansible-doc -s [模块名] 又可以查看该模块有哪些参数可以使用。 ansible [主机或组] -m [模块名] -a ['模块参数'] [ansible...
  • 第58章 Ansible 目录 第58章 Ansible 一、Ansible基础概述 ... 1.4)Ansible基础架构(必要了解,是知识要点) 二、ansible安装 2.1)ansible安装三、Ansible Inventory 四、Ansibl...
  • 网络监控及运维自动化 :  1、系统安装自动化:kickstart,cobbler等 2、配置部署自动化:puppet,saltstart,ansible等 3、监控(报警)自动化: nagios(监控系统),ganglia(集群监控),cacti(流量监控)、...
  • Ansible 可以使用命令行方式进行自动化管理,命令管理工具都是一系列模块、参数所支持的。基本语法如下:ansible <host-pattern> [ –m module_name ] [ –a args]<host-pattern> : 对哪些主机有效[ ...
  • Ansible是一个自动化管理IT资源的工具自动化 2 管理 3 IT资源 二 Ansible功能有哪些 1 系统环境配置 2 安装软件 3 持续集成 4 热回滚 三 Ansible优点 1 无客户端 2 推送式 3 丰富的...
  • 自动化运维如何逐步开展起来?都有哪些事情要做? 现在国外都有哪些公司有 SRE 岗位? 关于自动化演进的 5 个阶段,能结合实例做一些更详细的介绍么? SRE 是否定位为系统运行阶段?还是产品的全生命周期? 初创或...
  • 昊鼎王五:运维自动化闭环,从腾讯走出来的实践 关键词:蓝鲸和织云 本文是数人云深圳技术分享课上优维科技联合创始人...*首先,我要知道我的厨房里到底有些什么东西是可用的,比如备了哪些菜,那些工具,这...
  • 自动化运维工具 熟悉jenkins 、salt 、gitlab 5.简单列出如何做容灾与恢复,保证数据安全? 容灾我们在异地也部署一套模拟真实环境,数据库每天进行全量备份,推送异地服务器上,以便于恢复使用 可以.
  • 本文是数人云深圳技术分享课上优维科技联合创始人彭鲤航的演讲实录,演讲主题是《运维自动化实践》。...首先,我要知道我的厨房里到底有些什么东西是可用的,比如备了哪些菜,那些工具,这些就是配置管理。 ...
  • Ansible自动化工具部署实例

    千次阅读 2017-07-24 13:53:47
    今天给大家介绍另外一款自动化运维工具:Ansible Ansible自动化工具只需要在一台机器上安装,其他机器不需要安装任何东西,这就是ansible比puppet, saltstck方便的地方。ansible的特点有哪些呢?下面为你逐个介绍:...
  • 上次写了个puppet安装的文档,今天给大家介绍另外一款自动化运维工具:ansible ansible自动化工具只需要在一台机器上安装,其他机器不需要安装任何东西,这就是ansible比puppet, saltstck方便的地方。ansible的特点...
  • 运维技术创新翻天覆地,传统的ITIL体系和工具自动化已经升级到全面广义运营体系化,新时代海量运维更加关注运维 管理云化、资源虚拟化、海量服务架构、运维大数据等诸多领域,业务发展压力和运维技术创新挑战并存。...
  • IT资产管理必备的工具有哪些

    千次阅读 2015-10-17 10:14:56
    IT运维已经在风风雨雨中走过了十几个春秋,如今它正以一种全新的姿态摆在我们面前--自动化,这是IT技术发展的必然结果。现在IT系统的复杂性已经客观上要求IT运维必须能够实现数字化、自动化维护。IP-guard资产管理...
  • 自动化到智能化运维过渡时,美团DBA团队进行了哪些思考、探索与实践?本文根据赵应钢在“第九届中国数据库技术大会”上的演讲内容整理而成,部分内容更新。 背景 近些年,传统的数据库运维方式已经越来越...
  • 随着目前IT迅猛的发展,自动化运维对于Linux运维人员也越来越重要,传统的运维方式靠大量的人力,现在也逐渐转向自动化运维,我们常见的跟自动化有关的软件有哪些呢。 今天我们来简单列举一下:kickistart、puppet、...
  • 那么自动化测试到底都有哪些常用的工具呢,它们到底有哪些各自的特色呢,今天和大家一起看看吧,具体里面的工具去搜一下就可以了,找找权威的网站,在这我就不一一追加了。下面是自动化测试分类大概有七种。 对...
  • 1.实现应用运行环境的标准化,提升交付速度:通过容器...2.实现运维过程的高度自动化,降低运维成本:PaaS平台提供多种自动化运维工具管理应用集群系统,比如智能负载可以实时观测集群节点的变化并智能修改路由配置...
  • 文章目录Linux1、简单说说dhcp交互过程中四种报文2、你一般使用shell脚本做什么3、shell脚本常问4、linux常见运维命令(常规除外)5、你常用的抓包工具6、服务器性能分析命令有哪些7、常用的查看系统硬件资源的命令8...
  • 自动化运维工具那么多,比如(statstack,puppet,cfengine、chef、func、fabric)为什么,偏偏要使用ansible呢? 他有哪些好处,那他到底能做些什么呢? 好了,接下来一一说明: 首先ansible是新出现的自动化...
  • CI/CD 是 DevOps 的基础,CI/CD 侧重于软件开发过程中的自动化,而 Devops 则是侧重于文化构建,旨在减少开发、运维、QA之间的沟通鸿沟,促进快速可靠发布的同时还保证产品质量。 CI/CD 一系列流程通常会组成一个...
  • 除Ansible外,常见的自动化运维工具还有Pssh,Puppet,Chef,Saltstack等等。 在企业生产环境中,Ansbile和Saltstack使用较为广泛。以下内容主要介绍Ansible使用。 Q:Ansible有哪些特点? 1、Ansible基于Python语言...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

自动化运维工具有哪些