zoukankan      html  css  js  c++  java
  • CentOS7下搭建Ansible自动化运维工具,集中管理服务器

    (1).Ansible具有如下特点:

      部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
      默认使用SSH协议对设备进行管理;
      主从集中化管理;
      配置简单、功能强大、扩展性强;
      支持API及自定义模块,可通过Python轻松扩展;
      通过Playbooks来定制强大的配置、状态管理
      对云计算平台、大数据都有很好的支持;

    (2).实验环境

    youxi1  192.168.1.6  Ansible主控端

    youxi2  192.168.1.7  被控端

    youxi3  192.168.1.8  被控端

    (3).在youxi1上部署Ansible,并配置环境变量

      yum安装Ansible需要epel源,安装完成后查看下版本

    [root@youxi1 ~]# yum -y install ansible
    [root@youxi1 ~]# ansible --version
    ansible 2.8.1
      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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
    

      配置Ansible主机清单

    [root@youxi1 ~]# vim /etc/ansible/hosts  //默认全是注释
    [webservers]  //定义模块
    192.168.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
    192.168.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
    [root@youxi1 ~]# ssh root@192.168.1.7    //配置完成后使用ssh先测试一下,要确保不能有yes操作,否则报错。
    The authenticity of host '192.168.1.7 (192.168.1.7)' can't be established.
    ECDSA key fingerprint is SHA256:j3ee8eoTo2XEv0QxCYmxphMipcNRxC+IONPmt1HwRLg.
    ECDSA key fingerprint is MD5:25:e2:b4:08:f2:79:7d:6e:42:84:b5:78:3d:6a:81:20.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.1.7' (ECDSA) to the list of known hosts.
    root@192.168.1.7's password: 
    Last login: Sun Jul 7 23:06:22 2019 from xuefei-pc
    [root@youxi2 ~]# exit
    登出
    Connection to 192.168.1.7 closed.
    [root@youxi1 ~]# ssh root@192.168.1.8  //测试ssh,理由同上
    Connection to 192.168.1.8 closed.
    [root@youxi1 ~]# ansible -i /etc/ansible/hosts webservers -m ping  //最后使用一个简单的ping命令测试一下ansible是否配置正常
    192.168.1.7 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
    }
    192.168.1.8 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
    }
    

      由于Ansible是基于ssh对设备进行管理,所以可以使用秘钥进行访问,以此来优化配置文件。先来做免密登录

    [root@youxi1 ~]# ssh-keygen  //生成秘钥
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    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:aOpFP3BWmgXReDuxqgGZk27LnphjgjLZfJUmcITe/Rw root@youxi1
    The key's randomart image is:
    +---[RSA 2048]----+
    |   .    o+       |
    |  . .   ..+      |
    | . o =   .o+     |
    |  o O ..E=+      |
    |   + o=+So .     |
    |    ++==+        |
    |.+ o.=.oo        |
    |* =++o.  .       |
    |.+o++            |
    +----[SHA256]-----+
    [root@youxi1 ~]# ssh-copy-id root@192.168.1.7  //将秘钥拷贝到192.168.1.7
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    /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.1.7's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@192.168.1.7'"
    and check to make sure that only the key(s) you wanted were added.
    
    [root@youxi1 ~]# ssh-copy-id root@192.168.1.8  //将秘钥拷贝到192.168.1.8
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    /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.1.8's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@192.168.1.8'"
    and check to make sure that only the key(s) you wanted were added.
    [root@youxi1 ~]# ssh root@192.168.1.7  //测试是否可以免密登录
    Last login: Sun Jul 7 23:16:05 2019 from youxi1.cn
    [root@youxi2 ~]# exit
    登出
    Connection to 192.168.1.7 closed.
    [root@youxi1 ~]# ssh root@192.168.1.8
    Last login: Sun Jul 7 23:16:05 2019 from youxi1.cn
    [root@youxi3 ~]# exit
    登出
    Connection to 192.168.1.8 closed.
    

      免密登录做完后,来优化配置文件

    [root@youxi1 ~]# vim /etc/ansible/hosts
    [webservers]  //将原本的配置之留下IP地址(也可以是域名)
    192.168.1.7
    192.168.1.8
    [root@youxi1 ~]# !ansible  //测试,调用最近的ansible开头的命令
    ansible -i /etc/ansible/hosts webservers -m ping  //完整的命令
    192.168.1.8 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
    }
    192.168.1.7 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
    }

    (4).Ansible的使用方法以及常用的选项

      使用方法:ansible <主机模式> [选项]。一般不会定义主机模式。

      常用选项:

    -v,--verbose    详细模式
    -i PATH, --inventory=PATH    指定host文件的路径,默认是在/etc/ansible/hosts
    -f NUM,--forks=NUM    指定fork开启同步进程数的个数,默认为5个。
    -m NAME,-module-name=NAME    指定使用的module,默认使用command
    -a MODULE_ARGS,--args=MODULE_ARGS    指定module的参数
    -k,--ask-pass    提示输入ssh密码,而不是使用秘钥认证
    -b,--become    请求权限升级的用户名,需要和-K选项联合使用
    -K, --ask-become-pass    请求权限升级的用户密码,需要和-b选项联合使用
    -u REMOTE_USER, --user=REMOTE_USER    指定移动端的执行用户
    -C, --check    测试命令执行会改变什么,而不会真正的执行
    

      其中-m选项非常复杂,可以使用ansible-doc命令查看,主要使用的几个选项可以看(6).常见的高级模块

    ansible-doc -l    查看所有module
    ansible-doc -s [MODULE_NAME]    查看指定模块的参数

    (5).实例

      使用ping检查连通性

    [root@youxi1 ~]# ansible -i /etc/ansible/hosts 'webservers' -m ping
    192.168.1.8 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    192.168.1.7 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    [root@youxi1 ~]# ansible 'webservers' -m ping  //如果不指定host文件,默认指向/etc/ansible/hosts文件
    192.168.1.7 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    192.168.1.8 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    

      检查节点运行时间

    [root@youxi1 ~]# ansible 'webservers' -m command -a "uptime"
    192.168.1.7 | CHANGED | rc=0 >>
     21:32:19 up 13 min,  2 users,  load average: 0.00, 0.04, 0.06
    
    192.168.1.8 | CHANGED | rc=0 >>
     21:32:19 up 13 min,  2 users,  load average: 0.00, 0.05, 0.09
    

      检查节点内核版本

    [root@youxi1 ~]# ansible 'webservers' -m command -a "uname -r" 
    192.168.1.8 | CHANGED | rc=0 >>
    3.10.0-957.el7.x86_64
    
    192.168.1.7 | CHANGED | rc=0 >>
    3.10.0-957.el7.x86_64

      查看节点文件系统使用情况并重定向到指定文件

    [root@youxi1 ~]# ansible 'webservers' -m command -a "df -Th" > command-output
    [root@youxi1 ~]# cat command-output
    192.168.1.7 | CHANGED | rc=0 >>
    文件系统                类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root xfs        17G  1.3G   16G    8% /
    devtmpfs                devtmpfs  979M     0  979M    0% /dev
    tmpfs                   tmpfs     991M     0  991M    0% /dev/shm
    tmpfs                   tmpfs     991M  9.6M  981M    1% /run
    tmpfs                   tmpfs     991M     0  991M    0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  133M  882M   14% /boot
    tmpfs                   tmpfs     199M     0  199M    0% /run/user/0
    192.168.1.8 | CHANGED | rc=0 >>
    文件系统                类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root xfs        17G  1.5G   16G    9% /
    devtmpfs                devtmpfs  979M     0  979M    0% /dev
    tmpfs                   tmpfs     991M     0  991M    0% /dev/shm
    tmpfs                   tmpfs     991M  9.6M  981M    1% /run
    tmpfs                   tmpfs     991M     0  991M    0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  133M  882M   14% /boot
    tmpfs                   tmpfs     199M     0  199M    0% /run/user/0

    (6).常用模块

      command模块,也是ansible的默认模块。不指定-m选项时,使用的就是command模块,常见的命令都可以使用,但由于不是通过shell执行的,所以<、>、|、&都是不可以的。当然也不支持管道,没法批量执行命令。

      shell模块,远程命令通过/bin/sh来执行,所以在终端输入的各种命令方式都可以使用。如果自定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,而导致的无法识别,可以在最开始执行加载自定义脚本的语句。例如ansible webservers -m shell -a "source ~/.bash_profile && free -m"。如果待执行语句过多,可以编写脚本通过copy模块传到远端,再执行,但会用到两次ansible,这士就可以使用script模块。

      script模块,在本地编写脚本后,直接使用该模块,可以自动将脚本传到远端并执行,执行完成后删除远端脚本。

      copy模块,将本地文件复制到远端,例如ansible webserver -m copy -a "src=[本地文件地址] dest=[远端目录] owner=[远端所属主] group=[远端所属组] mode=[4位数字权限,例0755]"

      file模块,设置文件属性,例如ansible webservers -m file -a "path=[远端文件地址] mode=[4位数字权限,例0755]"

      stat模块,获取远程文件信息,例如ansible webservers -m stat -a "path=[远端文件地址]"

      get_url模块,实现远程主机下载指定url,例如ansible webservers -m get_url -a "url=[url地址] dest=[远端存放目录] mode=[4位数字权限,例0755] force=yes"。其中force=yes表示当下载文件存在时,如果所下的内容和原目录下的文件内容不一样则替换,如果一样则不下载。另外force=no表示仅目标不存在时才下载。

      yum模块,软件包管理,例如ansible webservers -m yum -a "name=[软件包名] state=[软件包状态]"。其中state有五个可选值,latest、present、installed代表安装;removed, absent代表卸载。

      cron模块,远程主机计划任务(crontab)配置,例如ansible webservers -m cron -a "name='list dir' minute=*/30 job='ls /root'",这是每30分钟查看root目录下文件。

      service模块,远程主机系统服务管理,常用的就是name、state和enabled三个参数,name指定服务名称,state指定服务状态(started、stopped、restarted、reloaded)、enabled设置为yes则开机自启,设置为no则开机不启动。例如ansible webservers -m service -a "name=httpd state=restarted"

      sysctl模块,远程主机sysctl配置。例如ansible webservers -m sysctl -a "name=net.ipv4.ipforward value=1 reload=yes”,此时查看远程主机的/proc/sys/net/ipv4/ip_forward文件内容就是1。

      user模块,远程主机用户管理,例如ansible webservers -m user -a "name=test1 state=present",state表示账户是否应该存在,如果与申明状态不同,则采取措施。

    (7).使用Playbook(剧本)

      没用过,记录一个参考文档吧:https://www.cnblogs.com/bananaaa/archive/2017/12/29/8143345.html

  • 相关阅读:
    【PS】Colorful and flowing word tutorials 彩色流光字教程
    【Language】Popular Javascript Convention on Github
    java 题目
    swift 构造过程
    swift 继承相关
    swift 方法功能
    javascript闭包
    IOS swift学习地址
    guava 工具包
    数字和大写字母字符串
  • 原文地址:https://www.cnblogs.com/diantong/p/11148951.html
Copyright © 2011-2022 走看看