• 六.ansible批量管理服务


    期中集群架构-第六章-ansible批量管理服务介绍
    ======================================================================

    01. 批量管理服务知识介绍
       a. ansible是一个基于Python开发的自动化运维工具
       b. ansible是一个基于ssh协议实现远程管理的工具
       c. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)
       saltstack puppet

    02. 批量管理服务特征介绍 简单便捷
       a ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置
       b ansible软件客户端(受控端):没有客户端软件安装

    03. ansible软件安装部署
    a ansible软件自动化环境架构规划
       管理主机1台:
       10.0.0.61 m01
       受控主机3台:
       10.0.0.41 backup
       10.0.0.31 nfs01
       10.0.0.7 web01
       Linux系统 6.9
    b ansible软件自动化部署条件
       建议基于ssh密钥方式建立远程连接
    a ssh密钥对创建(管理主机)
          ssh-keygen -t dsa
          影响免交互创建密钥对创建因素:
       1)需要指定私钥存放路径

           -f 指定私钥路径
          -f /root/.ssh/id_dsa
       2)需要进行私钥文件密码设定
          -N/-P
          -N ""/-P "" 密码为空

          免交互创建密钥对方法
          ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""

    b 分发公钥文件(管理主机进行分发)

          # ssh-copy-id -i /root/.ssh/id_dsa.pub lianxizc@118.24.2.20
             ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
            影响免交互批量分发密钥因素:
        1)需要有确认连接过程,需要输入yes/no
              -o StrictHostKeyChecking=no

             免交换分发公钥最终
             sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"

        2)需要解决密码问题
              sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
              Now try logging into the machine, with "ssh '172.16.1.31'", and check in:

              .ssh/authorized_keys

              to make sure we haven't added extra keys that you weren't expecting.

       免交互批量分发公钥脚本:
                #!/bin/bash
                m  /root/.ssh/id_dsa*
                ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""

                for ip in 31 41 7
                do
                sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
                done

    密码

    ssh-copy-id 指定ssh  17524端口在/root/.ssh/下添加config文件内容为port 17524

    c 检查是否可以进行基于密钥远程管理
       ssh 172.16.1.31 uptime
       免交互批量检查测试脚本

       #!/bin/bash/

       if [ $# -ne 1 ];then
       echo "input one agrs"
       exit 1
       fi

       for ip in 31 41 7 8 9
       do
       echo ===== info 172.16.1.$ip =====
       ssh -p17524 172.16.1.$ip $1
       echo ""
       done

    运行测试检查主机名称

    补充说明:ssh-copy-id 公钥分发原理

        which ssh-copy-id 

        /usr/bin/ssh-copy-id

        vim  /usr/bin/ssh-copy-id

    第41行:

    { eval "$GET_ID" ; } | ssh $1 "exec sh -c 'cd; umask 077;test -d .ssh || mkdir .ssh ;

    cat >> .ssh/authorized_    keys && (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'" ||     exit 1

    1.临时设置一个umask值 为077

    2.test -d 判断是否存在.ssh/目录,没有就利用脚本创建.ssh/目录

    3.将本地公钥文件中的信息重定向到远程主机的.ssh/authorized_ keys文件中

        并授权此文件为600权限

       基于以上信息知道,分发公钥实际上是通过ssh命令来实现的

       通过修改ssh-copy-id信息

    第一种

          把-p参数添加进去 也就解决了指点端口号分发公钥

          ssh  -p17524  $1 "exec sh -c 'cd; umask 077

    第二种

           利用$1  传参数 ip地址相当于$1 把它和-p 17524整合一起

           ssh-copy-id  -i  /root/.ssh/id_dsa.pub  "172.16.1.31  -p17524"

           或者:

           在/root/.ssh/下添加config文件内容为port 17524 也可

    为什么$1 是最后的ip地址不是排在第一的 -i 呢 

    # vim shift_test.sh

    #!/bin/bash

    until [ $# -eq 0 ]
    do
         echo  $*   #输出所有参数
         shift          #shift命令主要在脚本中应用时会将传参的参数依次向前推进
    done

    只要是ssh 的参数都可以和ip进行一个捆绑 

    列如

    sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"

    基于ssh口令方式建立远程连接(也可以)

    vim /etc/ansible/hosts
    [oldboy]
    172.16.1.7
    172.16.1.31 ansible_user=root ansible_password=123456 
    172.16.1.41

    ansible 172.16.1.31 -m command -a "hostname" -k --- 实现口令交互式远程管理
    SSH password:
    172.16.1.31 | SUCCESS | rc=0 >>
    nfs01


    ansible管理主机软件安装:
       yum install -y ansible
       ansible受控主机软件安装:(可选)
       yum install -y libselinux-python

    d ansible软件受控主机添加配置
        cat /etc/ansible/hosts
        [oldboy]         分组
       172.16.1.7:17524     添加受控主机和指定ssh端口号
       172.16.1.31:17524   。。。。。。。
       172.16.1.41:17524   。。。。。。。

    如果受控主机不能基于秘钥的方式认证,基于口令的免交互连接

    可以在host文件中主机ip后面添加上指定的 用户和密码

    172.16.1.31:17524 ansible_user=root ansible_password=333333

    04. ansible软件应用过程
    ansible软件模块
       ansible-doc -l|wc -l
       
    1378
      ansible oldboy -m command -a "hostname"
       ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数

       主机信息:远程主机IP地址 远程主机组名称 远程所有主机all
       -m 指定相应模块
       -a 利用模块中某些参数功能

    命令模块:
    第一个模块:command
       官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html
       参数:chdir---在执行某个命令前,先切换目录
       [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"
       172.16.1.31 | SUCCESS | rc=0 >>
       /tmp

       [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd"
       172.16.1.31 | SUCCESS | rc=0 >>
       /etc

       参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
       [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
       172.16.1.41 | SUCCESS | rc=0 >>
       skipped, since /etc/rsyncd.conf exists

       [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname"
       172.16.1.41 | SUCCESS | rc=0 >>
       skipped, since /etc/rsyncd.conf.bak exists

       [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname"
       172.16.1.41 | SUCCESS | rc=0 >>
       backup

       参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
       [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
       172.16.1.41 | SUCCESS | rc=0 >>
       backup

       [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
      172.16.1.41 | SUCCESS | rc=0 >>
      skipped, since /etc/rsyncd.1212213123 does not exist

       参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
       ansible 172.16.1.41 -m command -a "ls"
       172.16.1.41 | SUCCESS | rc=0 >>
       1
       anaconda-ks.cfg
       dead.letter
       heqing

    第二个模块:shell模块 (相当于万能模块

       参数:chdir---在执行莫个命令前,先切换目录
       参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
       参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
       参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
       [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd"
       172.16.1.41 | SUCCESS | rc=0 >>
       1
       anaconda-ks.cfg
       dead.letter
       /root

       说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;

    第三个模块:script---专门运行脚本模块 让脚本在受控主机上执行
       参数:chdir---在执行莫个命令前,先切换目录
       参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
       参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
       参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

    ansible 172.16.1.41 -m script -a "/server/scripts/yum.sh"

    文件类型模块:
    第一个模块:copy----复制模块
       参数:backup---对数据信息进行备份   
       [root@m01 ansible]# ansible 172.16.1.41

       -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"
       172.16.1.41 | SUCCESS => {
       "backup_file": "/tmp/file01.txt.71887.2018- 4-02@23:33:19~",
       "changed": true,
       "checksum": "029b054db136cc36d5605e3818305825ff4b8ffb",
       "dest": "/tmp/file01.txt",
       "gid": 0,
       "group": "root",
       "md5sum": "434660b5ad7deeba8815349f71409405",
       "mode": "0644",
       "owner": "root",
       "size": 6,
       "src": "/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source",
       "state": "file",
       "uid": 0
       }

       参数:src---定义要推送数据信息
       参数:dest---定义将数据推送到远程主机什么目录中
       [root@m01 ansible]# touch /tmp/file01.txt
       [root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
      172.16.1.41 | SUCCESS => {
       "changed": true,
       "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
       "dest": "/tmp/file01.txt",
       "gid": 0,
       "group": "root",
       "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
       "mode": "0644",
       "owner": "root",
       "size": 0,
       "src": "/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source",
       "state": "file",
       "uid": 0
       }
       [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
       172.16.1.41 | SUCCESS | rc=0 >>
       total 24
       -rw-r--r-- 1 root root 0 Apr 2 23:29 file01.txt

       参数:owner---设置复制后的文件属主权限
       参数:group---设置复制后的文件属组权限
       参数:mode---设置复制后的文件权限(600 755)

    第二个模块:file----文件属性修改/目录创建/文件创建
       参数:owner---设置复制后的文件属主权限
       参数:group---设置复制后的文件属组权限
       参数:mode---设置复制后的文件权限(600 755)
       ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600"
       172.16.1.41 | SUCCESS => {
       "changed": true,
       "gid": 500,
       "group": "oldboy",
       "mode": "0600",
       "owner": "oldboy",
       "path": "/tmp/file01.txt",
       "size": 6,
       "state": "file",
       "uid": 500
       }

      参数state---用于指定创建目录或文件
       创建文件
       ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch"
       172.16.1.41 | SUCCESS => {
       "changed": true,
       "dest": "/tmp/file01.txt",
       "gid": 0,
       "group": "root",
       "mode": "0644",
       "owner": "root",
       "size": 0,
       "state": "file",
       "uid": 0
       }
    检查文件

    ansible 172.16.1.41  -m shell  -a "ls -l /tmp/"
       创建目录:
       ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory"
       172.16.1.41 | SUCCESS => {
       "changed": true,
       "gid": 0,
       "group": "root",
       "mode": "0755",
       "owner": "root",
       "path": "/tmp/dir01",
       "size": 4096,
       "state": "directory",
       "uid": 0
       }
    检查目录

    [root@m01 ~]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
    172.16.1.41 | SUCCESS | rc=0 >>
    total 2
    drwx------ 2 root root 1024 May 6 22:46 ansible_d8WnHE
    drwxr-xr-x 2 root root 1024 May 6 22:45 zhou


    包管理模块类型
    模块:yum---安装软件包模块
       name:执行要安装软件的名称,以及软件的版本
       state:installed安装 absent(卸载)
       ansible 172.16.1.41 -m yum -a "name=iftop state=installed"
       ansible 172.16.1.41 -m yum -a "name=iftop state=absent"

       list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
       ansible 172.16.1.41 -m yum -a "list=iftop"

    系统模块类型
       模块:

       service---管理服务状态模块
       name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
       state:停止stopped 启动started 重启restarted 平滑重启reloaded
       enabled:yes表示服务开机自启动 no表示服务开机不要自动启动

    关闭crond服务 关闭开机自启动
        # ansible 172.16.1.31 -m service -a "name=crond state=stopped enabled=no"

    开启crond服务 和开机自动启动

       ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"

    cron---定时任务模块
       * * * * * /bin/sh /server/scripts/test.sh &>/dev/null

       分minute=0-59 * */n , -

       时 hour

       日day

       月month

       周weekday

       # ansible 172.16.1.31 -m ceon -a "minute=0 hour=0 day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh &>/dev/null'"

      默认就是每天 月 周可以省略

      # ansible 172.16.1.31 -m ceon -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'

       添加定时任务
       ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"

       name=....  定义定时任务的名称 避免任务重复 这是完整方法
       ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"

       删除定时任务
       ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"

       state=absent  删除定时任务
       ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"

       注释定时任务

       yes注释   no取消注释
       ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
       ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no"

    总结ansible颜色信息:
       绿色:查看远程主机信息,不会对远程主机系统做任何修改
       红色:执行操作出现异常错误
       黄色:对远程主机系统进行修改操作
       粉色:警告或者忠告信息

    ansible软件剧本

    编写剧本规范:
       http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
    遵循pyyaml
    ①. - 用法说明,表示列表显示的内容
    水果信息:
       - 苹果
       - 香蕉
       - 西瓜
    ②. : 用法说明:前面表示名称 后面表示值
    姓名: 张三
    性别: 男
    人员信息:
    - 运维人员: sa
    - 开发人员: dev
    - 存储人员: dba
    ③. 空格 用法说明:
    对内容进行分级时,需要有两个空格表示分级
    软件安装步骤:
      - 服务端安装步骤:
        第一个里程碑: 检查软件是否安装
        第二个里程碑: 编写配置文件内容
      - 客户端安装步骤:
    补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割

    执行脚本方法
    ansible-playbook /etc/ansible/ansible-playbook/test.yaml

    模拟执行剧本 -C

    ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml

    一键部署rsync 服务

    - hosts: 172.16.1.41 定义主机

      tasks:       任务格式 任务和主机是不同的级别所以空两格

        - name:  描述任务级别又不同继续空两格

          yum:     命令又是一个级别再空两格

                          安装rsync

        - name:  跟上面的name一个级别- 划列表

          copy:   rsync的配置文件统一放在一个文件夹里

                         把它推送到服务端的/etc/目录下

          user        创建目录 createhome=no 不创建家目录 shell指定解释器

          copy       事先保存的秘钥模板文件推送到服务端/etc/目录 并设置权限600

          fiel          创建备份目录 并设置属主 属组

          shell        命令启动rsync的守护进程 creates=判断rsync的进程id文件是否存在

                          如果 存在就不执行启动命令

    - hosts          构成列表  以下是部署客户端

                          生成一个认证文件  和权限设置

    作业:
    01. nfs服务一键化部署
    02. inotify/sersync软件一键化部署

  • 相关阅读:
    认识一下JavaScript
    JAVA并发容器之CopyOnWrite容器
    JAVA并发容器之ConcurrentHashMap
    由浅入深理解java集合(一)——集合框架 Collection、Map
    强引用、软引用、弱引用、虚引用
    Lock和synchronized的选择
    Java并发编程:volatile关键字解析
    java线程并发-Thread类的使用
    SQL语句中:UNION与UNION ALL的区别
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/cqzhou/p/8964649.html
Copyright © 2020-2023  润新知