• Ansible介绍与安装


    一.  Ansible 介绍

    Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有saltstack 等批量管理软件.

    Ansible能做什么? 
    ansible可以帮助运维人员完成一些批量任务,或者完成一些需要经常重复的工作。
    比如:同时在100台服务器上安装nginx服务,并在安装后启动服务。
    比如:将某个文件一次性拷贝到100台服务器上。
    比如:每当有新服务器加入工作环境时,运维人员都要为新服务器部署某个服务,也就是说运维人员需要经常重复的完成相同的工作。
    这些场景中运维人员都可以使用到ansible。

    Ansible软件特点?
    ansible不需要单独安装客户端,SSH相当于ansible客户端。
    ansible不需要启动任何服务,仅需安装对应工具即可。
    ansible依赖大量的python模块来实现批量管理。
    ansible配置文件/etc/ansible/ansible.cfg。

    Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。Ansible的两个特性:
    模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;
    playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;

    Ansible 架构

    a.连接插件(connectior plugins) 用于连接主机 用来连接被管理端。
    b.核心模块(core modules) 连接主机实现操作, 它依赖于具体的模块来做具体的事情。
    c.自定义模块(custom modules) 根据自己的需求编写具体的模块。
    d.插件(plugins) 完成模块功能的补充。
    e.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
    f.主机清单(host inventory)定义ansible需要操作主机的范围。

    最重要的一点: ansible是模块化的, 它所有的操作都依赖于模块, 不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端, 不需要服务端(no sever),需要依靠大量的模块实现批量管理, 配置文件 /etc/ansible/ansible.cfg (前期不用配置)。 


    Ansible架构图核心组件说明:

    Ansible:Ansible的核心程序

    Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

    Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

    Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

    Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

    Connection Plugins:连接插件,Ansible和Host通信使用

    二、 Ansible 安装

    环境准备

    1
    2
    3
    4
    5
    IP地址                 主机名               角色           系统版本
    172.16.50.68       ansible-server        主控节点        centos7.5
    172.16.50.65       ansible-node01        受控节点1       centos7.5
    172.16.50.66       ansible-node02        受控节点2       centos7.5
    172.16.50.67       ansible-node03        受控节点3       centos7.5  

     进行主机名修改:命令:hostnamectl set-hostname XXX  (hostnamectl set-hostname ansible-server)

    1
    2
    3
    4
    [root@ansible-server ~]# hostnamectl set-hostname ansible-server
    [root@ansible-node01 ~]# hostnamectl set-hostname ansible-node01
    [root@ansible-node02 ~]# hostnamectl set-hostname ansible-node02
    [root@ansible-node03 ~]# hostnamectl set-hostname ansible-node03

    设置主控节点到受控节点的ssh无密码信任关系 (ansible应用环境下, 主控节点必须要设置ssh无密码跳转到受控节点的信任关系)  

    1
    2
    3
    4
    5
    6
    7
    添加主控节点到受控节点的认证! 首先主控节点必须要生成公私密钥对, 否则不能进行免密信任关系设置!
    [root@ansible-server ~]# ssh-keygen -t rsa                                 //一直回车即可
    [root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.65      //回车, 输入远程登录的密码即可
    [root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.66
    [root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.67
      
    如果受控节点数量比较多的话, 可以使用expect进行远程ssh连接的免密信任关系, 具体可参考: https://www.cnblogs.com/kevingrace/p/5900303.html
    [root@ansible-server ~]# ssh-keygen -t rsa 
    [root@ansible-server ~]# cat fenfa_pub_key.sh  #批量处理
    #!/bin/bash
    
    for ip in {111,112,114,115,116}
    do
        echo "================host 10.192.27.$ip pub-key start fenfa =============="
        sshpass -p123123 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.192.27.$ip "-o StrictHostKeyChecking=no" &>/dev/null
        echo -e "host 10.192.27.$ip fenfa success."
        echo "================host 10.192.27.$ip fenfa end ========================="
    done
    
    [root@ansible-server ~]# bash fenfa_pub_key.sh 
    批量处理验证

    Ansible安装部署  

    Ansible有两种安装方式: yum 和 pip 安装方式。

    1、yum方式安装

    Ansible在epel的yum中有提供,所以配置好epel源,直接使用yum命令安装即可,CentOS系统, 可以使用默认的yum源直接安装ansible。

    1
    2
    3
    4
    5
    6
    7
    [root@ansible-server ~]# yum install -y ansible
       
    配置文件目录:/etc/ansible/
    执行文件目录:/usr/bin/
    Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
    Help文档目录:/usr/share/doc/ansible-X.X.X/
    Man文档目录:/usr/share/man/man1/

    [root@ansible-server ~]rpm -ql ansible | egrep -v "^/usr/(lib|share)"

    /etc/ansible/ansible.cfg #ansible服务配置文件
    /etc/ansible/hosts #主机清单文件 定义可以管理的主机
    /etc/ansible/roles #角色目录

    [root@ansible-server ~]# vim /etc/ansible/hosts 
    ...
    # Here's another example of host ranges, this time there are no
    # leading 0s:
    
    ## db-[99:101]-node.example.com
    172.16.50.65
    172.16.50.66
    172.16.50.67
    172.16.50.68
    
    
    [root@ansible-server ~]# ansible all -a "hostname"
    172.16.50.65 | CHANGED | rc=0 >>
    ansible-node01
    
    172.16.50.66 | CHANGED | rc=0 >>
    ansible-node02
    
    172.16.50.67 | CHANGED | rc=0 >>
    ansible-node03
    
    172.16.50.68 | CHANGED | rc=0 >>
    ansible-server 
    测试一下

    2、pip方式安装  

    1
    2
    # yum -y install python-pip python-devel
    # pip install ansible
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ansible程序文件
    /usr/bin/ansible:  命令行工具
    ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args]
    /usr/bin/ansible-doc: 帮助文档
    /usr/bin/ansible-playbook: 剧本执行工具
    /etc/ansible/ansible.cfg: 主配置文件
    /etc/ansible/hosts: 管理的主机清单
    /etc/ansible/roles: 角色存放处
       
    查看ansible命令帮助
    [root@ansible-server ~]# ansible -h
       
    查看支持的模块
    [root@ansible-server ~]# ansible-doc -l
    [root@ansible-server ~]# ansible-doc -l|grep copy    #查看copy模块
       
    查看ansible的支持的模块个数
    [root@ansible-server ~]# ansible-doc -l |wc -l
    2080
       
    查看ansible版本
    [root@ansible-server ~]# ansible --version
    ansible 2.7.8
      config file /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

     

    linux主机性能变差
      1、top htop 查看cup负载情况
      2、free -h 查看内存负载情况
      3. iotop 查看磁盘负载情况

    ansible服务部署过程总结
    a.安装服务软件
    b.编写主机清单
    c.进行管理测试

     

    ansible服务特点说明
    01.管理端不需要启动服务程序(no server)
    02.管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
    03.受控端不需要安装软件程序
      受控端selinux服务没有关闭---影响ansible软件的管理
      libselinux-python让selinux开启的状态也可以使用ansible程序
    04.受控端不需要启动服务程序(no agent)
    05.服务程序管理操作模块众多(module)
    06.利用剧本编写来实现自动化(playbook)

    三、  Ansible常用命令简述

    语法格式: 
    ansible <pattern_goes_here> -m <module_name> -a <arguments>
    也就是: 
    ansible  匹配模式   -m  模块  -a  '需要执行的内容'

    解释说明: 
    匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.

    -m name, --module-name=name:  指定执行使用的模块。
    -u username, --user=username:  指定远程主机以username运行命令。
    -s, --sudo:  相当于linux系统下的sudo命令。
    -usudo_username, --sudo-user=sudo_username:  使用sudo, 相当于linux系统下的sudo命令。
    -C, --check:  只检查不实际执行。
    -e, 即extra_vars:  引用外部参数。
    -i, 即inventory:  指定仓库列表, 默认/etc/ansible/hosts。
    --list-host:  列出执行主机列。 

    补充说明:ansible执行结果输出的颜色说明
    01.绿色信息:查看主机颜色/对主机未做改动
    02.黄色信息:对主机数据信息做了修改
    03.红色信息:命令执行出错了
    04.粉色信息:忠告信息
    05.蓝色信息:显示ansible命令执行的过程???

    四、Ansible常用模块(23个)

    ping 模块: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。
    raw 模块: 执行原始的命令,而不是通过模块子系统。
    yum 模块: RedHat和CentOS的软件包安装和管理工具。
    apt 模块: Ubuntu/Debian的软件包安装和管理工具。
    pip 模块 : 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements。
    synchronize 模块: 使用rsync同步文件,将主控方目录推送到指定节点的目录下。
    template 模块: 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。
    copy 模块: 在远程主机执行复制操作文件。 
    user 模块 与 group 模块: user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
    service 模块: 用于管理远程主机的服务。 
    get_url 模块: 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)。
    fetch 模块: 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。 
    file 模块: 主要用于远程主机上的文件操作。
    lineinfile 模块: 远程主机上的文件编辑模块
    unarchive模块: 用于解压文件。
    command模块 和 shell模块: 用于在各被管理节点运行指定的命令. shell和command的区别:shell模块可以特殊字符,而command是不支持
    hostname模块: 修改远程主机名的模块。
    script模块: 在远程主机上执行主控端的脚本,相当于scp+shell组合。
    stat模块: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。
    cron模块: 远程主机crontab配置。
    mount模块: 挂载文件系统。
    find模块: 帮助在被管理主机中查找符合条件的文件,就像 find 命令一样。
    selinux模块:远程管理受控节点的selinux的模块





  • 相关阅读:
    poj1228 Grandpa's Estate
    poj1113 Wall
    poj2826 An Easy Problem?!
    poj1269 Intersecting Lines
    poj3304 Segments
    BZOJ3832Rally题解
    BZOJ2802Warehouse Store题解
    李超树详解
    BZOJ4241历史研究题解
    洛谷2050 BZOJ2897美食节题解
  • 原文地址:https://www.cnblogs.com/linux985/p/11264892.html
Copyright © 2020-2023  润新知