OS  Provisioning:在运维工作中,如果我们要给上百台或者上千台服务器安装操作系统该怎么办?总不能拿着光盘或者U盘一个一个装吧?自动化安装操作系统的软件有:PXE、Cobbler;

    OS  Config:如果我们要在这上百台、上千台服务器上做相同的配置该怎么办呢?又是一件麻烦事,实现这种功能的软件有:cfengine、puppet、chef、saltstack;

    Deployment:能够让我们在若干主机上同时执行某些命令,比如探测主机是否都在线,让自己所管理的主机同时执行‘date’命令等,实现软件:func、fabric;

    ansible:能够帮我们实现OS config+Deployment功能,ansible不需要在被控端安装任何组件,因此不会占用被控端的系统资源,而且也不会在主控端占用系统资源,只是做为一个可执行程序来执行一条命令就可以帮我们完成对若干台主机下指令了,但是ansible没有puppt那么自动,需要我们临时写一些tast list(又称为playbook,剧本);

    ansible的安装配置:

主控端 172.16.254.139
客户端1 172.16.254.140 node1.lyd.com
客户端2 172.16.254.141 node2.lyd.com

  1、使用yum安装ansible,因为ansible会有依赖这些包:python-jinja2 PyYAML python-paramiko python-babel python-crypto,如果光盘中没有这些包,可以去www.pkgs.org搜索下载即可

[root@localhost ~]# yum -y install ansible-1.5.4-1.el6.noarch.rpm

  2、编辑/etc/ansible/hosts文件,在末行模式下使用查找替换注释掉所有事例信息,并手动添加需要控制的客户端主机地址

:%s/^\([^[:space:]#]\)/#\1/g

自动化运维工具ansible_第1张图片

  3、主控端的/etc/hosts文件中要能够解析两台客户端,而且要与客户端建立ssh互信

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

  4、测试ansible能否使用及基本语法

    自动化运维工具ansible_第2张图片

    使用ansible-doc -l 可以查看absible支持哪些模块,“ansible-doc  -s  模块名”可以查看模块有哪些参数可以用,下面介绍比较常用到的几个模块

    copy模块:

        把主控端/root目录下的ansible-1.5.4-1.el6.noarch.rpm程序cp到node1、node2节点上

[root@localhost ~]# ansible all  -m copy -a "src=/root/ansible-1.5.4-1.el6.noarch.rpm dest=/tmp/"

        

    cron模块:

        在两个节点上定义一个计划任务,每隔3分钟到主控端更新一次时间

[root@localhost ~]# ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'

    

    group模块:

        在两个节点上创建一个mysql系统组

[root@localhost ~]# ansible all -m group -a "gid=306 system=yes name=mysql"

       

    yum模块:

        在两台主主机上安装httpd

[root@localhost ~]# ansible all -m yum -a "state=present name=httpd"

    service模块:

        启动两个节点的httpd服务,并让其开机自己启动

[root@localhost ~]# ansible all -m service -a "state=started name=httpd enabled=yes"

    

playbook:

    playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。

 

playbook需要使用YAML语言进行编写,那什么是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表达能力强,扩展性好;

 

使用“ansible-playbook+剧本名”来执行一个编写好的playbook;

    事例:在两个节点上安装heartbeat,并启动

- hosts: webservers
remote_user: root
tasks:
- name: ensure heartbeat latest version
yum: name=heartbeat state=present
- name: authkeys configure file
copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
- name: authkeys mode 600
file: path=/etc/ha.d/authkeys mode=600
notify:
- restart heartbeat
- name: ha.cf configure file
copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
notify:
- restart heartbeat
handlers:
- name: restart heartbeat
service: name=heartbeat state=restarted