ansible的简单应用

一、初识ansible

  • 1、ansible是新出现的自动化运维工具

ansible是一个配置管理和应用部署工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric、SaltStack )的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

  • 2、ansible在生产环境当中的应用
    • 自动化部署应用
    • 自动化管理配置
    • 自动化持续交付
    • 自动化(aws)云服务器管理
  • 3、ansible的优点
    • (1).ansible糅合了众多老牌运维工具的优点,基本上pubbet和saltstack能实现的功能全部能实现;
    • (2).轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
    • (3).ansible是一个工具,ansible不需要启动服务,仅仅只是一个工具,可以轻松的实现分布式扩展;
    • (4).批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
    • (5).ansible是一致性,高可靠性,安全性设计的轻量级自动化工具;
    • (6).使用python编写,维护更简单,ruby语法过于复杂;
  • 4、ansible特性
    • (1)、no agents:不需要在被管控主机上安装任何客户端
    • (2)、no server:无服务器端,使用时直接运行命令即可;
    • (3)、modules in any languages:基于模块工作,可使用任意语言开发模块;
    • (4)、yaml,not code:使用yaml语言定制剧本playbook;
    • (5)、ssh by default:基于SSH工作
    • (6)、strong multi-tier solution:可实现多级指挥
  • 5、ansible的基本架构 (ansible是模块化的 它所有的操作都依赖于模块)
    • 1.connectior plugins (连接插件):用于连接主机,用来连接被管理端
    • 2.core modules (核心模块):连接主机实现操作,它依赖于具体的模块来做具体的事情
    • 3.custom modules (自定义模块):根据自己的需求编写具体的模块
    • 4.plugins (插件):完成模块功能的补充
    • 5.playbooks(剧本):ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
    • 6.host inventory (主机清单):定义ansible需要操作主机的范围
    • 7.架构图
      ansible的简单应用_第1张图片
      ansible架构图.png
    • 8.执行流程
      ansible的简单应用_第2张图片
      ansible执行流程.png

二、安装ansible

  • 1、安装须知
    • ansible只是一个进程:不需要添加数据库也不需要启动和运行守护进程它只是一个进程你可以轻松使用它安装在任何一点主机上面(除了windows)ansible管理机不能安装到windows上面,windows只能被管理。这和saltstack是一样的。
    • 版本的选择:因为2.0有非常大的改进 一般都会使用2.0以上的版本
    • 控制机的要求:因为ansible是python写的 所以需要在安装了python2.6或者2.7以上的python版本才可以安装
    • 管理节点的要求:需要安装ssh python版本在2.5以上
  • 2、三种安装方式 [官网安装方式]
      1. yum -y install ansible wget -O /etc/yum.repos.d/epel.repo 点我下载yum源
      1. pip install ansible
      1. 从github下载
    $ git clone git://github.com/ansible/ansible.git --recursive
    $ cd ./ansible
    $ make rpm
    $ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
    
  • 3、查看版本,证明已经安装成功
    [root@master ~ 19:14:06]# ansible --version
    ansible 2.7.5
      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, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
    

    还可查看出配置文件所在位置:config file = /etc/ansible/ansible.cfg

