自动化运维工具——ansible

前言

   我们先来了解一下近年来大多数公司遇到的运维方面的问题:
  1、硬件选型多样化
  2、系统多版本并存
  3、目录结构混乱
  4、运维人员水平参差不齐
  5、历史遗留问题多
  6、同一软件出现多个版本
  7、无法批量化操作
  8、工作效率低,故障率高
  9、项目上线操作繁琐
  然而理想状态是这样的:
  1、只有少数类型的硬件,便于管理
  2、系统版本统一
  3、目录结构规范
  4、运维工程师水平层次高
  5、无历史包袱
  6、同一软件只有单一版本
  7、同一类操作可自动化批量执行
  8、工作效率高,无大量重复机械化操作
  9、开发自己上线,运维比较轻松
  理想很丰满,现实很骨感啊!!!!!!然而,我们还是要面对现实的,现实中我们要做些什么来更接近与理想呢?
  1、添加监控,收集系统指标
  2、对日志进行归档以及管理
  3、数据备份于恢复
  4、对计划任务进行管理
  5、对软件包进行部署和管理
  6、对脚本进行批量执行
  7、对文件进行批量复制和移动
  8、设置文件或者目录对应的权限
  9、关闭和启动服务
  10、对代码程序进行上下线
  但是,要全部完成以上工作也是很难得呀!所以我们还是回到现实来吧!O(∩_∩)O哈哈~~~

  随着公司的发展,现在就需要更多的服务器去支撑,然而出现了一个摆在眼前的问题——要增加那么多台服务,难道要我们one-by-one的去增加和配置?其实这样也是OK的,但是呢,这是一个灰常笨的操作,然而有没有一个快速、方便、简单地做法呢?当然是有的啦!要不然真的要死啦!那么这个简单的方法是什么呢?他就是——ansible,一个自动化的运维工具。接下来我们就来简单地认识一下他呗?这样我们就可以稍稍达到理想状态啦!

ansible是什么

  ansible是新出现的自动化运维工具,基于Python开发,集 合了众多运维工具(puppet、chef、func、fabric)的优 点,实现了批量系统配置、批量程序部署、批量运行命令等 功能。
  ansible是基于 paramiko 开发的,并且基于模块化工作,本 身没有批量部署的能力。真正具有批量部署的是ansible所 运行的模块,ansible只是提供一种框架。ansible不需要在 远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。ansible目前已经已经被红帽官方收购,是 自动化运维工具中大家认可度最高的,并且上手容易,学习 简单。是每位运维工程师必须掌握的技能之一。
  补充一下其他的常用的自动化运维工具:

工具 用途
安装系统 Pxe/cobbler 安装系统
虚拟化系统 Kvm/xen/vmware 虚拟机
应用部署 Puppet/ansible/saltstack 中大型规模
命令执行 Ansible/fabric/func/shell 中小型

他到底有什么神通广大的呢

 1.部署简单,只需要在主控端部署ansible 环境,被控端无需做任何操作。
 2.默认使用ssh协议对设备进行管理。
 3.有大量常规运维操作模块,可实现绝大部分操作。
 4.配置简单、功能强大、扩展性强。
 5.支持API及自定义模块,可通过Python轻松扩展。
 6.通过playbooks来定义强大的配置、状态管理。
 7.提供了一个操作性强的web管理界面和RESET API接口——AWX平台。

