Ansible - 自动化运维工具

概述

本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含:

  • Centos 下的安装
  • 主机配置
  • Ad-Hoc command(命令行执行)
  • Playbook (任务剧本)

Ansible 和 Saltstack 是目前主流的两个自动化运维工具,都可以用于同时对大量主机进行系统配置,应用部署等工作,利用这种集成化的自动运维工具最大的优势在于运维体系结构的持续可维护性。本文先着眼于 Ansible 的基础使用,不会进行太多扩展,通过本文可以快速上手使用 Ansible。

安装

Ansible 的一大特点是 agentless,可以通过 SSH 来对服务器进行管理,意味着只需要将 Ansible 部署到一台服务器。

Ansible 并非一定使用 ssh 来与服务器进行通信,它也支持 ZeroMq 的扩展。事实上,如果不是总要同时对一个庞大主机群进行操作,通过 ssh 进行通信在效率上的损失还是可以接受的。

在 Centos 系统上,Ansible 可以用过 yum 来进行安装,前提是需要 EPEL 的源。

以 Centos7 为例执行下列命令安装 EPEL 源:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

安装 Ansible

yum install ansible

通常情况下,Ansible 可以部署到登录服务器上,登录服务器存放 ssh 私钥,这样在对操作主机群时就无需每次输入密码。

主机配置

Ansible 默认主机配置文件在 /etc/ansible/hosts,你也可以创建新的配置文件来管理主机,如果使用其他主机配置,在执行命令行时就需要通过 -i 参数指定主机配置。

下边是一个主机配置的例子,foo.example.com 这些就是主机的定义,webservers 是主机组的定义,在使用 Ansible 时,可以通过主机组对一组服务器进行操作。

[webservers]
foo.example.com
bar.example.com

Ad-Hoc Command

Ad-Hoc Command 指那些希望立即执行对一组服务器进行操作,而这个操作过程不需要进行保存的方式。例如临时需要对 webservers 这组主机下的 /opt/testfile 文件进行删除,而这种操作是没有必要保存成 Playbook (剧本模式,稍后会说到)的。

$ ansible webservers -m command -a "rm -f /opt/testfile" 

参数 -m 指定使用的功能模块是 command-a 设置模块所需参数队列,对于 command 模块来讲,这个参数就是你需要执行的命令。

事实上,command 模块也有几个参数,当需要指定多个参数时,就需要使用 arg1=value1 arg2=value2 这样的键值对方式指定,当没有指定参数时,在这里实际上使用 command 的是 free_form 参数。

Ansible 默认使用的模块是 command,这意味着上述命令行并不需要显式指定功能模块,可以直接使用下列命令行
ansible webservers -a "rm -f /opt/testfile"

再举个简单的例子,批量文件分发:

$ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"

上述命令将本地 /etc/hosts 分发到 webservers/tmp/hosts

使用 ansible-doc -l 可以查看 Ansible 支持哪些模块,也可以直接前往 这里 去查看。

使用 ansible-doc -s module_name 可以获取模块的使用帮助。

Playbook

Playbook 可以称之为任务剧本,它允许你按照剧本的方式编排需要完成的任务,使用 YAML 的语法格式。

早期,我们可能使用脚本来完成一些流程相对繁多的任务,脚本可以很好的执行,但可读性差。YAML 这种配置性的语法格式则可读性很好,并且对于没有编程基础的运维人员来讲,它也更容易上手。

看一个 playbook 的例子:

---
- hosts: webservers
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

这个简单的例子完成的任务是部署或更新 webservers 这一组主机的 apache。

  • hosts:定义操作的主机组

  • remote_user:使用的用户

  • task:任务步骤,共分为三步:

    • 1 通过 yum 模块确认 apache 是否安装以及是否是最新版本,如果不是则安装或更新;
    • 2 通过 template 模块来设置配置文件,如果配置有更新则通知 handler 重启 apache;
    • 3 通过 service 模块来判断 apache 是否在运行,如果没有则启动 apache。
  • handlers:事件处理,处理任务中的 notify

Playbook 完成后,执行就可以完成对一组服务器的操作

ansible-playbook playbook.yml 

以上就是 Ansible 的基础使用方法,更多的可以去参考 Ansible 的文档。

你可能感兴趣的:(运维)