一. 什么是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 |
节点1 | node1.gulong.com | 172.16.8.5 |
节点2 | node2.gulong.com | 172.16.8.8 |
Ansible服务器 | ansible.gulong.com | 172.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 ''
4、把密钥发往各个节点服务器上:
[root@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected] [root@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected]
四、各个服务器节点的配置
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 后面是参数
2、查看各个节点在线情况
[root@station142 ~]# ansible all -m ping //内建的ping模块
3、在各个节点输出指定信息
[root@station142 ~]# ansible all -a "/bin/echo hello, world"
六、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
看到结果,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
看到结果,ok=2 changed=1 说明客户机上的crontab计划创建成功了!
查看各个节点crontab:
注:
大家可以用 "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的简单应用已经介绍完成,不足之处,请多加指点!