他的架构组件

  • Ansible:Ansible核心程序。
  • HostInventory:记录由Ansible管理的主机信息,包括端口、密码 、ip等。
  • Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件 中,定义主机需要调用哪些模块来完成的功能。
  • CoreModules:核心模块,主要操作是通过调用核心模块来完成管 理任务。
  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
  • ConnectionPlugins:连接插件,Ansible和Host通信使用
    自动化运维工具——ansible
                  ansible 架构图

    ansible的管理方式:

      Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad- hoc和playbook:

  • ad-hoc模式使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
  • playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。

    ansible命令的执行过程:

     1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
     2、查找对应的主机配置文件,找到要执行的主机或者组
     3、加载自己对应的模块文件,如command
     4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
     5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
     6、给文件+x执行
     7、执行并返回结果
     8、删除临时py文件,sleep 0退出

    ansible的两种安装方式(yum安装和pip程序安装)

     1使用yum安装

    yum install epel-release -y
    yum install ansible –y

     2 使用pip(python的包管理模块)安装

    pip install ansible
    如果没pip,需先安装pip.yum可直接安装:
    yum install python-pip
    pip install ansible

    接下来它有哪些常用的命令来供我们在工作中方便使用呢

    ansible命令集

  • /usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
  • /usr/bin/ansible-doc # Ansible 模块功能查看工具
  • /usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
  • /usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具
  • /usr/bin/ansible-pull # Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
  • /usr/bin/ansible-vault # Ansible 文件加密工具
  • /usr/bin/ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
    ansible命令格式
     ansible < host-pattern > [-f forks] [-m module_name] [-a args]
     1、Command
     命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在 所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块 实现这些功能)。
    action: command
     chdir # 在执行命令之前,先切换到该目录
    [root@node3 tmp]#ansible webtest -m command -a 'chdir=/tmp/ touch 1205' 

     creates # 一个文件名,当这个文件存在,则该命令不执行,可以 用来做判断

    [root@node3 tmp]#ansible webtest -m command -a 'creates=/tmp/1205 ls'
    172.17.254.224 | SUCCESS | rc=0 >>
    skipped, since /tmp/1205 exists
    172.17.253.210 | SUCCESS | rc=0 >>
    skipped, since /tmp/1205 exists

     executable # 切换shell来执行命令,需要使用命令的绝对路径
     free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
     removes # 一个文件名,这个文件不存在,则该命令不执行,与 creates相反的判断

    [root@node3 tmp]#ansible webtest -m command -a 'removes=/tmp/1205 ls'

     2、Shell
     shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能, 例如管道等 :

    [root@ansiable ~]# ansible webtest -m shell - a ‘cat /etc/passwd |grep “root”’

     3、Copy:复制文件到远程主机,可以改权限等
     (1)复制文件 -a “src= dest= ”
     (2)给定内容生成文件 -a "content= dest= "

    [root@ansiable ~]# ansible webtest -m copy - a ‘content=“hello\nworld” 
    dest=/tmp/test.ansible mode=666’

     相关选项如下:
      backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:  yes|no
     content:用于替代“src”,可以直接设定指定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目 录,那么该路径也必须是个目录
     directory_mode:递归设定目录的权限,默认为系统默认权限
     force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如 果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
     others:所有的file模块里的选项都可以在这里使用
     src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果 路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则 只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全 部复制,类似于rsync。
     4、file设置文件属性
     创建目录:-a “path= state=directory”
     创建链接文件:-a “path= src= state=link”
     删除文件:-a “path= state=absent”
     force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立 的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软 链,有两个选项:yes|no
     group:定义文件/目录的属组 mode:定义文件/目录的权限
     owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径
     recurse:递归设置文件的属性,只对目录有效
     src:被链接的源文件路径,只应用 于state=link的情况
     dest:被链接到的路径,只应用于state=link的情况
     state:
       directory:如果目录不存在,就创建目录
       file:即使文件不存在,也不会被创建
       link:创建软链接
       hard:创建硬链接
       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在, 则更新其最后修改时间
       absent:删除目录、文件或者取消链接文件
     还有其他几种常见命令的使用,这里就不在一一介绍,大家有兴趣的可以看一下ansible官网。

    ansible还有两个重要的应用——playbook和roles。

    1.playbook
      playbook是ansible用于配置,部署,和管理被控节点的剧本。 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状 态。 
      playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点 必须要完成。 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在 Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及 组织计算机处理各种各样的事情。
    playbook的核心元素:

  • Hosts:执行的远程主机列表
  • Tasks:任务,由模块定义的操作的列表;
  • Varniables: 内置变量或自定义变量在playbook中调用
  • Templates:模板,即使用了模板语法的文本文件;
  • Handlers:和nogity结合使用,为条件触发操作,满足条件方才执行,否则不执行;
    下面来个实例看看:
cd /etc/ansible
vim nginx.yml
- hosts: webtest
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=present

  - name: copy nginx.conf
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
    notify: reload

  - name: start service
    service: name=nginx state=started
    tags: startmysql

  handlers:
  - name: reload
    service: name=nginx state=reloaded

  其中主要由一下三个部分组成:
  hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts, hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的 /etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的 时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。
  remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也 可以使用sudo,但是用户必须要有执行相应task的权限。
  tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。 tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必 须的,同时也要给予模块相应的参数。
2.roles
  对于以上所有的方式有个弊端就是无法实现复用假设在同时 部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个 yml文件,很难实现灵活的调用。
  roles 用于层次性、结构化地组织playbook。roles 能够根 据层次型结构自动装载变量文件、tasks以及handlers等。要使用 roles只需要在playbook中使用include指令即可。简单来讲, roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置於单独的目录中,并可以便捷 地include它们的一种机制。角色一般用于基于主机构建服务的场 景中,但也可以是用于构建守护进程等场景中。
  files/:存储由copy或script等模块调用的文件;
  tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml 进行“包含”调用;
  handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由 main.yml进行“包含”调用;
  vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由 main.yml进行“包含”调用;
  templates/:存储由template模块调用的模板文本;
  meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的 文件需要由main.yml进行“包含”调用;
  default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

总结

  以上就是本人对ansible工具的简单理解,如果有什么不正确的地方,欢迎大家指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章