一、Ansible简介

   1、ansible是一款非常轻量级的服务器集中管理软件,它默认采用SSH的方式去管理客户端,也就是省略了客户端程序,这比起很多需要安装客户端程序的软件来说很让人喜欢,我们可以用它的各种模块来实现对客户端的批量管理(执行命令/安装软件/指定计划任务等),对于一些较为复杂的需要重复执行的任务我们可以通过ansible一个叫做playbook的来管理这些任务,在playbook中我们可以使用变量.


   2、命令格式:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]
    -m module:默认为command
ansible-doc: Show Ansible module documentation
    -l, --list            List available modules
    -s, --snippet         Show playbook snippet for specified module(s)


   3、无密码登录:ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。


   4、规划:

       ansible:IP:172.16.12.1        hostname:ansible

       node1:  IP:172.16.12.101      hostname:node1

       node1:  IP:172.16.12.102      hostname:node2



二、安装ansible

     在ansible上安装ansible

       解决依赖关系

[root@ansible yum.repos.d]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

       注意:python-jinja2在centos的第二张光盘上


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

[root@ansible ~]# rpm -ivh ansible-1.5.4-1.el6.noarch.rpm



三、配置ansible

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


[root@ansible ~]# vim /etc/ansible/hosts
//先执行:,%s/\(^[^[:space:]#]\)/#\1/g将其它行全部注释掉
//在最下方添加如下内容
[hanodes]
node1.test.com
node2.test.com


   2、为节点服务器添加本地hosts域名解析

[root@ansible ~]# vim /etc/hosts
//添加如下内容
172.16.12.101  node2.test.com
172.16.12.102  node1.test.com


   3、基于秘钥配置无密码登录,方便管理各节点

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

Ansible的简单应用_ansible


   将公钥传到各节点服务器

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



四、ansible简单测试


   1、查看各个节点的时间

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

Ansible的简单应用_ansible_02



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

[root@ansible ~]# ansible all -m ping

Ansible的简单应用_ansible_03


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

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

Ansible的简单应用_ansible_04



五、ansible-playbook


   1、Playbook是通过yaml文件来配置实现的

   YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。


   YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。

   其特性:

      YAML的可读性好

      YAML和脚本语言的交互性好

      YAML使用实现语言的数据类型

      YAML有一个一致的信息模型

      YAML易于实现

      YAML可以基于流来处理

      YAML表达能力强,扩展性好


更多的内容及规范参见http://www.yaml.org。


   2、,先来介绍下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


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

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

   

大家可以用 "ansible-doc -l" 命令来查看它内置的有哪些模块。
然后利用"ansible-doc  模块名"  命令来查看具体模块的详细用法。

   

   ①、通过定义安装php:

       建立php.yaml文件

       内容如下:

[root@ansible ~]# vim /root/php.yaml
- hosts: hanodes            //指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组
  remote_user: root            //用于指定远程主机上的执行任务的用户
  tasks:                        //任务
    - name: php installing        //    给这个任务起的名字
      yum: name=php state=present        //name=*:利用yum模块,安装软件的包名为php,state=*:状态为安装

   

       执行建立的php.yanl

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

   Ansible的简单应用_ansible_05

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


   

       ②、创建crontab计划

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

           内容如下:    

[root@ansible ~]# ansible-doc cron    //模块帮助命令

[root@ansible ~]# vim /tmp/cron.yaml
- hosts: hanodes
  remote_user: root
  tasks:
    - name: cron
      cron: name='test job' minute='*/5' hour='*' day='*' month='*' weekday='*' job="/usr/sbin/ntpdate 172.16.0.1"

       Ansible的简单应用_ansible_06

   

   查看各个节点上的crontab

[root@ansible ~]# ansible all -a "crontab -l"

   Ansible的简单应用_ansible_07

           

     ③、handlers的用法

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

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

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

       案例:

- hosts: hanodes
  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的简单应用