zoukankan      html  css  js  c++  java
  • Ansible 自动化运维工具简单入门(一)

    参考该视频制作:http://edu.51cto.com/center/course/user/get-study-course

    一、简介

    Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上

    1、特性

    模块化:

    • 调用特定的模块,完成特定的任务
    • 有paramiko、PyYAML、jinja2三个关键模块
    • 支持自定义模块
    • 基于python语言开发
    • 部署简单就要python和ssh,agentless
    • 安全,基于Openssh
    • 支持playbook编排任务
    • 幂等性:一个任务执行一遍和执行n遍效果一样,不会因为重复执行带来意外情况
    • 无序代理不依赖PKI(无需ssl)
    • 可使用认可编程语言编写模块
    • YAML格式编排任务,支持丰富的数据结构
    • 叫强大的多层解决方案

    2、ansible架构

    3、工作原理

    4、主要组成部分

    1)命令执行来源:

    • ANSIBLE PLAYBOOKS :任务剧本,编排定义ansible任务急的配置文件,有Ansible顺序执行,通常为json格式的YAML文件
    • INBENTORY:Ansible管理主机的清单/etc/anaible/hosts
    • MODULES:Ansible的执行命令的功能模块,多数为内置核心模块,也可以自定义
    • PLUGINS:模块功能补充,比如链接类型插件、循环插件、变量插件、过滤插件等,不常用
    • API:供第三方程序调用的应用程序编程接口
    • ANSIBLE:组合INVENTORY API MODUES PLUGINS的绿框,可以理解为Ansible的命令工具,其为核心执行工具

    2)利用ansible实现管理的方式

    • Ad-Hoc即ansible命令,主要用于临时命令场景
    • ansible-playbook主要用户长期规划好的,大型项目的场景,需要提前规划

    3)Ansile-playbook执行过程

    • 将已有编排好的任务急写入Ansible-playbook
    • 通过ansible-playbook命令分拆任务急至逐条ansible命令,按照预定规则执行

    4)Ansible主要操作对象

    • hosts主机
    • networking网络设备

    5)注意事项

    • 执行ansile的主机一般称为主控端,中控,master或堡垒机
    • 主控端python版本需要2.6以上
    • 被控端python版本需要2.4以上,小于2。4需要安装python-simplejson
    • 被控端如开启selinux需要安装libselinux-python
    • windows端不能作为主控端

    二、部署及配置Ansible

    部署环境介绍:

    主机名 IP 角色 系统
    ansible 172.16.111.6 主控端 CentOS 7.5
    node1 172.16.111.7 被控端 CentOS 7.5
    node2 172.16.111.8 被控端 CentOS 7.5
    node3 172.16.111.9 被控端 CentOS 7.5

    安装方式很多,本次只演示一种安装yum安装

    1、在Ansible主机部署ansble

    [root@ansible ~]# yum install ansible -y
    [root@ansible ~]# rpm -qa ansible
    ansible-2.4.2.0-2.el7.noarch
    [root@ansible ~]# ansible --version
    ansible 2.4.2.0
      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 = /bin/ansible
      python version = 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
    

    2、Ansible功能

    ​ 配置文件或指令

    • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
    • /etc/ansible/hosts 主机清单
    • /etc/ansible/roles/ 存放角色的目录
    • /usr/bin/ansible 主程序,临时命令执行工具
    • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
    • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
    • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
    • /usr/bin/ansible-pull 远程执行命令的工具
    • /usr/bin/ansible-vault 文件加密工具
    • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

    3、编辑hosts连接被控端 hosts

    ​ 配置被控端的主机清单

    [root@ansible ~]# vim /etc/ansible/hosts 
    

    插入下面三行,保存退出

    172.16.111.7
    172.16.111.8
    172.16.111.9
    

    执行命令尝试连接被控端

    [root@ansible ~]# ansible 172.16.111.7 -m ping
    The authenticity of host '172.16.111.7 (172.16.111.7)' can't be established.
    ECDSA key fingerprint is SHA256:e+1rZSlP7YYndeivr7Hjikf3D+Yg9it2KBNxmpjpkQ8.
    ECDSA key fingerprint is MD5:a8:ab:5e:ac:55:e5:d6:fe:bb:1a:9d:41:19:d5:de:7a.
    Are you sure you want to continue connecting (yes/no)?yes
    172.16.111.7 | UNREACHABLE! => {
        "changed": false, 
        "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.111.7' (ECDSA) to the list of known hosts.
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
    ", 
        "unreachable": true
    }
    

    发现此时是使用SSH命令来连接而不是简单的ping,此时无法接通。需要认证用户密码或者key

    [root@ansible ~]# ansible 172.16.111.7 -m ping -k
    SSH password: 
    172.16.111.7 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    

    -k 用户名 通过用户名密码来连接被控端 默认是root

    -m 功能

    解决ssh连接慢的问题 修改/etc/ssh/sshd_config文件内的UseDNS no 和 GSSAPIAuthentication no

    测试连接多个被控端

    [root@ansible ~]# ansible 172.16.111.7,172.16.111.8,172.16.111.9 -m ping -k  或者
    [root@ansible ~]# ansible all -m ping -k
    SSH password: 
    172.16.111.9 | FAILED! => {
        "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
    }
    172.16.111.8 | FAILED! => {
        "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
    }
    172.16.111.7 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    

    此时出现问题 我们写入的顺序是7 8 9 (all代表host内所有主机) 但是读取的顺序是 9 8 7 而且只出现一次输入root密码(只),别的都没提示,所以-k连接只适合连接单个被控端。

    查看可知,该命令只会记住一个host的口令,需要手动ssh连接一次才可以。所以推荐基于key验证实现(后面有介绍)

    [root@ansible ~]# cat .ssh/known_hosts 
    172.16.111.7 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPkK1F+Hc+cQLSP7usLqHbu/hHAUvGc2lUvtHiwKXHLDZZDDR2a5oeVz2xIjkdpl9NTN/dQS0FwqGq8/1BHo23c=
    

    也可以对hosts进行分组

    [root@ansible ~]# vim /etc/ansible/hosts 
    ## db-[99:101]-node.example.com   #支持此种语法
    [web]
    172.16.111.7
    172.16.111.8
    
    [db]
    172.16.111.9
    172.16.111.7
    [app]
    172.16.111.[7:9]
    

    执行验证(已经通过SSH认证过所有被控端)

    [root@ansible ~]# ansible app  -m ping -k
    SSH password: 
    172.16.111.7 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    172.16.111.9 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    172.16.111.8 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    

    连接完成

    4、查看主配置文件ansible.cfg

    [root@ansible ~]# vim /etc/ansible/ansible.cfg 
    [defaults]    默认配置
    
    # some basic default values...
    
    #inventory      = /etc/ansible/hosts    #主机表
    #library        = /usr/share/my_modules/  #库
    #module_utils   = /usr/share/my_module_utils/  #模块
    #remote_tmp     = ~/.ansible/tmp  #命令相关
    #local_tmp      = ~/.ansible/tmp  #命令相关
    #forks          = 5   #并行连接数  
    #poll_interval  = 15  #时间间隔
    #sudo_user      = root  #执行命令的方式可切换到root
    #ask_sudo_pass = True   #口令
    #ask_pass      = True   #口令
    #transport      = smart  #传输方式
    #remote_port    = 22    #远程端口号
    #module_lang    = C
    #module_set_locale = False
    ... ...
    #host_key_checking = False  #检查对应服务器的host_key,建议取消注释.
    #log_path=/var/log/ansible.log #记录日志及位置,默认不记录 建议取消注释
    
    

    修改后保存退出,运行验证

    [root@ansible ~]# rm -f .ssh/known_hosts  #删除之前ssh连接记录的key,进行实验
    [root@ansible ~]# ansible 172.16.111.9  -m ping -k
    SSH password: 
    172.16.111.9 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    [root@ansible ~]# ls /var/log/ansible.log 
    /var/log/ansible.log
    [root@ansible ~]# less /var/log/ansible.log 
    
    2018-10-24 14:04:31,311 p=126499 u=root |  172.16.111.9 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    /var/log/ansible.log 
    
  • 相关阅读:
    HTML与用户的交互 表单
    HTML区块元素与网页布局
    css清除浮动
    gulp 配置前端项目打包
    React Ntive 学习手记
    gulp 配置自动化前端开发
    HTML5调用手机相机拍照
    JQuery 1.8.3对IE9兼容问题getAttribute
    gruntJs篇之connect+watch自动刷新
    360安全浏览器浏览模式调整
  • 原文地址:https://www.cnblogs.com/wlbl/p/9843273.html
Copyright © 2011-2022 走看看