三、ansible应用

  • 1、需要注意几个文件:
    ①、一个是配置文件(所在位置:/etc/ansible/ansible.cfg)配置文件详解

    Ansible中的某些设置可通过配置文件(ansible.cfg)进行调整。对于大多数用户来说,库存配置应该足够了,但可能有其他原因要更改它们。

    ②、另一个是主机清单inventory(所在位置:/etc/ansible/hosts)。

    既然是批量管理主机,那么就需要有管理对象,主机清单里写的都是被管理的主机,而且可以分组,每组都可以传递指定参数。

    ③、再一个就是自己写的的.yml文件(playbook剧本文件,之后详解)。
  • 2、主机清单 inventory
    • 1,以文件形式配置主机清单,并执行
      [root@master / 22:48:58]#cat /etc/ansible/hosts
      
      [ceshi]   -->【分组,组名】
      10.0.0.11
      10.0.0.13
      10.0.0.14
      
      [ceshi2]   -->【分组,组名】
      10.0.0.15
      10.0.0.16
      10.0.0.17
      
      [ceshi2:vars]   -->【可传一些变量,有一些系统变量,也可以自定义变量】
      ansible_ssh_pass='密码' -->【加上这个就不用输入密码,也不用密钥】
      ansible_ssh_port=22
      ansible_ssh_user='liyonghui'可设置登录用户
      
      [ceshi3]   -->【分组,组名】
      10.0.0.18 ansible_ssh_pass='密码' ansible_ssh_port=22
      10.0.0.19 ansible_ssh_pass='密码' ansible_ssh_port=22
      10.0.0.20 ansible_ssh_pass='密码' ansible_ssh_port=22
      

      列举inventory内置参数:

      ansible_ssh_host # 要连接的主机名
      ansible_ssh_port # 端口号默认是22
      ansible_ssh_user # ssh连接时默认使用的用户名
      ansible_ssh_pass # ssh连接时的密码
      ansible_sudo_pass # 使用sudo连接用户是的密码
      ansible_ssh_private_key_file # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
      ansible_shell_type # shell的类型默认sh
      ansible_python _ interpreter #用来指定 python 解释器的路径,同样可以指定ruby 、perl 的路径
      
      ansible的简单应用_第3张图片
      单命令执行失败和成功样例.png
    • 2,以目录形式配置主机清单,并执行
      [root@master ~/inventory 20:27:29]#ls
      ceshi1  ceshi2
      [root@master ~/inventory 20:31:23]#cat /root/inventory/ceshi1
      10.0.0.11 ansible_ssh_pass='root1234'
      [root@master ~/inventory 20:31:29]#cat /root/inventory/ceshi2
      10.0.0.129 ansible_ssh_pass='1234'
      [root@master ~/inventory 20:31:45]#cd -
      /root
      [root@master ~ 20:32:06]#ansible -i inventory all -a 'uptime' 
      10.0.0.129 | CHANGED | rc=0 >>
      20:32:37 up  2:47,  2 users,  load average: 0.00, 0.00, 0.00
      
      10.0.0.11 | CHANGED | rc=0 >>
      23:32:37 up  2:47,  2 users,  load average: 0.00, 0.01, 0.05
      
    • 3,以文件形式配置主机清单,可用children的形式继承变量
      [ceshi]
      10.0.0.11
      
      [ceshi:vars]  
      ansible_ssh_user='liyonghui'
      
      [ceshi2] 
      10.0.0.17
      10.0.0.18
      
      [ceshi:children]  --> 那么通过继承,ceshi2 组的ansible_ssh_user和 ceshi 组相同
      ceshi2
      
    • 4,动态 inventory(以python脚本的形式执行)

      动态inventory的意思是所有的变量可以从外部获取,也就是说我们可以从CMDB以及zabbix系统拉取所有的主机信息然后使用ansible进行管理。引用inventory只需要把ansible.cfg文件中的inventory定义值改成一个执行脚本即可。

      pass
      
  • 3、连接主机的不同方式

    我们要操作主机,首先得连接主机。如果是批量管理的话,我们肯定不希望每台主机都输入密码。所以,有三种连接方式,可以连接上主机并执行操作:

    • 1,-k指定输入密码。

      执行时:ansible -i /etc/ansible/hosts ceshi -a 'uptime' -k【-k参数指定输入密码】

    • 2,使用密钥。

      密钥认证方式连接:
      生成密钥:ssh-keygen -t rsa(管理机)
      发送密钥:ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] (发送至被管理机)
      执行命令:ansible ceshi2 -a 'date' (不需要密码)

    • 3,在主机清单里配置ansible_ssh_pass='密码'
  • 4、任务执行模式

    ansible系统由控制主机对被管节点的操作方式有两种:Ad-Hocplaybook

    • (1)、Ad-Hoc:单命令模式,可以对多台主机执行单个命令。
      ansible all -a "/bin/echo hello"
    • (2)、playbook:通过多个tasks的集合完成一类功能,如web的安装部署,数据库服务器的批量备份等。
  • 5、ansible命令 (ansible常用模块简介)

    安装完ansible后,ansible为我们提供了多个指令。
    可通过ls /usr/bin/ | grep ansible | grep -v [0-9]查看。
    指令:ansibleansible-docansible-galaxyansible-inventoryansible-playbookansible-pullansible-vaultansible-configansible-connectionansible-console
    通过 “指令 -h” 的方式可获取用法(Usage)。

    • (1)、ansible(单命令,常用)
      [root@localhost ~]# ansible -h 
      Usage: ansible  [options]
      用法: ansible       主机      选项(参数)
      

      ansible是指令核心部分,其主要用于执行Ad-Hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。如:

      [root@master ~ 18:57:10]# ansible 10.0.0.11 -a 'date'
      10.0.0.11 | CHANGED | rc=0 >>
      Mon Jan 21 21:59:50 EST 2019
      

      默认使用的模块是可以在ansible.cfg中进行修改的。ansible命令下的参数部分解释如下链接,通过 ansible -h 也可查看:

      ansible参数说明

    • (2)、ansible-doc (查看帮助文档,常用)
      [root@master /log.txt 19:11:24]#ansible-doc -h
      Usage: ansible-doc [-l|-F|-s] [options] [-t  ] [plugin]
      

      ansible-doc -l (查看可用模块) 特别多,可用grep过滤一下
      ansible-doc -l|grep copy (查看可用的有关 copy 的模块)
      ansible-doc -s 模块名 (查看某个模块的具体用法)

    • (3)、ansible-playbook (多任务,常用,之后详解)
      [root@master /usr/bin 19:21:28]#ansible-playbook -h
      Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
      
    • (4)、ansible-pull(从网上拉下playbook,以供ansible-playbook运行)
      [root@master /usr/bin 19:22:23]#ansible-pull -h
      Usage: ansible-pull -U  [options] []
      
    • (5)、ansible-galaxy (执行各种与roles相关的操作,是一个免费网站,用于查找,下载,评级和审查各种社区开发的Ansible roles)
      [root@master /log.txt 19:15:18]#ansible-galaxy -h
      Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
      
      [root@master ~ 20:01:07]#ansible-galaxy install --help
      Usage: ansible-galaxy install [options] [-r FILE | role_name(s)[,version] | scm+role_repo_url[,version] | tar_file(s)]
      
    • (6)、ansible-inventory
      [root@master /usr/bin 19:18:53]#ansible-inventory -h
      Usage: ansible-inventory [options] [host|group]
      
    • (7)、ansible-vault
      [root@master /usr/bin 19:23:14]#ansible-vault -h
      Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
      

