zoukankan      html  css  js  c++  java
  • ansible服务的部署与使用

     
    简介:
     
      ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
     
      ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
        (1)、连接插件connection plugins:负责和被监控端实现通信;
        (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
        (3)、各种模块核心模块、command模块、自定义模块;
        (4)、借助于插件完成记录日志邮件等功能;
        (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
     
    部署:
     
      1、部署ssh key
     
    #创建秘钥
    ssh-keygen -t dsa
    #分发公钥
    ssh-copy-id -i /root/.ssh/id_dsa.pub -p 22 root@172.20.10.3
    #秘钥登录测试
    ssh root@172.20.10.3 "hostname -i"
    #免交互创建秘钥【用于脚本创建】
    ssh-keygen -t dsa -f ~/.ssh/id_rsa -N "" -q
    #-t指定秘钥类型 -f指定秘钥文件保存的路径 -N免交互方式指定密码信息 -q不输出信息,减少信息输出

      ssh服务分发公钥执行过程

      ①. 管理服务器创建私钥和公钥(密钥对)

      ②. 将公钥文件远程传送复制到被管理服务器相应用户~/.ssh/id_dsa.pub下,并修改.ssh目录权限为700

      ③. 修改公钥文件文件名称为authorized_keys,授权权限为600

      ④. 利用ssh服务配置文件的配置参数,进行识别公钥文件authorized_keys

      ⑤. 进而实现基于密钥远程登录服务器(免密码登录/非交互方式登录)

       解决分发公钥时需要的交互问题
      
    sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub root@172.20.10.5 -o StrictHostKeyChecking=no
    #sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码【sshpass可通过yum或编译安装】
    #-p 参数指定明文密码【密码与-p之间不能有空格

       

      2、部署ansible

    #该软件是用来对selinux进行设置的,确保即使服务器selinux服务开启,依旧能够通过ansible 软件管理
    yum install libselinux-python -y
    #安装ansible软件
    yum install ansible -y
    #修改hosts文件
    cat >>/etc/ansible/hosts<<EOF
    [test]
    172.20.10.5
    172.20.10.3
    EOF

      hosts文件参数介绍:

      1.中括号中的名字代表组名

      2.主机(hosts)部分可以使用域名、主机名、IP地址表示;一般此类配置中多使用IP地址

      3.组名下的主机地址就是ansible可以管理的地址

    ansible部署完成!

     
      3、实践
        ansible部分文件介绍 
          
    /etc/ansible/hosts 定义anisble软件可以管理的主机信息
    /usr/bin/ansible ansible执行命令
    /usr/bin/ansible-playboot ansible执行剧本命令
    /etc/ansible/ansible.cfg ansible配置文件
    /etc/ansible/roles 主要在自动化的时候部署多台主机时使用
       
      
      3.1、远程批量执行命令

        语法:

        ansible clsn -a "uptime"
    
       ansible clsn -m command -a "uptime"
    
       ansible 定义的组/单个ip/域名/all  -m command -a "uptime"

        说明:-m 指定使用的模块

              -a 指定使用模块中相应的命令参数

              命令参数只能是基本命令,并不支持管道操作

              all   为hosts文件中的组全部管理

     
      3.2、未分发公钥如何实现远程管理主机及指定ansible端口信息

        配置hosts文件时配置上密码

          IP:端口 用户 密码

    vim /etc/ansible/hosts
    
    [test]
    172.20.10.3:50001 ansible_ssh_user=root ansible_ssh_pass=123456
    172.20.10.5

        指定端口 用户名

    [test]
    www.test.com:50001 ansible_ssh_user=root

        测试修改端口后的结果 使用ping 模块

    [root@localhost ansible]# ansible test -m ping
    172.20.10.5 | SUCCESS => {
    "changed": false,
    "ping": "pong"
    }
    172.20.10.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
    }

      3.3、ansible软件常用参数表
     

    命令参数

    参数说明

    -m  MODULE_NAME

    -module-name=MODULE_NAME

    module name to execute (default=command)

    相应名称的模块被执行(默认模块为command );

    -m后边是模块的名宇

    -a MODULE_ARGS

    -args=MODULE_ARGS

    module arguments

    模块参数信息

    -a后面是要执行的命令;也可以写个ip ,针对台机器来执行命令

    -C, -checks

    don't make any changes, instead, try to predict some of the changes that may

    occurs

    不做任何改变;反而,只是尝试预言些可能出现的改变

    -syntax-checks

    perform a syntax check on the playbook, but do not execute ii*>

    执行语法检查在剧本上,但是并不执行剧本

      3.4、ansible命令执行结果色彩说明
          绿色:表示没有发生任何改变
          红色:执行命令操作出现异常
          黄色:执行命令后,对受控主机产生影响,发生了配置改变
      3.5、command命令常用参数说明

    参数

    参数说明

    chdir

    在执行命令之前,通过cd命令进入到指定目录中

    # ansible clsn -m command -a "chdir=/tmp ls"

    create

    定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤

    executable

    改变shell使用command进行执行,并且执行时要使用绝对路径

    free_form

    命令模块采用自由形式命令运行;即可以输入任意linux命令

    removes

    定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

    warn

    (added in 1.8)

    如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

        举例:

          [root@localhost ~]# ansible test -m command -a "chdir=/tmp pwd"【不指定模块的时候默认使用的模块就是command】
          172.20.10.5 | SUCCESS | rc=0 >>
          /tmp

          172.20.10.3 | SUCCESS | rc=0 >>
          /tmp

        3.5.1、shell模块

          [root@localhost ~]# ansible test -m shell -a "/bin/bash /root/test.sh"
          172.20.10.3 | SUCCESS | rc=0 >>
          10.3

          172.20.10.5 | SUCCESS | rc=0 >>
          10.5

        3.5.2、script模块【使用scripts模块,不用将脚本传输到远程节点,脚本本身不用进行授权,即可利用script模块执行。直接执行脚本即可,不需要使用sh】
    [root@localhost ~]# ansible test -m script -a "/root/free.sh"
    172.20.10.5 | SUCCESS => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.20.10.5 closed.
    ", 
        "stdout": "              total        used        free      shared  buff/cache   available
    Mem:           976M        163M        618M        7.0M        194M        645M
    Swap:          1.0G          0B        1.0G
    ", 
        "stdout_lines": [
            "              total        used        free      shared  buff/cache   available", 
            "Mem:           976M        163M        618M        7.0M        194M        645M", 
            "Swap:          1.0G          0B        1.0G"
        ]
    }
    172.20.10.3 | SUCCESS => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.20.10.3 closed.
    ", 
        "stdout": "              total        used        free      shared  buff/cache   available
    Mem:           976M        165M        616M        7.0M        194M        642M
    Swap:          1.0G          0B        1.0G
    ", 
        "stdout_lines": [
            "              total        used        free      shared  buff/cache   available", 
            "Mem:           976M        165M        616M        7.0M        194M        642M", 
            "Swap:          1.0G          0B        1.0G"
        ]
    }

        3.5.3、copy模块 把本地文件发送到远端

    选项参数

    选项说明

    backup(重要参数)

    在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no

    content

    用于替代"src”,可以直接设定指定文件的值

    dest

    必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

    directory_mode

    递归设定目录的权限,默认为系统默认权限

    forces

    如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖。

    如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes。别名:thirsty

    others

    所有的file模块里的选项都可以在这里使用

    src

    被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

    mode

    定义文件或目录的权限;注意:是4位

    owner

    修改属主

    group

    修改属组

               说明: src和content不能同时使用
        copy模块实践: 
    #使用copy模块,将free.sh文件传输到各个服务器送,权限修改为0600,属主www属组为root
    ansible test -m copy -a "src=/root/free.sh dest=/opt/ mode=0600 owner=www group=root"
    #复制远程主机上的文件remote_src=true参数
    ansible test -m copy -a "src=/opt/free.sh dest=/home/www/ remote_src=true"
    #重新定义文件内容,类似于重定向>
    ansible test -m copy -a "content=test.com dest=/opt/free.sh"
    #查看文件内容
    [root@localhost ~]# ansible test -m shell -a "cat /opt/free.sh"
    172.20.10.5 | SUCCESS | rc=0 >>
    test.com
    
    172.20.10.3 | SUCCESS | rc=0 >>
    test.com

        3.5.4、file模块【设置文件属性】

          常用参数:

    参数

    参数说明

    owner

    设置复制传输后的数据属主信息

    group

    设置复制传输后的数据属组信息

    mode

    设置文件数据权限信息

    dest

    要创建的文件或目录命令,以及路径信息

    src

    指定要创建软链接的文件信息

    state

    state参数信息

    directory

    创建目录

    file

    创建文件

    link

    创建软链接

    hard

    创建出硬链接

    absent

    目录将被递归删除以及文件,而链接将被取消链接

    touch

    创建文件;如果路径不存在将创建一个空文件

          file模块实践:  
    #创建目录
    ansible test -m file -a "dest=/opt/test_dir state=directory"
    #创建文件
    ansible test -m file -a "dest=/opt/test.sh state=touch"
    #创建软链接
    ansible test -m file -a "src=/bin/bash dest=/opt/bash_link state=link"
    #删除目录和文件
    ansible test -m file -a "dest=/opt/test_dir state=absent"
    #创建多级目录
    ansible test -m copy -a "src=/etc/hosts dest=/opt/1/2/3/4/5/"

    PS:重命名和创建多级目录不能同时实现

        3.5.4、fetch模块【拉取文件】
          参数说明:

    参数

    参数说明

    dest

    将远程主机拉取过来的文件保存在本地的路径信息

    src

    指定从远程主机要拉取的文件信息,只能拉取文件

    flat

    默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息

           fetch模块实例:
            
    #拉去远程主机上的文件至本地主机
    [root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/"
    172.20.10.5 | SUCCESS => {
        "changed": true, 
        "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "dest": "/opt/172.20.10.5/opt/abc", 
        "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
        "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "remote_md5sum": null
    }
    172.20.10.3 | SUCCESS => {
        "changed": true, 
        "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "dest": "/opt/172.20.10.3/opt/abc", 
        "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
        "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "remote_md5sum": null
    }
    
    #flat参数,拉去的时候不创建目录(同名文件会覆盖)
    [root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/ flat=yes"
    172.20.10.5 | SUCCESS => {
        "changed": true, 
        "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "dest": "/opt/abc", 
        "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
        "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "remote_md5sum": null
    }
    172.20.10.3 | SUCCESS => {
        "changed": false, 
        "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
        "dest": "/opt/abc", 
        "file": "/opt/abc", 
        "md5sum": "d41d8cd98f00b204e9800998ecf8427e"
    }

        3.5.4、mount模块【配置挂载点】

          参数详情:
          

    参数

    参数说明

    fstype

    指定挂载文件类型 -t nfs == fstype=nfs

    opts 

    设定挂载的参数选项信息 -o ro  == opts=ro

    path 

    挂载点路径          path=/mnt

    src  

    要被挂载的目录信息  src=172.16.1.31:/data

    state 

    state状态参数

    unmounted

    加载/etc/fstab文件 实现卸载

    absent  

    在fstab文件中删除挂载配置

    present 

    在fstab文件中添加挂载配置

    mounted

    1.将挂载信息添加到/etc/fstab文件中

    2.加载配置文件挂载

          mount模块实例:
    #挂载
    [root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/  src=172.16.1.31:/data/ state=mounted"
    172.16.1.8 | SUCCESS => {
        "changed": true,
        "dump": "0",
        "fstab": "/etc/fstab",
        "fstype": "nfs",
        "name": "/mnt/",
        "opts": "rw",
     "passno": "0",
      "src": "172.16.1.31:/data/"
    }
    
    #卸载
    [root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/  src=172.16.1.31:/data/ state=unmounted"
    172.16.1.8 | SUCCESS => {
       "changed": true,
        "dump": "0",
        "fstab": "/etc/fstab",
        "fstype": "nfs",
        "name": "/mnt/",
        "opts": "rw",
        "passno": "0",
        "src": "172.16.1.31:/data/"
    }

        3.5.4、cron模块

    参数

    参数说明

    minute  分

    Minute when the job should run ( 0-59, *, */2, etc )

    hour    时

    Hour when the job should run ( 0-23, *, */2, etc )

    day     日

    Day of the month the job should run ( 1-31, *, */2, etc )

    month   月

    Month of the year the job should run ( 1-12, *, */2, etc )

    weekday 周

    Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

    job     

    工作 ;要做的事情

    name    

    定义定时任务的描述信息

    disabled

    注释定时任务

    state   

    state 状态参数

    absent

    删除定时任务

    present

    创建定时任务

    默认为present

           cron实例模块详解:

    添加定时任务

    [root@m01 ~]# ansible clsn -m cron -a "minute=0 hour=0 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null' name=clsn01"
    172.16.1.8 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": [
         "clsn01"
        ]
    }

    删除定时任务

    [root@m01 ~]# ansible clsn -m cron -a "minute=00 hour=00 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null' name=clsn01 state=absent"
    172.16.1.8 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": []
    }

    只用名字就可以删除

    [root@m01 ~]# ansible clsn -m cron -a "name=clsn01  state=absent"
    172.16.1.31 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": []
    }

    注释定时任务

       注意: 注释定时任务的时候必须有job的参数

    [root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null'  disabled=yes"
    172.16.1.31 | SUCCESS => {
        "changed": true,
        "envs": [],
        "jobs": [
        "clsn01"
        ]
    }

    取消注释

    [root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null'  disabled=no"
    172.16.1.41 | SUCCESS => {
        "changed": true,
        "envs": [],
       "jobs": [
           "clsn01"
        ]
    }
     
          3.5.4、yum模块

    参数

    参数说明

    name=name    

    指定安装的软件

    state=installed

    安装

            yum模块实践:
    #安装lrzsz服务
    [root@localhost ~]# ansible test -m yum -a "name=lrzsz state=installed"
    172.20.10.3 | SUCCESS => {
        "changed": true, 
        "msg": "", 
        "rc": 0, 
        "results": [
            "Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.tuna.tsinghua.edu.cn
     * extras: mirrors.tuna.tsinghua.edu.cn
     * updates: mirrors.tuna.tsinghua.edu.cn
    Resolving Dependencies
    --> Running transaction check
    ---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ================================================================================
     Package         Arch             Version                  Repository      Size
    ================================================================================
    Installing:
     lrzsz           x86_64           0.12.20-36.el7           base            78 k
    
    Transaction Summary
    ================================================================================
    Install  1 Package
    
    Total download size: 78 k
    Installed size: 181 k
    Downloading packages:
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : lrzsz-0.12.20-36.el7.x86_64                                  1/1 
      Verifying  : lrzsz-0.12.20-36.el7.x86_64                                  1/1 
    
    Installed:
      lrzsz.x86_64 0:0.12.20-36.el7                                                 
    
    Complete!
    "
        ]
    }
     
          3.5.4、service模块【服务管理】
     

    参数

    参数说明

    name=service name

    服务的名称

    state=参数

    停止服务 服务状态信息为过去时

    stared/stoped/restarted/reloaded

    enabled=yes 

    设置开机自启动

                   说明 :service 管理的服务必须存在在/etc/init.d/下有的服务脚本
             service模块实践:
              
    #重启crond服务
    ansible test -m service -a "name=crond state=restarted"

        3.6、ansible常用模块

    常用模块

    模块说明

    command  (重要模块)

    执行命令模块,ansible命令执行默认模块

    shell    (重要模块) 

    行shell脚本模块

    script   (重要模块)

    把脚本发到客户端,然后执行;执行脚本命令在远端服务器上

    copy      (重要模块)  

    把本地文件发送到远端

    file              

    设定文件属性模块

    services          

    系统服务管理模块

    cron              

    计划任务管理模块

    yum              

    yum软件包安装管理模块

    synchronize       

    使用rsync同步文件模块

    mount             

    挂载模块

         3.7、其他模块补充
    #hostname 修改主机名模块
    ansible 172.20.10.5 -m hostname -a "name=test1"
    
    #selinux 管理模块
    ansible 172.16.1.8 -m selinux -a "state=disabled"
    
    #get_url 模块 == 【wget】
    ansible 172.16.1.8 -m get_url -a "url=http://lan.znix.top/RDPWrap-v1.6.1.zip dest=/tmp/"
    
      url=下载文件的地址dest下载到哪里
      timeout 超时时间
      url_password   密码
      url_username  用户名
     
     
     
     参考链接:https://www.cnblogs.com/clsn/p/7743792.html#auto_id_93
     
     
  • 相关阅读:
    ASP.NET MVC 常用内置验证特性 简介
    为什么要有get方法?-多态内存分析的应用
    多态的内存分析-转载
    抽象类和接口
    多态
    通过序列化复制整个对象
    检查异常和非检查异常
    怎样抛出自己定义的异常
    try catch和throws怎么用?-结合使用
    两个对象整体内容的比较-重写对象的equals方法
  • 原文地址:https://www.cnblogs.com/cpw6/p/10559238.html
Copyright © 2011-2022 走看看