• Linux三阶段之六:ansible批量管理服务介绍


    六、ansible批量管理服务介绍

    (一)批量管理服务知识介绍

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

    (二)批量管理服务特征介绍

    a ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置
    b ansible软件客户端(受控端):没有客户端软件安装
    

    (三)ansible软件安装部署

    1 .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
    
    

    2 ansible软件自动化部署条件

    a .ssh密钥对创建(管理主机,建议基于ssh密钥方式建立远程连接)

    ssh-keygen -t dsa
    影响免交互创建密钥对创建因素:
    1)需要指定私钥存放路径
    -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 172.16.1.31
    影响免交互批量分发密钥因素
    1)需要有确认连接过程,需要输入yes/no
    -o StrictHostKeyChecking=no
    sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"
    
    2)需要解决密码问题
    sshpass -p123456 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
    rm /root/.ssh/id_dsa
    ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
    
    for ip in 31 41 7
    do
    sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
    done
    
    

    c .检查是否可以进行基于密钥远程管理

    ssh 172.16.1.31 uptime
    免交互批量检查测试脚本
    #!/bin/bash
    rm /root/.ssh/id_dsa
    ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
    
    for ip in 31 41 7
    do
    sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
    done
    
    基于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
    

    3 ansible软件下载安装

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

    4.ansible软件受控主机添加配置

    cat /etc/ansible/hosts
    [oldboy]
    172.16.1.7
    172.16.1.31
    172.16.1.41
    
    

    (四)ansible软件应用过程

    ansible软件模块

    ansible-doc -l|wc -l
    1378
    
    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合法命令信息
    

    文件类型模块

    第一个模块: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-04-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 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
    }
    

    包管理模块类型

    模块: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表示服务开机不要自动启动
    
    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  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'"
    ansible 172.16.1.41 -m cron -a "name=oldboy02 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' state=absent"
    ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"
    
    注释定时任务
    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
    ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml
    
    --syntax-check:检测yaml文件的语法。
    -C:预测试,不会改变目标主机的任何设置。
    --list-tasks:列出yaml文件的任务列表。
    --list-hosts:列出yaml文件影响的主机列表。
    --list-tags:列出yaml文件中的标签。
    -t TAGS:表示只执行指定标签的任务。
    --skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。
    --start-at-task=START_AT:从指定任务开始往下运行。
    作业:
    01. nfs服务一键化部署
    02. inotify/sersync软件一键化部署
    
  • 相关阅读:
    1022-哈夫曼编码与译码
    openresty 学习笔记二:获取请求数据
    openresty 学习笔记一:环境安装
    Lua在Windows下的安装、配置、运行
    Django框架中logging的使用
    死磕nginx系列--使用upsync模块实现负载均衡
    死磕nginx系列--nginx 限流配置
    死磕nginx系列--使用nginx做cache服务
    死磕nginx系列--使用nginx做负载均衡
    死磕nginx系列--nginx服务器做web服务器
  • 原文地址:https://www.cnblogs.com/cuiyongchao007/p/12814756.html
Copyright © 2020-2023  润新知