四、playbook详解

  • 详见链接:playbook详解

  • ansible应用实例:ansible应用实例

五、报错解决

  • 在执行过程中,如果报以下错误:

    10.0.0.129 | UNREACHABLE! => {
        "changed": false, 
        "msg": "Failed to connect to the host via ssh: 
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
            Someone could be eavesdropping on you right now (man-in-the-middle attack)!
            It is also possible that a host key has just been changed.
            The fingerprint for the ECDSA key sent by the remote host is
            SHA256:GvppMUVZGPWsH+J4AC9bbHbOyCbCV0ZQMr0QbmHLtmc.
            Please contact your system administrator.
            Add correct host key in /root/.ssh/known_hosts to get rid of this message.
            Offending ECDSA key in /root/.ssh/known_hosts:2
            Challenge/response authentication is disabled to avoid man-in-the-middle attacks.
            Permission denied (publickey,password).
            ", 
        "unreachable": true
    }
    
  • 原因:连接主机的公私钥发生变化,与本机记录的不一致,会报错。

  • 解决:ssh-keygen -R 10.0.0.129 #替换为你的ip或域名

    [root@master /etc/ssh 01:00:30]#ssh-keygen -R 10.0.0.129
    # Host 10.0.0.129 found: line 2
    /root/.ssh/known_hosts updated.
    Original contents retained as /root/.ssh/known_hosts.old
    

六、官网

  • ansible官网
  • ansible中文网
  • ansible配置文件详解
  • ansible所有模块

你可能感兴趣的:(ansible的简单应用)