一. 什么是ansible

   ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。


所有的这几个目标本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。就像我之前有介绍过的Fabric,以及我们基于Fabric开发的自动化应用部署的工具: Essay 。都是做了这么个事——批量的在远程服务器上执行命令 。


    那么fabric和ansible有什么差别呢?简单来说fabric像是一个工具箱,提供了很多好用的工具,用来在Remote执行命令,而Ansible则是提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。这就像是库和框架的关系一样。

    当然,它们之间也是有共同点的——都是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。


相对来说,ansible有如下优点:
1、轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行
3、使用python编写的,维护更简单,ruby语法过于复杂
4、支持sudo


二、安装ansible

实验环境

服务器名域名IP
节点1node1.gulong.com172.16.8.5
节点2node2.gulong.com172.16.8.8
Ansible服务器ansible.gulong.com172.16.8.9


在Ansible服务器上安装Ansible

先解决依赖关系:

# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
//注:python-jinja2在centos的第二张光盘上

安装ansible-1.5.4-1.el6.noarch.rpm

# rpm -ivh ansible-1.5.4-1.el6.noarch.rpm

三、Ansible的配置

1、编辑/etc/ansible/hosts(节点配置文件):

[root@station142 ~]# vim /etc/ansible/hosts
//添加如下内容:
[hanodes]
node1.gulong.com
node2.gulong.com
//其他内容可以全部注释掉


2、修改/etc/hosts文件,使之可以解析另外2个节点

[root@station142 ~]# vim /etc/hosts
//添加以下内容:
172.16.8.8  node2.gulong.com
172.16.8.5  node1.gulong.com


3、配置ansible端能基于密钥认证的方式联系各被管理节点。

[root@station142 ~]# ssh-keygen -t rsa -P ''

wKioL1NRIyfxKjfuAAGNoHrcmsI371.jpg

4、把密钥发往各个节点服务器上:

[root@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@node2.gulong.com
[root@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@node1.gulong.com


四、各个服务器节点的配置

1、节点1的配置,修改主机名

[root@node1 ~]# hostname node1.gulong.com   //及时生效
[root@node1 ~]# vim /etc/sysconfig/network //重启生效
//添加如下内容:
NETWORKING=yes
HOSTNAME=node1.gulong.com


2、节点2的配置,修改主机名:

[root@node1 ~]# hostname node2.gulong.com   //及时生效
[root@node1 ~]# vim /etc/sysconfig/network //重启生效
//添加如下内容:
NETWORKING=yes
HOSTNAME=node2.gulong.com


五、Ansible简单测试

简单格式:ansible  节点名称   [ -m  模块]   -a  命令参数

例子如下:

  1、查看各个节点的时间

[root@station142 ~]# ansible all -a date
[root@station142 ~]# ansible all -m command -a date
//以上两条命令结果是一样的,因为默认调用 command  模块,所以可以省略, all 表示所有节点, -a 后面是参数

wKiom1NSKlHxhuBXAAEIQ8sDm7Y918.jpg


2、查看各个节点在线情况

[root@station142 ~]# ansible all -m ping
//内建的ping模块

wKiom1NSK0yQtXhyAADBy3Dxbf4823.jpg


3、在各个节点输出指定信息

[root@station142 ~]# ansible all -a "/bin/echo hello, world"

wKioL1NSLBLRC1b-AACtq1zqhIY914.jpg


六、Ansible-playbook

1、Playbook是通过yaml文件来配置实现的,先来介绍下yaml语法!

      YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例:

name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age 13
        gender: Female

YAML文件扩展名通常为.yaml,如example.yaml


2、Playbook可以用来管理复杂任务

     对于需反复执行的、较为复杂的任务,我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色 及包含指令来重用既有内容。下面我们来看看一些具体的实例。


1:安装php软件:

建立php.yaml文件

内容如下:

- hosts: hanodes
  remote_user: root
  tasks:
    - name: php installing
      yum: name=php state=present

选项解析:

hosts:hanodes         指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组

remote_user:root         用于指定远程主机上的执行任务的用户

tasks:                         任务

-name:php installing    给这个任务起的名字

yum:name=php           利用yum模块,安装软件的包名为php

state=present                 状态为安装  

state=absent                   状态为卸载


执行这个文件:

[root@station142 ~]# ansible-playbook php.yaml

wKiom1NSO4-RpP9MAAGQbAzwdsw185.jpg

看到结果,ok=2    changed=1 说明客户机上的php安装成功了!


2、创建crontab计划

建立cron.yaml,让每月10号来运行/root/db.sql脚本

内容如下:

- hosts: hanodes
  remote_user: root
  tasks:
    - name: cron
      cron: name='test job' day='10' job="/root/db.sql"


执行这个文件:

[root@station142 ~]# ansible-playbook cron.yaml

wKioL1NSPTaQ2UshAAFpNv5UB6A772.jpg

看到结果,ok=2    changed=1 说明客户机上的crontab计划创建成功了!


查看各个节点crontab:

wKiom1NSPdCC43lXAAEnonBVuJc841.jpg


注:

大家可以用 "ansible-doc -l" 命令来查看它内置的有哪些模块。

然后利用"ansible-doc  模块名"  命令来查看具体模块的详细用法。


3、 handlers的用法

用于当关注的资源发生变化时采取一定的操作。

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。

在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

案例

- hosts: hbhosts
  remote_user: root
  tasks:
    - name: ensure heartbeat latest version
      yum: name=heartbeat state=present  //安装heartbeat
    - name: authkeys configure file
      copy: src=/root/hb_conf/authkeys  dest=/etc/ha.d/authkeys      //copy模块,src为源文件地址,dest为节点目录
     - name: authkeys mode 600
       file: path=/etc/ha.d/authkeys mode=600 //修改文件权限为600
       notify:                     //调用handlers列表中的重启操作
         - restart heartbeat    
     - name: ha.cf configure file
       copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
       notify:             //调用handlers列表中的重启操作
          - restart heartbeat
  handlers:                //定义handlers列表
      - name: restart heartbeat
        service: name=heartbeat state=restarted //重启heartbeat服务


至此,Ansible的简单应用已经介绍完成,不足之处,请多加指点!